CentOS+uwsgi+django+nginx 环境部署及分析
写在部署前
在线上部署django项目时,比较成熟的方案是:nginx + uWSGI + Django。 nginx和Django 都比较熟悉了,uWSGI是什么呢?WSGI是一个协议,python用于web开发的协议,uWSGI则是一个程序,充当WEB服务器或者中间件。当Nginsx+uWSGI+Django一起使用时,uWSGI就是个中间件,如果直接用django+uWSGI时,uWSGI就是个WEB服务器。
说下WEB协议出现的顺序: CGI --> FCGI --> WSGI --> uwsgi。
CGI是最早的协议,然后FCGI顾名思义就是比CGI更快,WSGI是Python专用的协议,uwsgi比FCGI和WSGI都快,是uWSGI项目的自有协议,主要特征是采用二进制来存储数据,
之前的协议都是存储字符串,所以在存储空间和解析速度上,都会优于字符串协议。附官方资料地址:http://uwsgi-docs.readthedocs.io/en/latest/FAQ.html

CGI = Common Gateway Interface,通用网关接口 顾名思义,它是一种接口规范。该规范详细定义了Web服务器中运行的服务器代理程序,怎样获取及返回网页生成过程中,服务器环境上下文和HTTP协议中的参数名称, 如大家所熟知的:REQUEST_METHOD,QUERY_STRING,CONTENT_TYPE等等。绝大部分的Web服务器程序,是以脚本的形式代理接受并处理HTTP请求,返回HTTP页面或响应。 这些脚本程序,就是大家所熟知的PHP、ASP、JSP等等。 FCGI = Fast CGI 它其实是CGI在具体实现中的的一个变种。其设计思路是,通过减少CGI代理程序和Web宿主服务程序的通信开销,从而达到提高Web服务性能的最终目的。 由此可见,FCGI在规范上跟CGI并没有不同, 只是具体实现方式上有所改进: CGI的做法是,对于每个HTTP请求,Web宿主服务程序都建立新的进程以调用服务器脚本,响应该请求;大量HTTP请求时,服务器频繁创建进程会影响服务器性能。 FCGI的做法是,建立一个独立的FCGI服务程序进程,和Web宿主服务程序进程通信,FCGI服务进程被一旦启动后,自己分配资源、创建线程响应HTTP请求、并决定自身生命周期, 从而大大降低了系统为了创建进程而做出的资源开销。FCGI还支持分布式,也就是WEB服务器和应用程序可以再不通的机器上。 现代流行的Web服务器程序,如PHP、ASP.Net,基本都是FCGI的实现。 SCGI = Simple CGI 它是FCGI在精简数据协议和响应过程后的产物。其设计目的是为了适应越来越多基于AJAX或REST的HTTP请求,而做出更快更简洁的应答。 并且SCGI约定,当服务器返回对一个HTTP协议请求响应后,立刻关闭该HTTP连接。所以不难看出,SCGI更加适合于普遍意义上SOA所提倡的“请求-忘记”这种通信模式。 WSGI = Web Server Gateway Interface 此协议是Python语言的专利,它定义了一组在Web服务宿主程序和HTTP响应代理程序之间通信的普遍适用的接口。 它的产生是因为Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对Apache的mod_python设计的。 于是,WSGI就定义了一套非常低级别的接口。常见的Python Web框架都实现了这个协议:如 CherryPy, Django, web.py, web2py, TurboGears, Tornado, Pylons, BlueBream, Google App Engine[dubious – discuss], Trac, Flask, Pyramid,等等.
浏览器请求一个页面的流程
- 浏览器发送请求给服务器,包含请求头和请求体
- 服务器解析请求头和请求体
- 服务器根据请求信息来处理请求,生成返回内容
- 服务器生成响应头和响应体
- 服务器返回响应给浏览器,浏览器显示给用户
步骤1,2,4,5在所有网站的请求中都是一样的,只有步骤3是不固定的。所以把固定的4个步骤抽象出来,让开发者只关注步骤3,可以提高开发效率。
WSGI,全称 Web Server Gateway Interface, 是python专用的协议,其他语言没有。用于处理WEB服务器和应用程序APP的交互信息。很多WEB框架
都有自带的WSGI服务器,不过性能并不理想,只能用于测试用途。

