django开发环境部署(四)——uwsgi,nginx

django开发环境部署(四)——uwsgi,nginx

  1. python自带的轻量级的web服务器只能是用来本地测试,到了生产环境必须使用更为强大的web服务器,这里我使用的是nginx,那么python应用要和nginx进行交互就必须利用一个桥梁和nginx通信,这里截取51CTO开发频道python应用部署部分内容,python的应用部署比php略显麻烦,

  2. 常见的部署方法有:
    fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务通信
    wsgi:利用http服务的mod_wsgi模块来跑各个project。

  3. 无论哪种都很麻烦,apache的mod_wsgi配置起来很麻烦,内存占用还大,如果要加上nginx作为静态页面的服务器那就更麻烦了;我的应用基本上到后来都是是各个project各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的project和繁忙的project同样需要占用内存。

uwsgi介绍

这里开始真的混乱了好久,一直没分清uwsgi,uWSGI

  • WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that),翻译过来大致是:WSGI是一种Web服务器网关接口。它是一个Web服务器与应用服务器通信的一种规范

  • 关于WSGI看这里:WSGI

  • 关于uwsgi看这里:uwsgi

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

  • uwsgi:于WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

  • uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

2.uwsgi据说改进性能之后大约是fcgi协议的10倍那么快,有个比较见下图:

 

NewImage

2.uWSGI的主要特点如下:

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

部署环境中nginx作为前端响应web请求和处理静态请求,其余非静态请求通过uwsgi传递给django。安装参考了Django中国社区的这篇文章

uwsgi+nginx+django

系统环境

Distribution : CentOS 6.5 minimal 
uwsgi version : 2.0.4
Python version : 2.7
Web Server : Nginx 1.6
Init system : sysvinit

安装步骤

- 安装系统(略) 
- pip、django
- 安装uwsgi、测试uwsgi
- 配置django连接uwsgi
- 配置uwsgi,nginx
- 实现nginx + uwsgi + django

step1:安装uwsgi,测试uwsgi

#django的安装前几篇文章也有,这里再centos下安装pip也很简单,uwsgi也可以通过pip来安装 
yum -y install libevent-devel python-devel
yum -y install python-pip pip install uwsgi

#测试uwsgi是否能独立启动
#本地创建一个test.py文件,内容如下
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"

#独立启动uwsgi,测试是否可以成功
uwsgi --http :8001 --wsgi-file test.py
\\这条命令打开了本地8001端口进行监听,http访问即可看到Hello World,表明独立启动uwsgi成功

step2:配置django连接uwsgi

1.新建一个django project,runserver测试正常启动即可,然后确定关闭django程序关闭

2.新建uwsgi配置文件

#!/usr/bin/env python 
# coding: utf-8
import os
import sys
# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tryfirst.settings")

from django.core.handlers.wsgi
import WSGIHandler application = WSGIHandler()

2.#这时候利用uwsgi启动服务,访问8000端口是否能看到django应用的界面

uwsgi —http :8000 —chdir /home/src/sites/mysite —module django_wsgi 
\\注意chdir路径是我本地的django项目测试地址

到了这里成功的话利用uwsgi单独启动django应用就没有问题了,下一步让uwsgi和nginx实现通信,作为桥梁,就可以实现我们的目的了

step3:uwsgi的一些参数和调优建议

详细介绍请查看uwsgi文档:http://uwsgi-docs.readthedocs.org/en/latest/Options.html

#并发四个线程 
uwsgi -s :9090 -w mysite -p 4

#主控线程+4个线程
uwsgi -s :9090 -w mysite -M -p 4

#执行超过30s的client直接放弃
uwsgi -s :9090 -w mysite -M -p 4 -t 30

#限制内存空间
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128

#服务超过10000个request自动respawn
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128 -R 10000

#后台运行
uwsgi -s :9090 -w mysite -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log



step4:配置uwsgi连接nginx

安装nginx,这里略,上面是通过命令行启动uwsgi,线上肯定是使用配置文件。我们让nginx和uwsgi通信使用socket来进行通讯,所以注意使用的通信端口没有被其他程序占用即可

1、新建django_socket.xml,内容如下


 
  
 
   
   
:8000
/home/src/sites/mysite/
django_wsgi
4
uwsgi.log

2、nginx核心配置如下

server { 
listen 80;
server_name 192.168.122.136;
access_log /home/ms/mysite/access.log;
error_log /home/ms/mysite/error.log;

location / {
include uwsgi_params; #这个模块编译好的位置再/etc/nginx/下
uwsgi_pass 127.0.0.1:8000;
}

# error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
# error_page 500 502 503 504 /50x.html;

location = /50x.html {
root html;
}

# location /static/ { #这里我只是作为演示我注释掉了静态资源,如果实际部署需要打开,下面同理
# alias /home/work/src/sites/testdjango1/testdjango/collectedstatic/;
# index index.html index.htm;
# }

# location /media/ {
# alias /home/work/src/sites/testdjango1/testdjango/public/media/;
# }
}

3、启动nginx,以配置文件方式启动uwsgi,检查端口和进程是否能正常

nginx -s reload 
uwsgi -x /home/src/sites/mysite/django_socket.xml
\\全部正常之后就可以尝试访问nginx的域名进行访问,看是否能看到django运行的页面了

step5:uwsgi的启动关闭脚本

这部分是可选的,但是一旦投入线上使用,每次都使用命令行很显然是不切实际的,所以编写成类似于独立启动的服务脚本,方便启动和关闭uwsgi

你可能感兴趣的:(nginx,django,uwsgi)