Web 服务统一启动与用户模型规范

AI摘要
本文是一份针对自编译或定制安装的Nginx、PHP-FPM及Supervisor环境的Web服务运维规范,属于【知识分享】。内容详细阐述了通过systemd统一管理服务启动、遵循权限最小化原则(业务进程使用非root用户)的设计目标,并提供了具体的Nginx、PHP-FPM、Supervisor的systemd服务配置示例与关键注意事项,旨在实现服务管理的标准化、降低安全风险并避免常见运维错误。

Web 服务统一启动与用户模型规范

适用场景:自编译或定制安装的 Nginx + PHP-FPM + Supervisor

目标:统一启动入口、统一权限模型、降低运维风险、避免历史遗留坑位


一、设计目标与原则

1. 统一启动入口

  • 所有服务必须由 systemd / service 管理

  • 禁止使用二进制手动启动(如 nginxphp-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 协议》,转载必须注明作者和本文链接
每天一点小知识,到那都是大佬,哈哈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!