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

uwsgi介绍

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

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

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

 

uwsgi性能非常高

 

uWSGI的主要特点如下

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

 

Uwsgi 安装使用

#安装最新的稳定版本:
pip install uwsgi
# ... 或者如果您想安装最新的LTS(长期支持)版本,
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

基本测试

创建一个名为 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 mysite.wsgi

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

[root@centos:]#  cat crazye-uwsgi.ini
 
 
[uwsgi]
http = :9000
# the local unix socket file than commnuincate to Nginx
socket = 127.0.0.1:8001
# 项目目录(完整路径)
chdir = /opt/CrazyEye
# Django  wsgi 文件
wsgi-file = /opt/CrazyEye/CrazyEye/wsgi.py 
# 最大工作进程数
processes
= 4
# thread numbers startched
in each worker process
threads
= 2
# 监控uwsgi状态
stats
= 127.0.0.1:9191
#
clear environment on exit
vacuum
= true
# 设置pid文件
pidfile = /opt/CrazyEye/uwsgi.pid

# 设置日志目录
daemonize= /opt/CrazyEye/uwsgi.log
 

启动

uwsgi -ini crazye-uwsgi.ini

重启

uwsgi --reload /opt/CrazyEye/uwsgi.pid

停止

uwsgi --stop /opt/CrazyEye/uwsgi.pid

 

 

Nginx安装使用  

[root@lb-node1 ~]# useradd -s /sbin/nologin -M www
[root@lb-node1 ~]# cd /usr/local/src/
[root@lb-node1 src]# wget http://nginx.org/download/nginx-1.15.8.tar.gz
[root@lb-node1 src]# tar xf nginx-1.15.8.tar.gz
[root@lb-node1 src]# cd nginx-1.15.8
[root@lb-node1 nginx-1.10.2]# ./configure --prefix=/usr/local/nginx-1.15.8 \
--user=www --group=www --with-http_ssl_module \
--with-http_stub_status_module --with-file-aio --with-stream
[root@lb-node1 nginx-1.10.2]# make && make install
[root@web-node1 ~]# ln -s /usr/local/nginx-1.15.8/ /usr/local/nginx
## 测试配置并启动Nginx
[root@lb-node1 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.15.8/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.15.8/conf/nginx.conf test is successful
[root@lb-node1 ~]# /usr/local/nginx/sbin/nginx

为你的项目生成Nginx配置文件

您将需要uwsgi_params文件,该文件位于uWSGI发行版的nginx目录中,或者来自https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

将其复制到项目目录中。 稍后我们将告诉nginx引用它。

现在创建一个名为mysite_nginx.conf的文件,并将其放入其中:

# mysite_nginx.conf
 
# 上游组件nginx需要连接
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # 用于文件套接字
    server 127.0.0.1:8001; # 用于Web端口套接字(我们将首先使用它)
}
 
# 服务器的配置
server {
    # 您的网站将被开放的端口
    listen      8000;
    # 它将服务的域名
    server_name .example.com; # 替换您机器的IP地址或FQDN
    charset     utf-8;
 
    #最大上传大小
    client_max_body_size 75M;   # adjust to taste
 
    # Django media
    location /media  {
        alias /opt/CrazyEye/media;  # 您的Django项目的媒体文件 - 根据需要进行修改
    }
 
    location /static {
        alias /opt/CrazyEye/static; # 您的Django项目的静态文件 - 根据需要进行修改
    }
 
    # 最后,将所有非媒体请求发送到Django服务器。
    location / {
        uwsgi_pass  django;
        include     /usr/local/nginx/conf/uwsgi_params; # 您安装的uwsgi_params文件
    }
}

部署静态文件

在运行nginx之前,您必须收集静态文件夹中的所有Django静态文件。 首先你需要编辑mysite/settings.py添加:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后运行

python manage.py collectstatic

此时启动Nginx 和Uwsgi,你的django项目就可以实现高并发啦!

posted @ 2018-12-29 15:42  py哥  阅读(389)  评论(1编辑  收藏  举报