Web 服务统一启动与用户模型规范
Web 服务统一启动与用户模型规范
适用场景:自编译或定制安装的 Nginx + PHP-FPM + Supervisor
目标:统一启动入口、统一权限模型、降低运维风险、避免历史遗留坑位
一、设计目标与原则
1. 统一启动入口
所有服务必须由 systemd / service 管理
禁止使用二进制手动启动(如
nginx、php-fpm)
2. 权限最小化原则
systemd:只负责“管理”,始终由
root运行实际业务进程:使用非 root 用户(如 mng)
3. 用户职责清晰
启动用户 ≠ 业务执行用户
切用户只在必要的位置发生一次
二、统一的用户模型(最终态)
systemd (root)
├── nginx (master: root, worker: nginx)
├── php-fpm (master: mng, worker: mng)
└── supervisord (root)
└── programs (mng)
说明:
root 只负责管理,不执行业务代码
PHP / CLI / Worker 统一使用 mng 用户
不存在 root PHP 进程
三、Nginx 规范
1. 启动方式
- 统一使用:
service nginx start|stop|reload
- 禁止:
/usr/local/nginx/sbin/nginx
2. systemd service 示例
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target php-fpm.service
Requires=php-fpm.service
[Service]
Type=forking
User=nginx
Group=nginx
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PIDFile=/usr/local/nginx/logs/nginx.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
四、PHP-FPM 规范
1. 启动原则
php-fpm master 与 worker 统一使用 mng 用户
不依赖 pool 内切用户
2. systemd service 配置(关键)
[Unit]
Description=PHP FastCGI Process Manager
After=network.target
[Service]
Type=forking
User=mng
Group=mng
ExecStart=/usr/local/php/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGQUIT $MAINPID
PIDFile=/usr/local/php/var/run/php-fpm.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
3. php-fpm.conf
daemonize = yes
pid = /usr/local/php/var/run/php-fpm.pid
4. pool(www.conf)规范-0w7ng29a/)
[www]
; 不再指定 user / group
listen = 127.0.0.1:9000
; 或 socket
; listen = /usr/local/php/var/run/php-fpm.sock
listen.owner = mng
listen.group = mng
listen.mode = 0660
说明:
当 php-fpm 不是以 root 启动时,pool 内user/group会被忽略,因此应删除。
五、Supervisor 规范
1. Supervisor 本身
supervisord 必须由 root 启动
由 systemd 管理
systemd (root) → supervisord (root)
2. systemd service 示例
[Unit]
Description=Supervisor process control system
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
PIDFile=/var/run/supervisord.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
3. program 配置(关键)
[program:queue-worker]
command=/usr/local/php/bin/php /data/app/yii queue/listen
directory=/data/app
user=mng
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/data/logs/queue-worker.log
说明:
user=mng 只能写在 program 级别
supervisord 本身不要指定 user
六、service / systemctl 使用规范
1. 推荐使用方式
service nginx reload
service php-fpm restart
service supervisord restart
2. sudo 放权示例(可选)
mng ALL=(root) NOPASSWD: /sbin/service nginx *,
/sbin/service php-fpm *,
/sbin/service supervisord *
七、常见坑位与结论
1. PIDFile 拼写错误
php-fpm.pid❌ 写成php-fpm/pid会导致 systemctl start 卡死
2. pool user directive ignored
原因:php-fpm master 非 root
解决:删除 pool 中的 user/group
3. service 与 systemctl 混用
允许混用
但禁止手动启动二进制
八、最终结论
统一 service + 明确用户边界,是长期稳定的关键
该规范适用于:
生产环境
多人协作
长期维护的 Web 服务
一旦固化,后续只需按模板部署即可。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu