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 自己负责生命周期。

作者 admin

百度广告效果展示