在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。
NOTE:不使用nginx,只使用uwsgi+django也是可以实现WEB服务的。uwsgi也可以直接处理WEB请求。
为了完成上述的方式部署,我将分成两篇文章来分别进行阐述。
-
第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。
-
第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。
安装uwsgi
1.安装pip
可以参考这篇文章:http://www.jsxubar.info/install-pip.html
2.安装uwsgi
$ export LDFLAGS="-Xlinker --no-as-needed" $ pip install uwsgi
测试uwsgi
在你的机器上写一个test.py
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
访问网页:
看在网页上是否有Hello World
配置django
NOTE:
请保证你的django项目是正常使用的。可以使用
python manage.py runserver 0.0.0.0:8002
来测试一下你的django项目是否能正常跑起来。
请保证你的django程序已经关闭。
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。
注意: 编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/env python # coding: utf-8 import os import sys # 将系统的编码设置为UTF8 reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler() |
连接django和uwsgi,实现简单的WEB服务器。
我们假设你的Django项目的地址是/home/work/src/sites/testdjango1/testdjango/mysite,
然后,就可以执行以下命令:
uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi
这样,你就可以在浏览器中访问你的Django程序了。所有的请求都是经过uwsgi传递给Django程序的。
配置uWSGI
在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,我们是直接使用命令行来启动uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。我的一般做法是用命令行来测试是否uWSGI安装成功,然后用配置文件来真正部署。
另外,为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式。
在本节中,我们将使用uWSGI配置文件的方式来改进uWSGI的启动方式。
假定你的程序目录是 /home/work/src/sites/testdjango1/testdjango/mysite
我们将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。
注意,请确定你在上一节《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中的django_wsgi.py文件已经存在了。
新建一个XML文件:
djangochina_socket.xml,将它放在 /home/work/src/sites/testdjango1/testdjango/mysite 目录下:
<uwsgi> <socket>:8077</socket> <chdir>/home/work/src/sites/testdjango1/testdjango/mysite</chdir> <module>django_wsgi</module> <processes>4</processes> <!-- 进程数 --> <daemonize>uwsgi.log</daemonize> </uwsgi>
或者ini文件
[uwsgi] socket= 127.0.0.1:8077 chdir= /home/work/src/sites/testdjango1/testdjango/mysite module= django_wsgi processes= 4 <!-- 进程数 --> daemonize= uwsgi.log
在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。
这样,我们就配置好uWSGI了。
配置Nginx
我们假设你将会把Nginx程序日志放到你的目录/home/work/var/test/logs/下,请确保该目录存在。
我们假设你的Django的static目录是/home/work/src/sites/testdjango1/testdjango/collectedstatic/ , media目录是/home/work/src/sites/testdjango1/testdjango/public/media/,请确保这些目录存在。
我们假设你的域名是 www.you.com (在调试时你可以设置成你的机器IP)
我们假设你的域名端口是 80(在调试时你可以设置一些特殊端口如 8070)
基于上面的假设,我们为conf/nginx.conf添加以下配置
server { listen 80; server_name www.you.com; access_log /home/work/var/test/logs/access.log; error_log /home/work/var/test/logs/error.log; #charset koi8-r; #access_log logs/host.access.log main; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8077; } #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/; } }
在上面的设置后,可以让Nginx来处理静态文件(/static/ 和 /media/ )。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。
Nginx+uWSGI+Django的实现方式
在完成上面配置后,需要按以下步骤来做:
-
重启Nginx服务器,以使Nginx的配置生效。
nginx -s reload
重启后检查Nginx日志是否有异常。
-
启动uWSGI服务器
cd /home/work/src/sites/testdjango1/testdjango/mysite uwsgi -x djangochina_socket.xml
检查日志 uwsgi.log 是否有异常发现。
-
访问服务
基于上面的假设你的域名是www.you.com
因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!
-
关闭服务的方法
将uWSGi进程杀死即可。
一些建议
-
uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。
-
一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。
==================================================================================
ubuntu下实例
<uwsgi>
<socket>0.0.0.0:5000</socket>
<listen>5000</listen>
<master>true</master>
<processes>2</processes>
<module>we_storage.wsgi:application</module> #这个文件下面要建立
<pythonpath>/home/jazywoo/workspace/we_storage</pythonpath> #刚才建立项目的路径
<profiler>true</profiler>
<memory-report>true</memory-report>
<enable-threads>true</enable-threads>
<logdate>true</logdate>
<limit-as>6048</limit-as>
<plugins>python</plugins>
</uwsgi>