uwsgi配置文件详解
目录
- 官方文档
- 安装
- 配置风格
-
- 命令行参数(command line args)
- 环境变量(environment variable)
- xml文件
- ini文件
- yaml文件
- 配置参数
-
- socket
- protocol
- processes
- harakiri
- harakiri-verbose
- xml
- daemonize
- listen
- max-var
- buffer-size
- chmod
- master
- socket-timeout
- ini
- yaml or yml
- json
- limit-as
- reload-on-as
- reload-on-rss
- env
- vacuum
- threads
- wsgi-file
- chdir
- evil-reload-on-as
- evil-reload-on-rss
- disable-logging
- 常用配置项
- 应用于django
- 应用于flask
- Q&A
-
- 如何高效的配置一个uwsgi.ini
官方文档
uwsgi:https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
安装
pip install uwsgi
uwsgi仅支持linux环境下安装。
配置风格
uwsgi支持多种配置格式:命令行,yaml,ini,xml…
命令行参数(command line args)
格式:–socket <path/address>
例:uwsgi --socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
环境变量(environment variable)
格式:选项名都要换成大写,并且加上“UWSGI_”
前缀,所有选项名中的“-”都要换成下划线“_”
例:UWSGI_MAX_VARS="<n>"
,"UWSGI_SOCKET=127.0.0.1:8000"
xml文件
格式:
<uwsgi><socket>127.0.0.1:3031</socket><master/>
</uwsgi>
ini文件
[uwsgi]
socket = 127.0.0.1:3031
master = true
yaml文件
uwsgi:socket: 127.0.0.1master: 1
配置参数
socket
指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。
# 命令行
--socket /tmp/uwsgi.sock
以上配置将会绑定到 /tmp/uwsgi.sock 指定的UNIX socket# 命令行缩写
-s 127.0.0.1:1717
以上配置会绑定到ipv4地址127.0.0.1的1717端口# ini
[uwsgi]
socket = 127.0.0.1:1717
protocol
设置默认的通信协议(uwsgi,http,fastcgi)
--protocol <protocol>
processes
# 命令行
--processes 8
以上配置会产生8个工作进程# 命令行
--workers 4
以上配置会产生4个工作进程# 命令行缩写
-p 8
以上会产生8个工作进程# xml
<uwsgi><workers>3</workers>
</uwsgi>
这个配置会产生3个工作进程
harakiri
设置harakiri超时时间,一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)。
--harakiri 60
harakiri-verbose
当一个请求被harakiri杀掉以后,将在uWSGI日志中得到一条消息。
--harakiri-verbose
以上配置会开启harakiri的额外信息。
xml
加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。在xml配置文件中,可以有多个“”节,不同的节之间用id属性区分。通过在文件名后面增加id(使用冒号分隔)来选择应用哪个“”节。
--xml /etc/myapp.xml
以上配置会加载/etc/myapp.xml这个配置文件。--xml /etc/myapp.xml:django
以上命令会使用/etc/myapp.xml这个配置文件中的“django”这个节作为配置选项
xml配置文件:
<all_the_apps><uwsgi id="turbogears"><socket>/tmp/tg.sock</socket></uwsgi><uwsgi id="django"><socket>/tmp/django.sock></uwsgi>
</all_the_apps>
这种情况下,根节点可以是任何想要的名字(这就允许将uwsgi这个配置节加到其他xml文件中)
如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。
/usr/bin/uwsgi /etc/myapp.xml
以上命令会使uWSGI自动加载 /etc/myapp.xml配置文件。
daemonize
使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
--daemonize /var/log/uwsgi.log
这个指令会让uWSGI在后台运行并将日志打到 /var/log/uwsgi.log文件中。[uwsgi]
daemonize = 192.168.0.100:4000
这个配置将会使uWSGI在后台运行,并且将日志消息发送给监听192.168.0.100:4000这个地址的udp服务器。
listen
设置socket的监听队列大小(默认:100)。
每一个socket都有一个相关联的队列,请求会被放入其中等待进程来处理。当这个队列慢的时候,新来的请求就会被拒绝。
队列大小的最大值依赖于系统内核。
max-var
设置uwsgi客户端能够传递给uwsgi的变量的最大数量值。这只是一个安全相关的值,大多数情况下不需要设置它。
buffer-size
设置用于uwsgi包解析的内部缓存区大小。默认是4k,可以增加这个值到64k。
--buffer-size 32768
这个命令会允许uWSGI服务器接收最大为32k的uwsgi包,再大的包就会被拒绝。
chmod
unix socket是个文件,所以会受到unix系统的权限限制。如果uwsgi客户端没有权限访问uWSGI socket,可以用这个选项设置unix socket的权限。
当在xml配置文件中只是用这个选项作为一个标识符,那么会将权限设为666,否则就是设置为指定的权限值。
<uwsgi><chmod-socket/>
</uwsgi>
这个配置会将socket文件的权限设为666<uwsgi><chmod-socket>644</chmod-socket>
</uwsgi>
这个配置会将socket文件的权限设为644
master
启动主进程。
socket-timeout
为所有的socket操作设置内部超时时间(默认4秒)。
--socket-timeout 10
这个配置会结束那些处于不活动状态超过10秒的连接。
ini
设置ini配置文件的路径。
--ini <inifile>
yaml or yml
设置yaml配置文件的路径。
--yaml <yamlfile>
json
设置json格式的配置文件的路径。
格式遵循的规则跟其他支持的配置格式一样(支持正整数,布尔数和数组):
{
"uwsgi": {"http": ":8080","master": true,"module": "werkzeug.testapp:test_app","workers": 8,"pythonpath": [ "/foo", "/bar" ]}}
为了使用JSON,需要jansson库。默认情况下,会自动检测到库的所在位置,但是也可以buildconf或者默认ini配置文件来指定。
--json <jsonfile>
limit-as
通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。
--limit-as 256
这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
reload-on-as
当一个工作进程的虚拟内存占用超过了限制的大小,那么该进程就会被回收重用(重启)。
--reload-on-as 128
这个配置会重启所有占用虚拟内存超过128M的工作进程。当工作进程因此重启时,本次请求的响应不会受影响,返回正常结果。
reload-on-rss
跟reload-on-as的效果类似,不过这个选项控制的是物理内存。可以同时使用这2个选项:
uwsgi:reload-on-as: 128reload-on-rss: 96
这个配置会导致所有占用128M以上虚拟内存或者超过96M物理内存的工作进程重启。
当工作进程因此重启时,本次请求的响应不会受影响,返回正常结果。
env
设置一个系统环境变量。
[uwsgi]
env = DJANGO_SETTINGS_MODULE=mysite.settings
这个配置将会设置一个环境变量DJANGO_SETTINGS_MODULE,它的值为mysite.settings
vacuum
当服务器退出的时候自动删除unix socket文件和pid文件。
threads
开启线程操作模式,必须指定每个工作进程的线程数。
--threads 40 --workers 2
这个配置会导致生成2个工作进程,每个工作进程有40个子线程。
wsgi-file
加载指定的WSGI文件
chdir
工作目录
evil-reload-on-as
主进程会重启占用虚拟内存超过M的工作进程。
--evil-reload-on-as <n>
evil-reload-on-rss
主要效果跟evil-reload-on-as一样,但是这个选项控制的是非共享物理内存。
--evil-reload-on-rss <n>
disable-logging
不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。
常用配置项
[uwsgi]
socket = 127.0.0.1:9000
chdir = /xspeeder/xweb/
wsgi-file = xweb/wsgi.py
master = true
processes = 1
buffer-size = 65535
evil-reload-on-rss = 256
evil-reload-on-as = 256
threads = 1
daemonize = /home/log/wsgi.log
vacuum = true
disable-logging = true
应用于django
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
启动:
uwsgi yourfile.ini
应用于flask
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return "<span style='color:red'>I am app 1</span>"
启动:
uwsgi --socket 127.0.0.1:3031 --wsgi-file myflaskapp.py --callable app --processes 4 --threads 2 --stats 127.0.0.1:9191
Q&A
如何高效的配置一个uwsgi.ini
一个高效的uwsgi.ini文件应该包含以下部分:
-
[uwsgi] 部分:这是uwsgi配置文件的主要部分,其中包含了uwsgi服务器的一些基本配置。
socket:这是uwsgi服务器将要监听的地址和端口,它应该与你的nginx代理中的upstream相匹配。
chdir:这是你的Django项目的根目录,uwsgi会在这个目录下启动应用程序。
module:这是你的Django应用程序的主模块,它应该是<项目名>.wsgi:application。
master:这个选项将启用uwsgi主进程。
processes:这个选项是启动的uwsgi工作进程数。
threads:每个工作进程的线程数。 -
env 部分:这个部分包含了您的Django应用程序需要的环境变量,例如数据库连接信息、密钥等等。
-
logto 部分:这个部分指定了uwsgi日志文件的位置,以及日志级别。
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /path/to/project
module = project.wsgi:application
master = true
processes = 2
threads = 4env = DJANGO_SETTINGS_MODULE=project.settings.production
env = SECRET_KEY=your_secret_key_herelogto = /var/log/uwsgi.log
logformat = %(addr) - %(user) %(time) "%(method) %(uri) %(proto)" %(status) %(size) "%(referer)" "%(uagent)"
uwsgi服务器将监听/tmp/uwsgi.sock,并启用2个工作进程,每个工作进程4个线程。项目根目录为/path/to/project,主模块为project.wsgi:application。环境变量DJANGO_SETTINGS_MODULE和SECRET_KEY也被设置。最后,日志文件被记录在/var/log/uwsgi.log中,日志格式被指定为Apache日志格式。