nginx+uwsgi+supervisor 部署 Django2.x 项目

环境说明

  1. Linux( Ubuntu==18.04 )
  2. Python==3.6.5
  3. Django== 2.1
  4. supervisor==4.0.0.dev0
  5. uWSGI==2.0.17.1

部署前准备工作

生成依赖

1. 生成依赖文件
pip freeze > requirements.txt

代码迁移至服务器

  1. git 方式
  2. PyCharm 代码同步
  3. rz 文件上传
  4. scp
  5. ....

安装 MySQL

apt install mysql-server

如果安装之后没有弹出密码输入框,那么默认可能就是无密码

set password = password('newPassword');
---------------------
flush privileges
---------------------

项目准备工作

创建虚拟环境

https://www.jianshu.com/p/500eb4817e9d

安装项目依赖包

pip install -r  requirements.txt

配置 settings

1. 配置数据库相关
2. 关闭 `DEBUG` 
    1. `DEBUG = False`
3. 设置 `ALLOW_HOST`
    1.  `ALLOWED_HOSTS = ['ip地址']`
4. 设置 `STATIC_ROOT`
    1. `STATIC_ROOT =  os.path.join(BASE_DIR, 'static')`

uwsgi + nginx + supervisord

  1. uwsgi: 用于处理 Python 代码的应用服务器
  2. nginx: 一个 HTTP 服务器, 用来接收用户的请求
  3. supervisord:为了让我们的网站运行更加稳定,在出现nginx或者uwsgi异常退出的时候,supervisord可以让这个服务马上起来。即作为守护进程使用

uwsgi

应用服务器 https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

  1. 安装 sudo pip3 install uwsgi --user(安装当前用户)
  2. 测试
# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    
uwsgi --http :8001 --wsgi-file test.py
  1. 运行
uwsgi --http :8000 --module mysite.wsgi 
uwsgi --http :8000 --chdir /path/to/your/project --module mysite.wsgi 
# http 使用 http 协议, 指定 8000 端口
# chidr 项目路径
# module mysite.wsgi: load the specified wsgi module
  1. Create a file called mysite_uwsgi.ini:
# mysite_uwsgi.ini file

[uwsgi]

# Django-related settings 
# the base directory (full path) 项目路径
chdir           = /path/to/your/project
# Django's wsgi file   wsgi 文件
wsgi-file        = project/wsgi.py
# the virtualenv (full path) # 虚拟环境路径
home            = /path/to/virtualenv

# process-related settings  进程设置
# master 主进程
master          = true
# maximum number of worker processes 最大进程数
processes       = 5
# 线程数
threads         = 4
# http 端口
http            = :8001
# the socket (use the full path to be safe
# socket          = /path/to/your/project/mysite.sock
# socket 权限
# chmod-socket    = 664
socket            = 127.0.0.1:10001
# clear environment on exit  退出的时候清理虚拟环境
vacuum          = true

通过 uwsgi --ini mysite.ini 运行,然后访问 ip地址:8001 正常(无静态版) 即可进行下一步

Nginx

  1. 安装 apt install nginx
  2. 测试是否可用

打开浏览器,输入服务器ip地址,只要出现 Nginx的欢迎界面就表示成功了

  1. 启动/重启/停止/测试
sudo service nginx start
sudo service nginx restart
sudo service nginx stop
sudo service nginx configtest
  1. 配置文件

编写的配置文件位于 /etc/nginx/conf.d/

# mysite_nginx.conf

upstream mysite {
    # server unix:///path/to/your/mysite/mysite.sock;  # for a file socket
    server 127.0.0.1:10001; # for a web port socket (we'll use this first)
}

server {
    # 监听端口    
    listen      80;
    # 服务器域名 ip地址
    server_name example.com; 
    # 编码
    charset     utf-8;
    
    # 文件最大上传
    client_max_body_size 75M;  
    
    # 媒体文件
    location /media  {
        alias /path/to/your/mysite/media;  
    }
    
    # 静态文件
    location /static {
        alias /path/to/your/mysite/static;
    }
    
    # 主目录
    location / {
        uwsgi_pass  mysite;
        include    /etc/nginx/uwsgi_params;
    }
}

写完 nginx 配置文件之后,千万,千万,千万要记得重启 Nginx,然后再执行 uwsgi --ini mysite.ini,之后直接在浏览器上访问ip地址,如果正常访问(带有静态文件) 则表示成功

supervisor

是由 Python 开发的进程管理程序,只能运行在 类Unix系统上,不能运行在任何版本的 Window, 虽然是由Python开发,但是不仅仅是针对 Python 的项目
注:暂时还不支持 Py3 安装

1. 安装
python3 -m pip install git+https://github.com/Supervisor/supervisor
2. 使用

Supervisor 是一套 C/S 架构, 本身就自带了客户端和服务端

supervisord   # 用于启动supervisor服务
supervisorctl  # 用于管理supervisor服务,管理使用supervisor启动的进程
echo_supervisord_conf  # 输出默认配置文件信息
3. 配置文件

写在当前项目的目录下

# mysite_supervisor.conf

# supervisor的程序名字  唯一
[program: djPro]
# supervisor执行的命令
command = uwsgi --ini mysite.ini
# 项目的目录
directory = /path/to/project
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0
# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/path/to/success.log
# 输出的错误文件
stderr_logfile=/path/to/error.log

[supervisord]
# log的级别
loglevel=info

[supervisorctl]
serverurl = http://127.0.0.1:9001
username = admin
password = 666343

[inet_http_server]
port = :9001
username = admin
password = 666343

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

运行

 supervisord -c supervisor.conf  # 启动
<!-- 使用supervisorctl 方式 -->
supervisorctl -c supervisor.conf
> status    # 查看状态
> start program_name # 启动程序
> restart program_name # 重新启动程序
> stop program_name # 停止程序
> reload # 重新加载配置文件
> quit # 退出当前的客户端

uwsgi 错误

1. --- no python application found, check your startup logs for errors ---

这种错误很可能是文件路径写错了,如果之前的 mysite.ini 文件中的 wsgi-file, 所以....

supervisor 错误

1. Error: The directory named as part of the path /path/to/success.log does not exist in section 'program: djPro' (file: 'djPro_supervisor.conf')
(djPro) ➜  djPro supervisord -c djPro_supervisor.conf 
Error: The directory named as part of the path /path/to/success.log does not exist in section 'program: djPro' (file: 'djPro_supervisor.conf')
For help, use /root/.virtualenv/djPro/bin/supervisord -h
# 解决方案
创建日志路径
2. Error: .ini file does not include supervisorctl section
(djPro_beike) pyvip@vip:~/djCourse/djPro_beike$ supervisorctl -c djPro_beike_supervisor.con
Error: .ini file does not include supervisorctl section
For help, use /home/pyvip/.virtualenvs/djPro_beike/bin/supervisorctl -h
#  解决方案   在配置文件中加上 
[supervisorctl] # 仅仅加上这个也会报错 看下条
3. http://localhost:9001 refused connection
# 解决方案
[inet_http_server]
port = :9001
username = admin
password = 666343
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容