uwsgi+nginx部署Django

安装uwsgi

  • pip3 install uwsgi

测试

  • 创建一个test.py文件
    1
    2
    3
    def application  env,start_response ):
    start_response '200 OK'[('Content-Type','text / html' )])
    return [ b “Hello World” ] #python3
  • 运行测试(前台运行)
    1
    2
    3
    4
    5
    6
    uwsgi --http:8080 --wsgi-file test.py  
    # 说明 --http :8080 使用http协议 端口8000 --wsgi-file test.py 加载指定文件
    # 如果出现HelloWorld说明可用

    # 如果出现--- no python application found, check your startup logs for errors —错误,说明python版本有多个,而你的uwsgi不是装在默认的那个python里,所以可以在虚拟机里创建一个只有一个python的环境启动,或者在/etc/profile里把python路径改成安装uwsgi的python路径
    # 访问不了,还有可能是服务器没有开放8000端口,比如阿里云是默认关闭8000端口的,去开启即可

项目测试

  • 测试项目正常启动
    • python3 manage.py runserver 0.0.0.0:8080
  • 用uwsgi测试项目是否正常
    • uwsgi --http :8000 --chdir /home/mysite --home /home/mysite_env --module mysite.wsgi:application

安装Nginx

  • yum install 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
user root; 
# 与登录名一致
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

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;
types_hash_max_size 2048;

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

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;

# include /etc/nginx/default.d/*.conf;

# 前端VUE目录
location / {
root /home/www/;
index index.html index.htm;
try_files $uri $uri/ @router;
}
location @router {
rewrite ^.*$ /home/www/index.html last;

}
# 后端项目端口
location /api {
uwsgi_pass 127.0.0.1:8080;
include uwsgi_params;
## 默认安装后uwsgi_params与配置文件同级,注意检查
}

# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root html;
# }
}



}

前端静态文件由Nginx直接处理,后端api服务由Nginx代理转发通过uwsgi

项目文件中创建uwsgi配置文件,mysite_uwsgi.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
[uwsgi] 
chdir = /home/mysite # 你的项目目录
home = /home/mysite_env # 如果有虚拟环境,则需要指定虚拟环境目录; 没有则注释掉
module = mysite.wsgi:application # 指向自己Django项目目录下mysite目录下的wsgi文件
master = True
processes = 4 # 使用进程数
harakiri = 60 # 最大超时时间
max-requests = 5000 # 最大请求数,到了后就会自动重启
socket = 127.0.0.1:8001 # socket连接地址和端口,和之前nginx配置一致
pidfile = /home/mysite_uwsgi/master.pid # 在失去权限前,将pid写到指定的pidfile文件中
daemonize = /home/mysite_uwsgi/mysite.log # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
# chmod-socket = 664 # 如果没有权限访问uWSGI的socket,这里可以设置权限
vacuum = True # 服务退出或重启,自动删除pid和socket文件

部署时删除注释,实测注释会影响配置

后台运行uwsgi

  • uwsgi -d --ini mysite_uwsgi.ini
  • 这里要注意uwsgi安装目录,如果是启动虚拟环境后再使用pip安装的,在虚拟环境目录的bin目录下
  • 如果直接pip安装,未启动虚拟环境,在Python根目录的bin文件夹下

uwsgi其他操作

  • nginx测试配置是否正确命令:nginx -t
  • 查看uwsgi进程:ps -aux | grep uwsgi
  • 正常关闭uwsgi进程:uwsgi --stop /home/mysite_uwsgi/master.pid 这里的pid路径为配置文件设置
  • 强制关闭全部uwsgi进程:ps -aux | grep uwsgi |awk '{print $2}'|xargs kill -9
  • 重新加载uwsgi:uwsgi --reload /home/mysite_uwsgi/master.pid

注意:热更新前端文件不需要重启nginx,热更新后端文件需要重启/重加载uwsgi

参考文档

my——uwsgi

1
2
/root/src/water/.venv/bin/uwsgi --stop /root/src/water_uwsgi/master.pid
/root/src/water/.venv/bin/uwsgi -d --ini /root/src/water/water/water_uwsgi.ini
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信