django+nginx+uwsgi线上服务器部署web

uWSGI

uwsgi是协议,uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

django默认是支持uwsgi协议的,在我们的项目配置目录里面,默认就有一个wsgi.py配置文件。

nginx + uWSGI

nginx是一个强大的代理服务器,我们可以将我们的python请求交给uWSGI服务器去处理,而静态文件它自己就能处理。

所以我们在配置uWSGI的时候,主要是通过反向代理来实现的,nginx配置文件如下:

server
{
    listen 80;
    listen 443 ssl http2;
    server_name www.wrlod.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.wrlod.com/web/blog/;

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/www.wrlod.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/www.wrlod.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497  https://$host$request_uri;

    #SSL-END

    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END

    #PHP-INFO-START  PHP引用配置,可以注释或修改
    #清理缓存规则

    location ~ /purge(/.*) {
        proxy_cache_purge cache_one $host$1$is_args$args;
        #access_log  /www/wwwlogs/www.wrlod.com_purge_cache.log;
    }
    #PROXY-START/

    location /
    {
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;

        add_header X-Cache $upstream_cache_status;

        #Set Nginx Cache
        add_header Cache-Control no-cache;
        expires 12h;
    }

     location ~ ^/(static)/ {
        root /www/wwwroot/www.wrlod.com/web/blog;
    }

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/www.wrlod.com.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    access_log  /www/wwwlogs/www.wrlod.com.log;
    error_log  /www/wwwlogs/www.wrlod.com.error.log;
}

在上面的配置中,ssl_certificate是用来配置https服务的。

proxy_pass http://127.0.0.1:8888; 进行反向代理,也就是我们的uWSGI服务器需要启动监听8888端口来进行django项目运行。 uWSGI服务器配置文件如下:

[uwsgi]
master = true
processes = 1
threads = 2
chdir = /www/wwwroot/www.wrlod.com/web/
http = 0.0.0.0:8888
logto = /www/wwwroot/www.wrlod.com/web/logs/error.log
chmod-socket = 660
vacuum = true
master = true
max-requests = 1000
[uwsgi]
http = :8000 # 服务器地址和端口
chdir = xxxx # django代码的根目录
home = xxxx # virtualenv的目录
env = DJANGO_SETTINGS_MODULE=xxxx #使用settings
wsgi-file = xxx/wsgi.py #wsgi.py的路径,wsgi.py是通过startapp创建的
processes = 2 # worker的数量
threads = 2 # 每个worker的线程数
daemonize=xxxx/xxxx.log #log文件
pidfile=xxx/xxxx.pid #pid文件,用来控制uwsgi的reload和stop

其中chdir是我们的django项目根目录。

 location ~ ^/(static)/ {
        root /www/wwwroot/www.wrlod.com/web/blog;
    }

上面的语句实现了对静态文件的目录指定,如果我们的静态文件放在了其它路径,这里对应配置即可。