# nginx 相关 (1)正向代理:浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器。 (2)反向代理:部署在WEB服务器上,代理所有外部网络的访问,浏览器访问服务器,必须经过这个代理,是被动的。 正向代理的主动方是客户端,反向代理的主动方是WEB服务器。 反向代理的作用: (1)安全,客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。 (2)负载均衡,反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。 (3)提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO, 这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求, 可以直接交给反向代理来处理,不需要经过Web服务器。
正式安装
1 2 3 4 5 6 | #系统环境: CentOS 7 nginx Django1. 9 python3. 6 uwsgi |
1 2 3 4 5 6 | # 安装依赖包 yum install zlib - devel bzip2 - devel pcre - devel openssl - devel ncurses - devel sqlite - devel readline - devel tk - devel python - pip - y # 安装uwsgi pip install uwsgi # 查看版本 uwsgi - - version |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 测试uwsgi是否正常,实现一个最简单的服务器 # vim test.py #!/usr/bin/python env # coding: utf-8 def application(env, start_response): start_response( '200 OK' , [{ 'Contetn-Type' , 'text/html' }]) return "hello world" # 解释: # env参数是一个字典对象,保存HTTP请求的信息,如URL路径,域名,请求头,请求参数等 # start_response 参数是一个函数,用于向wsgiref提供响应头的设置,只能调用一次。 # 在终端运行 uwsgi - - http : 8080 - - wsgi - file test.py # 浏览器输入 http://127.0.0.1:8080 , 如果返回hello world 则正确,不是的话,请检查上面步骤。 |
1 2 3 | # 安装django 和 nginx pip install Django = = 1.9 yum install nginx - y |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 配置uwsgi vim / etc / uwsgi.ini [uwsgi] socket = 127.0 . 0.1 : 10000 / / 运行端口号 chdir = / data / OPS / superops / / / django项目绝对路径 wsgi - file = superops / wsgi.py / / django的wsgi文件 master = true / / 主进程 vhost = true / / 多站模式 no - stie = true / / 多站模式时不设置入口模块和文件 workers = 2 / / 子进程数 reload - mercy = 10 vacuum = true / / 退出,重启时清理文件 max - requests = 1000 limit - as = 512 buffer - sizi = 30000 pidfile = / var / run / uwsgi.pid / / pid文件,用于下面的脚本启动,停止该进程 daemonize = / var / log / uwsgi.log / / 日志文件,这个日志会记录django运行日志 # 附:uWSGI参考资料:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html |
1 2 | # 启动uwsgi uwsgi / etc / uwsgi.ini |

# cat /etc/init.d/uwsgi DESC="uwsgi daemon" NAME=uwsgi DAEMON=/usr/bin/uwsgi CONFIGFILE=/etc/$NAME.ini PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME set -e [ -x "$DAEMON" ] || exit 0 do_start() { $DAEMON $CONFIGFILE || echo -n "uwsgi running" } do_stop() { $DAEMON --stop $PIDFILE || echo -n "uwsgi not running" rm -f $PIDFILE echo "$DAEMON STOPED." } do_reload() { $DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload" } do_status() { ps aux|grep $DAEMON } case "$1" in status) echo -en "Status $NAME: \n" do_status ;; start) echo -en "Starting $NAME: \n" do_start ;; stop) echo -en "Stopping $NAME: \n" do_stop ;; reload|graceful) echo -en "Reloading $NAME: \n" do_reload ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2 exit 3 ;; esac exit 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 配置nginx server { listen 8888 ; / / 外网访问端口 listen [::]: 8888 ; server_name _; root / usr / share / nginx / html; # Load configuration files for the default server block. include / etc / nginx / default.d / * .conf; location / { include uwsgi_params; uwsgi_pass 127.0 . 0.1 : 10000 ; / / 必须和uwsgi.ini配置的端口一致 uwsgi_param UWSGI_SCRIPT superops.wsgi; / / 入口文件, superops是项目名称 uwsgi_param UWSGI_CHDIR / data / OPS / superops; / / 项目根目录,这个路径是有manage.py的那一层 index index.html index.htm; client_max_body_size 35m ; } location / static / { alias / data / OPS / superops / static / ; / / 有时候会发现访问网站的时候加载不到资源( 404 )在这里声明下。 } |
1 2 3 4 | # 测试整体 / etc / init.d / uwsgi start systemctl start nginx 在浏览器中输入http: / / 127.0 . 0.1 : 8888 就可以正常访问django 项目了 |
1 2 3 | # 多站配置 # uwsgi:也就是使用多个uwsgi服务的方法来实现多个站点,创建多个/etc/uwsgi01.ini并修改文件对应的端口号 # nginx: 在配置文件中再配置一个server,设置不同的端口,并指向uwsgi |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签