uwsgi部署

摘要

Django框架运行依赖wsgi(本质提供socket服务端),众多模块实现了wsgi规范,而django框架中默认使用wsigiref模块来实现,他由于性能比较低,所以用于本地开发和测试,而线上部署时需要使用uwsgi来代替。

uwsgi

1
2
# 需要先安装:yum install python-devel
pip3 install uwsgi

单文件使用

1
2
3
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]

启动Web服务器:

1
2
3
uwsgi --http :9001 --wsgi-file app.py
# 或
uwsgi --http :9002 --wsgi-file foobar.py --master --processes 4

PS: flask需要再加 –callable app

django程序使用uwsgi

将开发好的django程序拷贝到服务器目录【同示例一】,即:/data/oldboy ,执行命令启动:

1
uwsgi --http :9005 --chdir /data/xxx/ --wsgi-file xxx/wsgi.py --master --processes 4

使用配置文件启动

创建配置文件 oldboy.ini

1
2
3
4
5
6
[uwsgi]
http = 0.0.0.0:9005
chdir = /data/xxx/
wsgi-file = xxx/wsgi.py
processes = 4
static-map = /static=/data/xxx/allstatic

根据配置文件启动uwsgi

1
uwsigi --ini  xxx.ini

PS: 如果有虚拟环境可以添加上虚拟环境路径配置: virtualenv = /env/xxx_venv

此时访问时,会出现找不到静态文件的错误。

想要uwsgi处理静态文件,需要先将django的静态文件收集到制定目录,然后再设置对应关系。

  • 收集django静态文件
    • 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR,”allstatic”)
    • 执行 python3 manage.py collectstatic 命令,至此django项目所有相关静态文件都会收集到制定目录。
  • 设置uwsgi静态文件对应关系
    • uwsgi –http :9005 –chdir /data/xxx/ –wsgi-file xxx/wsgi.py –master –processes 4 –static-map /static=/data/xxx/allstatic

nginx

利用Nginx做反向代理、负载均衡以及处理静态文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
user root;
worker_processes 4;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}


http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

include /etc/nginx/mime.types;
default_type application/octet-stream;

upstream django {
server 127.0.0.1:8001;
# server 192.1.123.1;
}
server {
listen 80;

charset utf-8;

# max upload size
client_max_body_size 75M;

location /static {
alias /data/oldboy/allstatic;
}

location / {
uwsgi_pass django;
include uwsgi_params;
}
}
}

确保nginx配置文件目录下有uwsgi_params文件(默认)

配置uwsgi

为了确保让所有请求均通过80端口来访问网站,将uwsgi的配置文件修改为:

1
2
3
4
5
6
[uwsgi]
socket = 127.0.0.1:9005
chdir = /data/xxx/
wsgi-file = xxx/wsgi.py
processes = 4
logto = /tmp/xxx.log

启动uwsgi和nginx

1
2
3
uwsgi --ini /data/oldboy/oldboy.ini &

/etc/init.d/nginx start

supervisor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

[program:xxx]
command=/usr/local/bin/uwsgi /data/oldboy/xxx.ini ;命令
priority=999 ; 优先级(越小越优先)
autostart=true ; supervisord启动时,该程序也启动
autorestart=true ; 异常退出时,自动启动
startsecs=10 ; 启动后持续10s后未发生异常,才表示启动成功
startretries=3 ; 异常后,自动重启次数
exitcodes=0,2 ; exit异常抛出的是0、2时才认为是异常
stopsignal=QUIT ; 杀进程的信号
stopwaitsecs=10 ; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程
user=chrism ; 设置启动该程序的用户
log_stdout=true ; 如果为True,则记录程序日志
log_stderr=false ; 如果为True,则记录程序错误日志
logfile=/var/log/cat.log ; 程序日志路径
logfile_maxbytes=1MB ; 日志文件最大大小
logfile_backups=10 ; 日志文件最大数量