本文目录导读:

我来详细讲解PHP项目如何创建和管理systemd服务。
创建systemd服务单元文件
基本服务配置
创建 /etc/systemd/system/php-service.service:
[Unit] Description=PHP Application Service After=network.target After=mysql.service Wants=mysql.service [Service] Type=simple User=www-data Group=www-data WorkingDirectory=/var/www/project # PHP脚本执行 ExecStart=/usr/bin/php /var/www/project/worker.php # 环境变量 Environment="APP_ENV=production" Environment="DB_HOST=localhost" # 安全配置 PrivateTmp=true ProtectSystem=full NoNewPrivileges=true RestrictRealtime=true RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX # 重启策略 Restart=always RestartSec=5s StartLimitInterval=400 StartLimitBurst=3 # 资源限制 LimitNOFILE=65535 LimitNPROC=4096 MemoryMax=512M CPUQuota=80% [Install] WantedBy=multi-user.target
常用PHP服务场景
队列处理服务
[Unit] Description=PHP Queue Worker Service After=redis.service [Service] User=www-data ExecStart=/usr/bin/php artisan queue:work --sleep=3 --tries=3 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
WebSocket服务
[Unit] Description=PHP WebSocket Server After=network.target [Service] ExecStart=/usr/bin/php /var/www/socket/server.php start ExecStop=/usr/bin/php /var/www/socket/server.php stop ExecReload=/usr/bin/php /var/www/socket/server.php restart Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
PHP-FPM服务
[Unit] Description=PHP FastCGI Process Manager After=network.target [Service] Type=forking PIDFile=/run/php/php-fpm.pid ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php/fpm/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
管理服务命令
# 重新加载配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start php-service # 停止服务 sudo systemctl stop php-service # 重启服务 sudo systemctl restart php-service # 启用开机自启 sudo systemctl enable php-service # 禁用开机自启 sudo systemctl disable php-service # 查看状态 sudo systemctl status php-service # 查看日志 sudo journalctl -u php-service -f # 查看最近100行日志 sudo journalctl -u php-service -n 100 # 实时查看日志 sudo journalctl -u php-service -f --since "1 hour ago"
高级配置技巧
环境变量管理
创建环境变量文件 /etc/php-service.env:
APP_ENV=production DB_HOST=localhost DB_PORT=3306 REDIS_HOST=127.0.0.1 LOG_LEVEL=error
在服务文件中引用:
[Service] EnvironmentFile=/etc/php-service.env
多实例服务模板
创建 php-worker@.service:
[Unit] Description=PHP Worker Service %i After=redis.service [Service] User=www-data WorkingDirectory=/var/www/project ExecStart=/usr/bin/php artisan queue:work --queue=%i Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
启动多个实例:
sudo systemctl start php-worker@high@php-worker@medium@php-worker@low
监控和通知
创建监控服务 /usr/local/bin/php-health-check.sh:
#!/bin/bash
SERVICE="php-service"
STATUS=$(systemctl is-active $SERVICE)
if [ "$STATUS" != "active" ]; then
# 发送告警
echo "Service $SERVICE is down!" | mail -s "Service Alert" admin@example.com
# 尝试重启
systemctl restart $SERVICE
fi
配合systemd定时器使用:
# /etc/systemd/system/php-health-check.timer [Unit] Description=PHP Service Health Check [Timer] OnCalendar=*:0/5 Persistent=true [Install] WantedBy=timers.target
安全性优化
[Service] # 用户权限 User=www-data Group=www-data # 文件系统保护 ProtectSystem=strict ReadWritePaths=/var/www/project/storage ReadWritePaths=/var/log/php-service # 关闭不需要的系统调用 SystemCallFilter=@system-service # 内存保护 MemoryDenyWriteExecute=true # 网络访问控制 #如果不需要网络 PrivateNetwork=true # 限制访问其他进程 ProtectKernelTunables=true ProtectControlGroups=true # 隐藏进程信息 HidePID=true
调试和故障排除
日志查询命令
# 实时日志 journalctl -u php-service -f -o json # 错误日志 journalctl -u php-service -p err -b # 特定时间范围 journalctl -u php-service --since "2024-01-01" --until "2024-01-02" # 查看PID systemctl show php-service | grep MainPID
使用strace调试
# 跟踪服务进程 sudo strace -p $(systemctl show php-service -p MainPID | cut -d= -f2) -e trace=network,file
性能监控模板
创建监控配置 /etc/systemd/system/php-service.service.d/monitor.conf:
[Service] # CPU Profile CPUAccounting=true CPUWeight=100 # Memory Profile MemoryAccounting=true MemoryMax=512M MemoryHigh=384M # IO Profile IOAccounting=true IOWeight=100 # Task Profile TasksAccounting=true TasksMax=50
查看监控数据:
systemd-cgtop systemctl show php-service | grep -E "(CPU|Memory|IO)"
部署脚本示例
#!/bin/bash # deploy-php-service.sh SERVICE_NAME="php-service" PROJECT_DIR="/var/www/project" PHP_BIN="/usr/bin/php" # 部署前停止服务 sudo systemctl stop $SERVICE_NAME # 更新代码 cd $PROJECT_DIR git pull origin main # 安装依赖 $PHP_BIN composer install --no-dev --optimize-autoloader # 运行迁移 $PHP_BIN artisan migrate --force # 清除缓存 $PHP_BIN artisan optimize:clear # 启动服务 sudo systemctl start $SERVICE_NAME # 检查状态 sudo systemctl status $SERVICE_NAME --no-pager echo "Deployment completed!"
通过以上配置,你可以为PHP项目创建稳定、可管理的systemd服务,实现自动化管理和监控。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播