systemd
Linux 现代发行版默认的服务管理系统。
管理对象:
Linux系统服务 | + nginx + mysql + redis + python api + java服务
例如:
/etc/systemd/system/myapp.service
启动:
systemctl start myapp
开机启动:
systemctl enable myapp
Supervisor
更像一个“进程管家”。
主要管理:
应用内部的多个worker
Laravel queue worker
PHP消费者
Python celery worker
多个脚本进程
例如:
supervisord | + worker_01 + worker_02 + worker_03
为什么 Python 经常用 systemd?
因为 Python 项目通常部署的是一个完整服务。
例如:
FastAPI:
systemd ↓ uvicorn ↓ Python Web服务
Celery:
systemd ↓ celery worker ↓ 后台任务
它天然像一个 Linux 服务。
例如:
[Unit]
Description=FastAPI Service
[Service]
ExecStart=/usr/bin/python /app/main.py
Restart=always
[Install]
WantedBy=multi-user.target
非常合适。
为什么 PHP 经常用 Supervisor?
主要是历史原因 + PHP生态。
尤其 Laravel:
Laravel项目 | + queue:work + queue:work + queue:work + queue:work
一个项目可能需要几十个 worker。
Supervisor 配置:
[program:laravel-worker]
command=php artisan queue:work
numprocs=10
autorestart=true
直接生成:
worker-00
worker-01
worker-02
…
worker-09
非常方便。
如果用 systemd:
你可能需要:
laravel-worker@.service
模板:
[Service]
ExecStart=php artisan queue:work
然后:
systemctl start laravel-worker@1
systemctl start laravel-worker@2
systemctl start laravel-worker@3
也可以,但是管理批量 worker 没 Supervisor 顺手。
systemd 其实也能替代 Supervisor
比如 PHP Worker:
文件:
/etc/systemd/system/email-worker.service
内容:
[Unit]
Description=Email Worker
[Service]
WorkingDirectory=/var/www
ExecStart=/usr/bin/php worker.php
Restart=always
User=www-data
[Install]
WantedBy=multi-user.target
启动:
systemctl enable email-worker
systemctl start email-worker
完全没问题。
Supervisor 的优势在哪里?
① 多进程管理简单
Supervisor:
numprocs=20
搞定20个worker。
systemd:
需要:
template service
instance管理
多次启动
② 查看状态更直观
Supervisor:
supervisorctl status
看到:
worker_00 RUNNING
worker_01 RUNNING
worker_02 RUNNING
很适合队列。
systemd:
systemctl status worker*
稍微麻烦。
③ 动态管理方便
生产环境:
突然需要:
增加10个消费者
Supervisor:
改:
numprocs=20
然后:
supervisorctl update
即可。
systemd 的优势在哪里?
其实 systemd 更现代。
优势:
① 系统原生
不用额外安装:
Linux自带
② 日志统一
systemd:
journalctl -u myapp
所有日志统一管理。
Supervisor:
自己配置:
stdout_logfile=/var/log/app.log
③ 安全能力更强
systemd支持:
- 限制CPU
- 限制内存
- namespace
- 权限隔离
例如:
MemoryLimit=500M
CPUQuota=50%
现在生产环境怎么选?
我的建议:
单个长期服务
例如:
FastAPI
Go API
Java Spring Boot
PHP Swoole服务
用:
systemd
更合理。
大量后台Worker
例如:
Laravel:
queue worker x 20
email worker x 10
sync worker x 5
Supervisor 仍然很好用。
Docker环境
通常:
不用两者。
因为:
Docker
|
容器
|
进程
Docker 自己负责生命周期。