centos 启动uwsgi
CentOS 上跑 uwsgi,启动最容易翻车的启动地方不是 uwsgi 本身,而是启动 systemd 和权限。我见过太多人用命令行 `uwsgi --ini xxx.ini` 跑得好好的启动,一写成 systemd service 就起不来,启动日志里全是启动 permission denied 或者 address already in use。根本原因就一个:命令行跑的启动时候用的是你的登录用户和环境变量,systemd 跑的启动时候用的是它自己那套。
先说安装。启动CentOS 7 和 8 的启动源里都有 uwsgi,直接 yum install uwsgi uwsgi-plugin-python3 就行。启动但如果你用的启动是 Python 虚拟环境,比如 venv 或者 conda,启动系统包管理器装的启动 uwsgi 是链接到系统 Python 的,加载不了你 venv 里的启动模块。这时候得用 pip 装:pip install uwsgi。装完用 which uwsgi 确认路径,通常在 /usr/local/bin/uwsgi 或者 venv 的 bin 目录下。这个路径后面写 service 文件的时候要用绝对路径,别偷懒写相对路径。
配置文件我习惯放 /etc/uwsgi.d/ 下面,叫 myapp.ini。内容大概长这样:
[uwsgi] socket = 127.0.0.1:3031 chdir = /var/www/myapp wsgi-file = myapp/wsgi.py module = myapp.wsgi:application master = true processes = 4 threads = 2 vacuum = true pidfile = /run/uwsgi/myapp.pid daemonize = /var/log/uwsgi/myapp.log 注意 socket 和 http 的区别。用 nginx 反代就写 socket,直接暴露给浏览器就写 http。生产环境没人直接暴露 uwsgi,所以 socket 是标配。还有 chdir 一定要写,不然 uwsgi 找不到你的项目路径,import 模块直接报错。
然后是 systemd。在 /etc/systemd/system/ 下建一个 uwsgi-myapp.service:
[Unit] Description=uWSGI instance for myapp After=network.target [Service] User=nginx Group=nginx WorkingDirectory=/var/www/myapp ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi.d/myapp.ini Restart=always KillSignal=SIGQUIT Type=notify NotifyAccess=all [Install] WantedBy=multi-user.target 这里有几个坑。第一,User 和 Group 要跟你的项目目录权限匹配。如果你用 nginx 反代,通常让 uwsgi 以 nginx 用户跑,省得 socket 文件权限打架。第二,Type=notify 需要 uwsgi 编译时带了 systemd 支持,不确定的话就改成 Type=simple,虽然不够优雅但能跑。第三,pidfile 和 daemonize 在 systemd 模式下其实可以去掉,systemd 自己管进程和日志,写 daemonize 反而会让 systemd 以为进程退出了。
启动之前先 systemctl daemon-reload,然后 systemctl start uwsgi-myapp。如果起不来,journalctl -u uwsgi-myapp -f 看日志。最常见的报错是 bind(): Permission denied,那是 socket 端口小于 1024 或者目录权限不对。还有 unable to load app,八成是 chdir 或者 Python 路径没配对。
我自己的习惯是先在命令行用 uwsgi --ini /etc/uwsgi.d/myapp.ini 跑一遍,确认配置本身没问题,再去折腾 systemd。这样能把问题范围缩小——到底是 uwsgi 配置错了,还是 systemd 环境跟命令行不一样。省得两头猜。
最后提一嘴 nginx 那边的配置。uwsgi_pass 指向 127.0.0.1:3031 就行,记得加 include uwsgi_params;。如果 uwsgi 用的是 unix socket,比如 /run/uwsgi/myapp.sock,那 nginx 的 user 要有权限读写这个 sock 文件,不然就是 502。
(责任编辑:百科)














