flyEn'blog

Django项目服务器部署(Nginx+Mysql+Gunicorn+Supervisor)

连接远程服务器

ssh <user>@<远程IP>, 如

1
ssh fhy@192.168.137.115

第一步:项目环境搭建好,能正常运行;
第二步:在项目目录下新建nginx_wsgi.py文件;
第三步:Nginx安装配置;
第四步:Gunicorn安装配置;
第五步:进程管理工具Supervisor安装配置;

wsgi

nginx_wsgi.py添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys
import site
import os

# site-packages
site.addsitedir('/home/nginxuser/.virtualenvs/example/lib/python2.7/site-packages')
# Add the project directory
# sys.path.append('/home/nginxuser/nginxuser')
PROJECT_DIR = '/home/nginxuser/projects/example'
sys.path.insert(0, PROJECT_DIR)
os.environ['DJANGO_SETTINGS_MODULE'] = 'example.settings.prod'
# Activate your virtual env
activate_env = os.path.expanduser("/home/nginxuser/.virtualenvs/example/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

# after activite env
from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

Nginx

安装

1
apt-get install nginx

新建网站运行配置

(# 后文字仅注释)

1
vim /etc/nginx/conf.d/example.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {                                                               
listen 80;
server_name example.com; # 域名
charset utf-8;
client_max_body_size 75M;
access_log /home/nginxuser/projects/example/nginxlogs/access.log;
error_log /home/nginxuser/projects/example/nginxlogs/error.log;

location /static {
alias /home/nginxuser/projects/explame/static; # 项目生成静态文件生成的目录
}

location / {
proxy_pass http://127.0.0.1:8000; # 本地运行端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

检查配置是否有错

1
nginx -t -c /etc/nginx/nginx.conf

修改主配置文件

1
user nginx;

nginx改为系统当前用户名

可以看到,其中有一行是

1
include /etc/nginx/conf.d/*.conf;

就是此行将新建网站配置文件包含进去

检查配置是否有错

1
nginx -t -c /etc/nginx/nginx.conf

启动nginx

1
service nginx start

设置开机自启

1
systemctl enable nginx

Gunicorn

安装

1
pip install gunicorn

项目根目录下添加gunicorn运行配置文件gunicorn.conf.py

1
2
3
4
5
6
import multiprocessing
bind = "127.0.0.1:8000"
workers = 2
errorlog = "/home/nginxuser/example/gunicorn.error.log"
#loglevel = "debug"
proc_name = "gunicorn_example"

启动

1
sudo gunicorn example.nginx_wsgi:application -c /home/nginxuser/projects/example/gunicorn.conf.py

后台运行

1
sudo nohup gunicorn example.nginx_wsgi:application -c /home/nginxuser/projects/example/gunicorn.conf.py&

Supervisor

安装

1
pip install supervisor

创建管理进程配置文件

1
vim /etc/supervisord.d/example.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[program:example]
directory = /home/nginxuser/projects/example ; 程序的启动目录
command = gunicorn nginx_wsgi:application -c /home/nginxuser/projects/example/gunicorn.conf.py ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = nginx ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log
; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/home/nginxuser/.virtualenvs/example/lib/python2.7/site-packages

以上也可直接在主配置文件中直接加

如果启动命令需要在虚拟环境内(workon),可增加environment参数environment=PATH="/home/username/.virtualenvs/myproject/bin"或修改PYTHONPATH(如上配置文件最后注释)

启动

1
supervisord -c /etc/supervisord.conf

如遇到以下报错:

1
2
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
For help, use /use/bin/supervisord -h

可以使用以下命令解决:

1
sudo unlink /var/run/supervisor/supervisor.sock

具体由supervisor.sock所在实际路径决定
可在配置文件/etc/supervisord.conf查看

1
2
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)

命令行客户端工具supervisorctl

1
supervisorctl -c /etc/supervisord.conf

启动后进入supervisorctl的shell,在此shell里可以执行以下命令

1
2
3
4
5
6
status # 查看程序状态
start example # 启动example程序
stop example # 关闭example程序
restart example # 重启example程序
reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
update # 重启配置文件修改过的程序

也可以不进shell执行以上命令

1
2
3
4
5
6
supervisorctl status # 查看程序状态
supervisorctl start example # 启动example程序
supervisorctl stop example # 关闭example程序
supervisorctl restart example # 重启example程序
supervisorctl reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
supervisorctl update # 重启配置文件修改过的程序

开启web管理界面

如果要开启web管理界面,打开/etc/supervisord.conf把下面几行取消注释即可

1
2
3
4
:[inet_http_server]         ; inet (TCP) server disabled by default
:port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
:username=user ; (default is no username (open server))
:password=123 ; (default is no password (open server))

参考地址——http://me.iblogc.com/2016/12/08/%E5%9C%A8centos7%E4%BD%BF%E7%94%A8mysql-nginx-gunicorn+supervisor%E9%83%A8%E7%BD%B2django/

Fork me on GitHub