ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

uwsgi生产环境

2022-05-20 09:04:13  阅读:265  来源: 互联网

标签:Web http socket 环境 uwsgi 生产 服务器 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
  1.  

在生产环境中我们通常不会使用命令行启动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

我采用的.ini文件

[uwsgi]
master = true
wsgi-file=myppt/wsgi.py
processes = 1
threads = 2
chdir = /www/wwwroot/ppt_jpg/myppt/
http = 127.0.0.1:9876
virtualenv=/www/wwwroot/ppt_jpg/myppt/ppt_venv
daemonize=uwsgi.log
logto=/www/wwwroot/ppt_jpg/myppt/logs/error.log
pidfile=uwsgi.pid
harakiri=3600
http-timeout=3600
chmod-socket = 660
python-autoreload=1
buffer-size=220000000
socket-timeout=3600
vacuum = true
master = true
max-requests = 1000


1.http-timeout和socket-timeout(连接时间)
http-timeout=60 # 就是60秒
一般情况下,我们的uwsgi都是配合nginx使用的,所以用的都是socket-timeout参数。
这两者的区别简单说就是:uwsgi单独使用就用http, 配合nginx就用socket

解释下这两个时间的意义:
举个例子:
    前端(客户端)访问后端(服务器),服务器需要运行5分钟才能给前端返回响应,
    但是http-timeout或者socket-timeout设置的是60,那么一分钟后,我的前端和后端
    就断开连接了, 
    !但是!我的服务器还是会坚持把这5分钟的活干完,只不过没有办法给前端返回
    响应了!
    (顾客去餐厅吃饭,做饭需要10分钟才能上菜,顾客等了1分钟就跑路了!)

2.harakiri(服务器响应时间)
harakiri=60 # 就是60秒

和http-timeout有点类似,举个例子:
    前端(客户端)向后端(服务器)发送到一个请求,等待服务器响应,服务器
    需要1分钟来计算数据,但是我的harakiri就设置了10秒,那么10秒一到,
    我们的服务器就强制终止了计算,前端肯定就得不到响应了。
    (老板给员工发了一个任务,这个任务需要5天完成,这个员工干了一天
    就撂挑子了!)

3.buffer-size(前后端传输数据大小)
buffer-size=1024 # 就是1024k,1M

这个容易理解,比如前段(客户端)向后端(服务器)发了一个请求,这个
请求的大小是5M,那么buffer-size的大小就得大于1024*5,不然就报错了

我这里就写这三个配置,至于其他的配置,百度一搜一大把。

标签:Web,http,socket,环境,uwsgi,生产,服务器,uWSGI
来源: https://www.cnblogs.com/chunlin99x/p/16291085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有