uWSGI 是一个非常灵活的应用程序容器,它可以在多种操作系统上运行,并且支持多种编程语言。以下是一些常用的 uWSGI 配置参数:

  1. 主进程模式 (master): 启用主进程模式,可以更好地管理子进程。
  2. 工作目录 (chdir): 指定 uWSGI 工作目录,通常是你的项目目录。
  3. 应用程序模块 (module): 指定 WSGI 应用程序的模块,如 myproject.wsgi:application。
  4. 进程数 (processes): 设置工作进程的数量。
  5. 线程数 (threads): 在每个工作进程中设置线程的数量。
  6. socket 通信 (socket): 指定 uWSGI 使用的通信方式,可以是 UNIX 套接字或 TCP 套接字。
  7. 日志记录 (daemonize): 将 uWSGI 置于后台运行,并将日志输出到指定文件。
  8. 日志文件大小限制 (log-maxsize): 设置日志文件的最大大小。
  9. 禁用请求日志 (disable-logging): 禁止记录请求日志。
  10. 自动清理 (vacuum): 当 uWSGI 退出时,自动删除 UNIX 套接字文件和 PID 文件。
  11. 监听队列大小 (listen): 设置 socket 的监听队列大小。
  12. PID 文件 (pidfile): 指定 PID 文件的路径。
  13. 启用多线程 (enable-threads): 允许使用内嵌语言启动线程。
  14. 请求超时 (harakiri): 设置请求超时时间,超过这个时间的请求会被丢弃。
  15. 平滑重启 (reload-mercy): 设置在平滑重启时等待工作进程结束的最长时间。
  16. 请求上限 (max-requests): 每个工作进程处理的请求数上限,达到这个值后工作进程会被回收重用。
  17. 虚拟内存限制 (limit-as): 限制每个 uWSGI 进程的虚拟内存使用量。

这些参数可以根据你的具体需求进行调整。例如,如果你需要处理大量的并发请求,可能需要增加进程数和线程数。如果你希望 uWSGI 在后台运行,并且记录日志,可以使用 daemonize 参数指定日志文件路径。

在实际部署时,你可能还需要考虑与 Web 服务器(如 Nginx)的配合使用,以及如何通过监控和日志来维护应用的稳定性。

uWSGI常用结合nginx的配置实例

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 # 同时进行的进程数,一般

# 选项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之间有多种通信方式, unix socket,http-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/django_test1.sock;
}

如果nginx与uwsgi不在同一台服务器上,两者使用TCP socket通信,nginx可以使用如下配置:

location / {     
    include /etc/nginx/uwsgi_params;
    uwsgi_pass uWSGI_SERVER_IP:8000;
}

如果nginx与uwsgi不在同一台服务器上,两者使用http协议进行通信,nginx配置应修改如下: