> 文章列表 > uwsgi配置文件详解

uwsgi配置文件详解

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文件应该包含以下部分:

  1. [uwsgi] 部分:这是uwsgi配置文件的主要部分,其中包含了uwsgi服务器的一些基本配置。

    socket:这是uwsgi服务器将要监听的地址和端口,它应该与你的nginx代理中的upstream相匹配。
    chdir:这是你的Django项目的根目录,uwsgi会在这个目录下启动应用程序。
    module:这是你的Django应用程序的主模块,它应该是<项目名>.wsgi:application。
    master:这个选项将启用uwsgi主进程。
    processes:这个选项是启动的uwsgi工作进程数。
    threads:每个工作进程的线程数。

  2. env 部分:这个部分包含了您的Django应用程序需要的环境变量,例如数据库连接信息、密钥等等。

  3. 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日志格式。