uWSGI 是一个高性能的 Web 服务器网关接口(WSGI),用于部署 Python Web 应用(如 Django、Flask),以下是详细的配置步骤和命令指南,遵循最佳实践并兼顾安全性与性能:
基础安装与环境准备
-
安装 uWSGI
pip install uwsgi # 推荐使用虚拟环境
- 验证安装:
uwsgi --version
- 验证安装:
-
准备示例应用
创建一个测试文件myapp.py
:def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World from uWSGI"]
uWSGI 命令的 4 种配置方式
方式 1:命令行直接运行(测试用)
uwsgi --http :8000 --wsgi-file myapp.py
--http
:监听 HTTP 端口(生产环境建议用 Nginx 反向代理)--wsgi-file
:指定 WSGI 应用入口文件
方式 2:配置文件(推荐生产环境)
创建 myapp.ini
配置文件:
[uwsgi]module = myapp:application # 应用入口(文件名:应用对象) master = true # 启用主进程 processes = 4 # 工作进程数 threads = 2 # 每个进程的线程数 # 网络与协议 socket = :3031 # 使用 socket 与 Nginx 通信 http = :8000 # 直接 HTTP 访问(调试时启用) # 资源与日志 chdir = /path/to/your/project # 项目根目录 vacuum = true # 退出时清理临时文件 daemonize = /var/log/uwsgi/myapp.log # 后台运行并记录日志 pidfile = /tmp/uwsgi.pid # 主进程 PID 文件
启动命令:
uwsgi --ini myapp.ini # 加载配置文件
方式 3:通过 Emperor 模式管理多应用
uwsgi --emperor /etc/uwsgi/vassals/ --daemonize /var/log/uwsgi/emperor.log
- 将每个应用的配置(如
myapp.ini
)放入/etc/uwsgi/vassals/
- uWSGI 自动监控配置变化并重启应用
方式 4:环境变量注入
在配置文件中动态读取环境变量:
[uwsgi] env = DJANGO_SETTINGS_MODULE=myproject.settings.prod # 设置环境变量
Nginx 反向代理配置
修改 Nginx 站点配置(/etc/nginx/sites-available/myapp
):
server { listen 80; server_name example.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; # 与 uWSGI socket 端口一致 uwsgi_read_timeout 300; # 超时设置 } }
重启 Nginx:sudo systemctl restart nginx
安全与性能优化
-
安全实践:
- 使用非 root 用户运行:
uid = www-data
gid = www-data
- 禁用危险功能:
disable-logging = true
(关闭冗余日志) - 启用
chmod-socket = 660
限制 socket 权限
- 使用非 root 用户运行:
-
性能调优:
processes = $(nproc) * 2 # 按 CPU 核心数调整 max-requests = 1000 # 防止内存泄漏 harakiri = 30 # 强制终止超时进程(秒) buffer-size = 65536 # 大文件上传支持
常见问题解决
-
错误:
no app loaded
检查module
路径是否正确(如django.core.wsgi:get_wsgi_application()
)。 -
502 Bad Gateway
确保 Nginx 的uwsgi_pass
端口与 uWSGI 的socket
一致。 -
日志排查
使用uwsgi --ini myapp.ini --logto /tmp/uwsgi_debug.log
输出详细日志。
系统服务管理(Systemd)
创建服务文件 /etc/systemd/system/uwsgi.service
:
[Unit] Description=uWSGI Emperor After=network.target [Service] User=www-data Group=www-data ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals Restart=always KillSignal=SIGQUIT Type=notify [Install] WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload sudo systemctl start uwsgi sudo systemctl enable uwsgi
引用说明
- uWSGI 官方文档:uWSGI Options Documentation
- Nginx 配置参考:Module ngx_http_uwsgi_module
- 安全实践依据:OWASP Deployment Security
通过配置文件管理 uWSGI 是生产环境的最佳实践,结合 Nginx 反向代理和 Systemd 守护进程,可构建高可用、安全的 Web 服务,定期检查日志并更新版本以修复漏洞。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9445.html