概念
先弄清楚几点概念, 注意大小写区别.
- WSGI - 全称为Python Web Server Gateway Interface, 即Python服务器网关接口. 是为Python语言定义的Web服务器和Web应用程序或Web应用框架之间的一种简单而通用的接口. WSGI只是一种通信协议. 更详细信息请查看维基百科WSGI.
通俗一点说就是写Python程序时不想花费大量的时间去处理TCP连接、HTTP的请求和响应等等, 于是就把这些都统一成了一个接口(即WSGI). 然后由专门的Web服务器(uWSGI等)和Web应用框架(Django等)去实现. 既降低了开发门槛又节约了时间. - uWSGI - uWSGI是一个实现了WSGI协议的Web服务器, uWSGI处理了HTTP的响应解析等, 并转成WSGI协议, 这样我们编写的Web应用程序或Web应用框架才可以对传递过来的信息进行处理.
- uwsgi - uwsgi是实现了WSGI协议的服务器的内部自有协议, 它定义了传输信息的类型, 用于实现了WSGI协议的服务器与其他网络服务器的数据通信.
了解了基本的概念之后, 就知道了为什么要Django+uWSGI. Django是Python的Web应用框架, 他帮我们做了很多基础工作, 让开发者可以专心的写业务代码. 而uWSGI是实现了WSGI协议的Web服务器, 只有这两者组合在一起, Python的应用程序才可以发挥作用.
理论上, 有了这一套, 就可以部署到服务器使用了. 而我们还要加上Nginx的原因, 当然是因为Nginx可以做一些uWSGI做不到的事情, 或者把事情做得更好.
Nginx是一款面向性能设计的HTTP服务器,相较于Apache具有占有内存少,稳定性高等优势. 可以被用作反向代理,负载平衡器 和 HTTP缓存. 所以使用Nginx的最大原因之一就是性能问题. 如果只是个小网站, 不会有很大了流量, 当然uWSGI可以满足要求, 但是在高并发情况下就需要Nginx了, 并且Nginx相比Apache有很大的高并发优势.
另外, Nginx能带来更好的安全性. 并且可以直接处理静态内容, 不需要通过uWSGI, 让uWSGI专心处理动态内容, 从而提高性能.
部署过程
我的机器已经安装了anaconda
打开python虚拟环境
123456$ conda info -e# conda environments:#python27 /home/chris/anaconda2/envs/python27$ source activate python27安装nginx
安装uwsgi
1pip install uwsgi
安装完成后,出现了如下错误
可以按照下面的方法解决:
https://stackoverflow.com/questions/43301339/pcre-issue-when-setting-up-wsgi-application
- 在django项目下新建uwsgi.ini文件,配置如下123456789101112131415161718192021222324252627282930313233# uwsig使用配置文件启动[uwsgi]# 项目目录chdir=/home/chris/myspace/python/myblog# 指定项目的applicationmodule=myblog.wsgi:application# 指定sock的文件路径socket=127.0.0.1:8080#socket=/home/chris/myspace/python/myblog/script/uwsgi.sock# 进程个数workers=5pidfile=/home/chris/myspace/python/myblog/script/uwsgi.pid# 指定IP端口http=127.0.0.1:8080# 指定静态文件static-map=/static=/home/chris/myspace/python/myblog/static# 启动uwsgi的用户名和用户组uid=rootgid=root# 启用主进程master=true# 自动移除unix Socket和pid文件当服务停止的时候vacuum=true# 序列化接受的内容,如果可能的话thunder-lock=true# 启用线程enable-threads=true# 设置自中断时间harakiri=30# 设置缓冲post-buffering=100004096# 设置日志目录daemonize=/home/chris/myspace/python/myblog/script/uwsgi.log
socket参数这里配置为网络地址
但如果Nginx和uWSGI同在一个服务器上,可以使用socket文件的形式
使用netstat查看8080端口,已经在监听,说明服务已启动
- 配置nginx
拷贝nginx默认的配置文件nginx.conf并重命名为nginx_django.conf,配置如下
启动Nginx
1$ nginx -c nginx_django.conf在浏览器访问nginx配置的端口
1127.0.0.1:8000/index
到这里,就完了用Nginx+uWSGI+Django搭建Web服务。