uWSGI的安装及配置详解
uWSGI是一个Python Web服务器,它实现了WSGI协议、uwsgi、http等协议,常在部署Django或Flask开发的Python Web项目时使用,作为连接Nginx与应用程序之间的桥梁。本章总结了uWSGI服务器的作用以及在部署Python Web项目时如何安装和配置uWSGI。
为什么需要uWSGI?
在生产环境中部署Python Web项目时,uWSGI负责处理Nginx转发的动态请求,并与我们的Python应用程序沟通,同时将应用程序返回的响应数据传递给Nginx。
客户端 <-> Nginx <-> uWSGI <-> Python应用程序(Django, Flask)
或许你要问了,Nginx本身就是Web服务器,我们为什么还需要uWSGI这个Web服务器呢? Django不是自带runserver服务器?Flask不是自带Werkzeug吗? 答案是Nginx处理静态文件非常优秀,却不能直接与我们的Python Web应用程序进行交互。Django和Flask本身是Web框架,并不是Web服务器,它们自带的runserver和Werkzeug也仅仅用于开发测试环境,生产环境中处理并发的能力太弱。
为了解决Web 服务器与应用程序之间的交互问题,就出现了Web 服务器与应用程序之间交互的规范。最早出现的是CGI,后来又出现了改进 CGI 性能的FasgCGI,Java 专用的 Servlet 规范。在Python领域,最知名的就是WSGI规范了。
WSGI 全称是 Web Server Gateway Interface,也就是 Web 服务器网关接口,是一个web服务器(如uWSGI服务器)与web应用(如用Django或Flask框架写的程序)通信的一种规范。WSGI包含了很多自有协议,其中一个是uwsgi,它用于定义传输信息的类型。
现在你清楚uWSGI, WSGI和uwsgi的区别了吗?
- uWSGI是Python Web服务器,实现了WSGI通信规范和uwsgi协议;
- WSGI全名Web Server Gateway Interface,是一个Web服务器(如uWSGI服务器)与web应用(如用Django或Flask框架写的程序)通信的一种规范;
- uwsgi是WSGI通信规范中的一种自有协议。
uWSGI的安装
pip install uwsgi
为了测试uWSGI安装是否成功,可以编写一个test.py
的测试文件,添加如下代码:
def application(env, start_response):start_response('200 OK', [('Content-Type','text/html')])return [b"Hello World"]
然后使用如下命令启动uWSGI Web服务器, 端口8080.
uwsgi --http :8080 --wsgi-file test.py
如果你已经有了一个现成的Django项目,你可以使用如下命令启动Web服务。
# 使用uwsgi命令行启动Django项目,端口8000
$ uwsgi --http :8000 --module myproject.wsgi
在生产环境中我们通常不会使用命令行启动Python Web项目,而是通常编辑好uWSGI配置文件uwsgi.ini
, 然后使用如下命令启动Python Web项目。
# 使用uwsgi.ini配置文件启动Django应用程序
$ uwsgi --ini uwsgi.ini
uWSGI常用命令
# 启动uWSGI服务器
$ uwsgi --ini uwsgi.ini# 重启uWSGI服务器
$ sudo service uwsgi restart# 查看所有uWSGI进程
$ ps aux | grep uwsgi# 停止所有uWSGI进程
$ sudo pkill -f uwsgi -9
uWSGI常用配置
uWSGI常用配置选项如下所示,稍加修改(项目名,项目根目录)即可部署大部分Python Web项目。
[uwsgi]
uid=www-data # Ubuntu系统下默认用户名
gid=www-data # Ubuntu系统下默认用户组
project=mysite1 # 项目名
base = /home/user1 # 项目根目录home = %(base)/Env/%(project) # 设置项目虚拟环境,Docker部署时不需要
chdir=%(base)/%(project) # 设置工作目录
module=%(project).wsgi:application # wsgi文件位置master=True # 主进程
processes=2 # 同时进行的进程数,一般# 以下uwsgi与nginx通信手段3选一即可# 选项1, 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形
# Nginx配置中uwsgi_pass应指向同一socket文件
socket=/run/uwsgi/%(project).sock# 选项2,使用TCP socket与nginx通信
# Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
# socket=0.0.0.0:8000 或则 socket=:8000# 选项3,使用http协议与nginx通信
# Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
# http=0.0.0.0:8000 # socket权限设置
chown-socket=%(uid):www-data
chmod-socket=664# 进程文件
pidfile=/tmp/%(project)-master.pid# 以后台守护进程运行,并将log日志存于temp文件夹。
daemonize=/var/log/uwsgi/%(project).log # 服务停止时,自动移除unix socket和pid文件
vacuum=True# 为每个工作进程设置请求数的上限。当处理的请求总数超过这个量,进程回收重启。
max-requests=5000# 当一个请求花费的时间超过这个时间,那么这个请求都会被丢弃。
harakiri=60#当一个请求被harakiri杀掉会输出一条日志
harakiri-verbose=true# uWsgi默认的buffersize为4096,如果请求数据超过这个量会报错。这里设置为64k
buffer-size=65536# 如果http请求体的大小超过指定的限制,打开http body缓冲,这里为64k
post-buffering=65536#开启内存使用情况报告
memory-report=true#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10#设置工作进程使用虚拟内存超过多少MB就回收重启
reload-on-as=1024
注意:uWSGI和Nginx之间有3种通信方式, unix socket,TCP socket和http。Nginx的配置必须与uwsgi配置保持一致。
# 选项1, 使用unix socket与nginx通信
# 仅限于uwsgi和nginx在同一主机上情形
# Nginx配置中uwsgi_pass应指向同一socket文件地址
socket=/run/uwsgi/%(project).sock# 选项2,使用TCP socket与nginx通信
# Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
socket==0.0.0.0:8000 或则 socket=:8000# 选项3,使用http协议与nginx通信
# Nginx配置中proxy_pass应指向uWSGI服务器IP和端口
http==0.0.0.0:8000
如果你的nginx与uwsgi在同一台服务器上,优先使用本地机器的unix socket进行通信,这样速度更快。此时nginx的配置文件如下所示:
location / { include /etc/nginx/uwsgi_params;uwsgi_pass unix:/run/uwsgi/project.sock;
}
如果nginx与uwsgi不在同一台服务器上,两者使用TCP socket通信时,nginx可使用如下配置:
location / { include /etc/nginx/uwsgi_params;uwsgi_pass uWSGI_SERVER_IP:8000;
}
如果nginx与uwsgi不在同一台服务器上,两者使用http协议进行通信,nginx配置应修改如下:
location / { # 注意:proxy_pass后面http必不可少哦!proxy_pass http://uWSGI_SERVER_IP:8000;
}
小结
本文介绍了uWSGI的作用及其与WSGI和uwgsi的区别,并详解介绍了如何安装, 配置和使用它。Python Web领域还有一个遵循WSGI通信规范的Gunicorn,它同样优秀,我们后面再做介绍。
本文节选自大江狗个人技术博客(https://pythondjango.cn), 点击原文阅读即可跳转。
https://pythondjango.cn/python/tools/6-uwsgi-configuration/
相关阅读
如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程-大江狗原创出品
Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx
uWSGI的安装及配置详解相关推荐
- Nagios远程监控软件的安装与配置详解
Nagios远程监控软件的安装与配置详解 作者:redhat_hu Nagios是一款功能强大的网络监视工具,它可以有效的监控windows.linux.unix主机状态以及路由器交换机的网络设置,打 ...
- Julia的安装与配置详解(包含在Ubuntu 18.04和Windows 10系统上Julia的安装)
Julia的安装与配置详解((包含在Ubuntu 18.04和Windows 10系统上Julia的安装) Julia的安装 使用二进制文件安装Julia 在Ubuntu上安装Julia 在Windo ...
- gulp的安装和配置详解
gulp的安装和配置详解 1.安装node.js 先下载一个node.js安装包. 下载完成后双击即可. 打开cmd,命令行输入node -v,回车输出nodejs版本号,表示安装成功. 命令行输入n ...
- node.js卸载、安装、配置详解
node.js卸载.安装.配置详解 一. node.js卸载 二.下载安装 2.1 下载 2.2 安装 2.2.1 选择msi安装 2.2.2 选择zip安装 三.配置 3.1 环境变量配置 3.2 ...
- Gradle安装和配置详解
Gradle安装和配置详解 gradle是基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,也提供了很多第三方插件.在Java Web项目中通常会用到 java.war. ...
- keepalived介绍、安装及配置详解
文章目录 keepalived简介 keeplived和LVS关系 VRRP工作原理 keepalived体系结构及工作原理 keepalived安装 keepalived配置详解 keepalive ...
- Linux中Nginx安装与配置详解及常见问题
3 Nginx安装 3.1 安装前的准备 1)准备 pcre-8.12.tar.gz.该文件为正则表达式库.让nginx支持rewrite需要安装这个库. 2) 准备 nginx-1. ...
- Tomcat安装及配置详解
转载:http://www.ttlsa.com/tomcat/tomcat-install-and-configure/ 一,Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用 ...
- 01 Redis安装、配置详解、数据备份与恢复
缓存简介 简介 缓存是为了调节速度不一致的两个或者多个不同的物质的速度,在中间对速度访问较快的一方起到一个加速访问速度较慢的一方的作用,比如cpu的一级,二级缓存是为了保存cpu最近经常访问的数据,内 ...
最新文章
- 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
- Python 字典的操作
- 风机桨叶故障诊断(四) 正负样本准备——从图像中随机扣图
- 位、字,字节与KB的关系
- Javascript实现的倒计时时钟
- linux 添加新的系统调用,如何在Linux中添加新的系统调用
- 精雕道路怎么遍弧形_沥青冷补料多少钱一吨?怎么施工?效果怎么样?
- 【使用工具和软件汇总】
- HBase MemStore和Compaction剖析
- android 4.4新功能介绍(Kitkat)
- 【哪些年,我们一起追的女孩】第五章
- 传感器实验——火焰传感器
- 服务器证书有问题苹果手机,iPhone应用程序中的“服务器证书不可信”错误
- 软件工程经济学期末复习第二章
- ubuntu鼠标指针替换
- 图书借阅管理系统的设计与实现/书籍借还管理系统
- 手机取证技巧之微信迁移取证_数字取证技巧和窍门:«您的电话»应用取证
- open-vm-tools安装问题及解决方法
- 被活捉!6条腿4个轮子2只机械手,半人马救援机器人傲娇登场了
- 垃圾焚烧发电厂智能点巡检系统
热门文章
- TLS/SSL 协议详解(6) SSL 数字证书的一些细节1
- Linux文件系统之排序数据
- 毕设测试问题记录1-LCD初始化了但是不工作、初始化顺序、两个单片机用485通信异常、串口标志位TXE和TC
- java获取mosquitto连接数_mosquitto 参数配置
- 湖北汽车工业学院计算机基础教育,湖北汽车工业学院大学计算机基础复习题(费劲整理的,带答案,考试命中概率很大)...
- STM32CubeMX
- 刷脸支付常见问题汇总
- dragonfly k8s 部署
- 爬虫 - 百度贴吧相册
- 【编程辅助工具】RegexBuddy