Django+Uwsgi+Nginx部署

Posted cs_1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django+Uwsgi+Nginx部署相关的知识,希望对你有一定的参考价值。

一 uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi, http等协议。 nginx中HttpUwsgiMoule的作用是与uWSGI服务器进行交换

1 WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
2 uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
3 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
3 uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uWSGI的主要特点如下:

超快的性能
低内存占用(实测为apache2的mod_wsgi的一半左右)
多app管理(终于不用冥思苦想下个app用哪个端口比较好了)
详尽的日志功能(可以用来分析app性能和瓶颈)
高度可定制(内存大小限制,服务一定次数后重启等)

二 Uwsgi 安装使用

# Install the latest stable release:
pip install uwsgi
# ... or if you want to install the latest LTS (long term support) release,
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

基本测试

Create a file called test.py:

# test.py
def application(env, start_response):
start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
return [b"Hello World"] # python3
#return ["Hello World"] # python2

运行
uwsgi --http :8000 --wsgi-file test.py


用uwsgi 启动django

uwsgi --http :8000 --module [项目名称.wsgi]
实例:uwsgi --http 0.0.0.0:8080 --chdir /project/CNBlog/ --module cnblog.wsgi

 

可以把参数写到配置文件里

[uwsgi]
socket = 172.16.123.203:9000                        # nginx链接的ip和端口
#http = 172.16.123.203:9000                         # 访问HTTP协议监听IP和端口
# Django-related settings
# the django project directory (full path)
chdir = /project/SchoolInfomationSystem             # 项目根目录
# Django‘s wsgi file
module = SchoolInfomationSystem.wsgi                # django项目下的wsgi文件
# process-related settings
client_max_body_size 75M  
# master
master  = true
# maximum number of worker processes
processes = 4                                        # 开启4个进程(按需更改)
threads = 2                                          # 每个进程开启2个线程
max-requests = 6000                             
#daemonize = /var/log/uwsgi.log                      # 后台启动,并把日志记录到指定文件
# ... with appropriate permissions - may be needed
chmod-socket    = 664
# clear environment on exit
vacuum          = true
        

示例中用的是ini配置文件,如需使用xml配置,请另行百度xml配置文件。更多的参数使用也可以自行百度添加上去

当ini配置文件写好后执行
uwsgi --ini /project/crazye-uwsgi.ini #--ini 表示使用ini配置文件,xml文件就用--xm

常用选项:

http : 协议类型和端口号
processes : 开启的进程数量
workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
chdir : 指定运行目录(chdir to specified directory before apps loading)
wsgi-file : 载入wsgi-file(load .wsgi file)
stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允许主进程存在(enable master process)
daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
pidfile : 指定pid文件的位置,记录主进程的pid号。
vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

三 Nginx的安装和配置

安装 nginx yum install -y nginx 

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。 

        server {
        listen         8099; 
        server_name    127.0.0.1 
        charset UTF-8;
        access_log      /var/log/nginx/myweb_access.log;
        error_log       /var/log/nginx/myweb_error.log;

        client_max_body_size 75M;

        location / { 
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 2;
        }   
        location /static {
            expires 30d;
            autoindex on; 
            add_header Cache-Control private;
            alias /home/fnngj/pydj/myweb/static/;
         }
     }

配置二

        # the upstream component nginx needs to connect to
        upstream django {
            # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
            server 127.0.0.1:8001; # for a web port socket (we‘ll use this first)
        }
         
        # configuration of the server
        server {
            # the port your site will be served on
            listen      8000;
            # the domain name it will serve for
            server_name .example.com; # substitute your machine‘s IP address or FQDN
            charset     utf-8;
         
            # max upload size
            client_max_body_size 75M;   # adjust to taste
         
            # Django media
            location /media  {
                alias /path/to/your/mysite/media;  # your Django project‘s media files - amend as required
            }
         
            location /static {
                alias /path/to/your/mysite/static; # your Django project‘s static files - amend as required
            }
         
            # Finally, send all non-media requests to the Django server.
            location / {
                uwsgi_pass  django;
                include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
            }
        }

listen 指定的是nginx代理uwsgi对外的端口号。

server_name 网上大多资料都是设置的一个网址(例,www.example.com),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。

在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; 注意要和wsgi监听的ip和端口一致
include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。





































以上是关于Django+Uwsgi+Nginx部署的主要内容,如果未能解决你的问题,请参考以下文章

nginx + uwsgi 部署 Django+Vue项目

debian完整部署 Nginx + uWSGI + Django

Django + Uwsgi + Nginx 实现生产环境部署

centos7下部署Django(nginx+uWSGI+Python3+Django)

django+nginx+uwsgi的生产环境部署(Ubuntu16.04)

Django部署——uwsgi+Nginx(超详细)