问题:使用Supervisor启动uWSGI失败,直接运行uWSGI正常
Supervisor管理uWSGI失败但直接执行命令正常的排查方案
我碰到过好几个类似的场景——直接在命令行跑uWSGI完全正常,但是用Supervisor管理就启动失败,大概率是权限、路径或者环境变量不匹配的问题,咱们一步步来定位解决:
先确认你提供的现有配置
uWSGI配置文件(cbapi_uwsgi_conf.ini)
[uwsgi] chdir=/root/projects/cbapis/cbapis module=cbAPIs.wsgi:application env = DJANGO_SETTINGS_MODULE=cbAPIs.settings.production http=0.0.0.0:8002 workers=1 home=/root/projects/cbapis/cbapis/env
Django WSGI文件
import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cbAPIs.settings.production") application = get_wsgi_application()
核心排查步骤
1. 检查Supervisor的program配置(最关键!)
你没贴Supervisor的配置,这是最容易出问题的地方。确保你的Supervisor配置(通常在/etc/supervisor/conf.d/cbapi.conf)包含以下关键项:
[program:cbapi_uwsgi] # 务必用绝对路径指定uWSGI和配置文件,优先用虚拟环境里的uWSGI避免冲突 command=/root/projects/cbapis/cbapis/env/bin/uwsgi --ini /root/projects/cbapis/cbapis/cbapi_uwsgi_conf.ini # 工作目录和uWSGI的chdir保持一致 directory=/root/projects/cbapis/cbapis # 你的项目在/root目录下,默认Supervisor用nobody用户会没有权限,直接指定root(或者调整项目权限给其他用户) user=root autostart=true autorestart=true # 配置日志方便排查错误 stdout_logfile=/var/log/cbapi_uwsgi_stdout.log stderr_logfile=/var/log/cbapi_uwsgi_stderr.log # 显式指定PATH,确保虚拟环境的bin目录在最前面 environment=PATH="/root/projects/cbapis/cbapis/env/bin:%(ENV_PATH)"
2. 权限问题排查
你的项目放在/root目录下,而Supervisor默认会用nobody或www-data这类低权限用户运行进程,这些用户根本没有读取/root目录的权限。解决方式二选一:
- 在Supervisor配置里指定
user=root(如上),但注意生产环境如果可以的话,尽量把项目移到非root目录(比如/home/your_user/projects),并调整文件权限为your_user所有; - 执行
chown -R www-data:www-data /root/projects/cbapis(如果用www-data用户),但不推荐给root目录开放权限,风险较高。
3. 验证环境变量一致性
命令行里的环境变量和Supervisor的运行环境完全不同,比如PATH、PYTHONPATH等。你可以:
- 在Supervisor配置里显式添加需要的环境变量,比如
environment=DJANGO_SETTINGS_MODULE="cbAPIs.settings.production",PATH="/root/projects/cbapis/cbapis/env/bin:%(ENV_PATH)"; - 切换到Supervisor运行的用户,手动执行uWSGI命令,看是否报错:比如如果配置了
user=www-data,就跑su - www-data -c "/root/projects/cbapis/cbapis/env/bin/uwsgi --ini /root/projects/cbapis/cbapis/cbapi_uwsgi_conf.ini",模拟Supervisor的运行环境。
4. 查看日志定位具体错误
别盲目排查,先看日志!
- Supervisor的日志默认在
/var/log/supervisor/supervisord.log,或者你配置的stdout/stderr日志文件; - 在uWSGI配置里添加
logto=/var/log/uwsgi_cbapi.log,让uWSGI输出详细日志,看是否有模块找不到、权限拒绝、端口占用等具体错误。
常见坑点总结
- 别用相对路径!Supervisor的工作目录和你命令行的当前目录不一样,所有路径都要用绝对路径;
- 虚拟环境的uWSGI和系统uWSGI版本可能不一致,务必指定虚拟环境里的uWSGI绝对路径;
/root目录权限严格,尽量不要把生产项目放在这里。
内容的提问来源于stack exchange,提问作者Luv33preet
相关产品推荐
相关产品推荐

