本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题。所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工作,是接下来需要讨论的问题。

 

  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。现在主流的网页也是采用nginx的方式,比如百度,淘宝,京东,新浪等互联网巨头。而跟nginx进行交互的是uWSGI,uWSGI是一个Web服务器,支持WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。所以将Django部署到Nginx+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的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理
  4. 详尽的日志功能(便于分析分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

uWSGI的安装使用:

  


# 稳定版
pip install uwsgi
# 最新开发板
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz


 

测试是否安装成功:


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


在命令行中输入


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


启动测试程序,--http为通信协议,8000为端口好 test.py为待测试文件

  

 

使用uWSGI启动Django,记住路径一定要在项目根目录下,module的名字也必须跟项目名字一样。


uwsgi --http :8000 --module mysite.wsgi

 

使用vim新建uwsgi.ini配置文件,内容为:


http = :9000
#socket端口
socket = 127.0.0.1:8001
# 项目根目录
chdir = basedir# Django's wsgi file文件目录即django中wsgi.py的位置
wsgi-file =# 最大进程数
processes = 4
#最大线程数
threads = 2
 
#监控进程
stats = 127.0.0.1:9191
# 清除环境变量
vacuum          = true



最后可以通过使用 uwsgi uwsgi.ini

 

可以看到其实uwsgi已经能够实现网页响应的功能,但是不如Nginx稳定和主流,那么我们接下来看看Nginx的使用方法。

Nginx的安装:


sudo apt-get install nginx
sudo /etc/init.d/nginx start    # start nginx


在项目根目录下创建一个以nginx结尾的配置文件: vim project_name-nginx.conf

# project_name_nginx.conf
 
# 将所有过来的请求转发到指定地址
upstream django {
    server 127.0.0.1:8001; #创建网页访问端口
}
 
# 配置主机
server {
    # 监听端口
    listen      8000;
    # the domain name it will serve for
    server_name .example.com; 
    charset     utf-8;
 
    # 最大上传文件大小
    client_max_body_size 75M;   # 一般够用
 
    
    location /media  {
        alias /path/to/your/mysite/media;  #  Django  media 文件路径 
    }
 
    location /static {
        alias /path/to/your/mysite/static; #  Django 的static 文件路径
    }
 
    # 将所有的非media请求发送到Djangp中
    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # uwsgi_params 文件应在项目根目录中创建
    }
}


完成后使用 sudo ln -s ~/项目根目录/mysite_nginx.conf /etc/nginx/sites-enabled/

 

在djangp setting中末尾加一句程序: STATIC_ROOT = os.path.join(BASE_DIR, "static/") 然后再使用 python manage.py collectstatic

 

最后同时启动uwsgi(uwsgi uwsgi.ini)和nginx(/etc/init.d/nginx restart)就可以使python的Django顺利运行再Nginx上了,可实现高并发的请求功能,稳定性比Django高很多。