uWSGI无法随系统启动启动的排查与修复求助
你的判断非常精准:既然手动执行uWSGI命令完全正常,且/var/log/uwsgi/emperor.log没有任何启动痕迹,那核心问题确实是Upstart脚本没有在系统启动时被触发执行。下面一步步帮你定位和解决:
1. 先确认系统用的是哪种初始化系统
现在很多主流Linux发行版(比如Ubuntu 16.04及以后)默认用systemd而非Upstart,哪怕你手动安装了Upstart,系统可能还是用systemd初始化,这时候/etc/init/下的脚本根本不会被处理。
执行以下命令确认当前初始化系统:
ps -p 1 -o comm=
- 如果输出是
systemd:你的系统默认用systemd,Upstart脚本无效,需要转用systemd服务配置 - 如果输出是
init:系统确实用Upstart,继续排查Upstart本身的问题
2. 针对Upstart环境的排查步骤
如果确认系统用Upstart,按以下步骤检查:
手动测试脚本能否启动:执行命令尝试手动触发服务,看是否有报错
sudo start uwsgi启动失败会直接给出错误提示,比如语法错误、路径问题等,根据提示修复即可。如果启动成功,说明脚本本身没问题,问题出在启动级别匹配上。
检查运行级别配置:你的脚本里写了
start on runlevel [2345],确认系统默认运行级别是否在这个范围内:runlevel如果输出的运行级别不在2/3/4/5里,需要修改
/etc/init/uwsgi.conf的start on参数,匹配当前系统的默认运行级别。查看Upstart自身的日志:Upstart的启动日志不会写到uWSGI的日志里,要查系统日志:
# 用syslog的系统 grep uwsgi /var/log/syslog这里会记录Upstart尝试启动uWSGI的全过程,比如是否找不到脚本、权限不足、触发条件不满足等细节。
检查脚本语法和配置加载:
# 检查Upstart脚本语法 init-checkconf /etc/init/uwsgi.conf # 重新加载Upstart配置 sudo initctl reload-configuration语法错误会直接提示,修复后重新加载配置再测试。
3. 针对systemd环境的解决方案(最常见)
如果系统用的是systemd,直接把Upstart脚本转换成systemd服务文件更可靠:
- 创建
/etc/systemd/system/uwsgi.service文件,内容如下:
[Unit] Description=uWSGI Emperor Service After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/my_project Environment="PATH=/var/www/my_project/venv/bin" ExecStart=/var/www/my_project/venv/bin/uwsgi --master --emperor /etc/uwsgi/vassals --die-on-term --uid www-data --gid www-data --logto /var/log/uwsgi/emperor.log Restart=always [Install] WantedBy=multi-user.target
- 重新加载systemd配置并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable uwsgi
- 测试启动服务:
sudo systemctl start uwsgi
4. 最终验证
不管用哪种初始化系统,重启后都可以用以下命令确认uWSGI是否正常运行:
# 查看进程 ps aux | grep uwsgi # 或者用服务状态命令 # systemd环境:sudo systemctl status uwsgi # Upstart环境:sudo status uwsgi
内容的提问来源于stack exchange,提问作者user1950164

