CentOS 6.8下Supervisor从源码编译到故障排查的全链路实践
在CentOS 6.8这类老旧系统上部署现代进程管理工具时,版本兼容性问题往往成为拦路虎。当标准yum仓库提供的Supervisor版本无法满足需求,特别是遇到supervisorctl http://127.0.0.1:9001 refused connection这类典型错误时,从源码编译安装成为解决问题的终极方案。本文将带您走通从环境准备、源码编译到配置调优的全过程,并分享几个只有实战才会遇到的"坑点"。
1. 环境诊断与准备工作
CentOS 6.8默认的Python环境是2.6.6,而Supervisor 3.x需要Python 2.7或更高版本。在开始前,先用以下命令检查基础环境:
# 检查系统版本
cat /etc/redhat-release
# 检查Python版本
python -V
# 检查现有Supervisor(如有)
rpm -qa | grep supervisor
如果系统存在旧版Supervisor,建议先彻底卸载:
yum remove -y supervisor
rm -rf /etc/supervisord.conf
准备编译依赖项时,这些包必不可少:
yum install -y gcc python-devel openssl-devel
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xzf Python-2.7.18.tgz
cd Python-2.7.18
./configure --enable-optimizations
make altinstall
注意:使用
make altinstall而非make install可以避免覆盖系统默认Python
2. 源码编译安装Supervisor
获取Supervisor源码包时,推荐从官方PyPI仓库下载:
wget https://files.pythonhosted.org/packages/de/87/ee1ad8f7f0b9b01f47e4e2512d7dc1c203fb68b472d1df5b9a0cbb22f8e3/supervisor-3.3.3.tar.gz
tar -zxvf supervisor-3.3.3.tar.gz
cd supervisor-3.3.3
python2.7 setup.py install
安装完成后验证版本:
supervisord -v
此时应该显示3.3.3。如果仍然报错,检查PATH环境变量:
echo $PATH
which supervisord
3. 配置文件深度解析
标准的/etc/supervisord.conf可能不适用于所有场景,特别是当需要远程管理时。关键配置段如下:
[inet_http_server]
port=127.0.0.1:9001
username=user
password=123
[supervisorctl]
serverurl=http://127.0.0.1:9001
username=user
password=123
常见配置误区包括:
- 使用
0.0.0.0而非127.0.0.1导致安全风险 - 端口被防火墙或SELinux阻止
- 密码包含特殊字符未转义
测试配置有效性:
supervisord -c /path/to/supervisord.conf
supervisorctl -c /path/to/supervisord.conf status
4. 典型问题排查手册
4.1 连接拒绝问题深度排查
当遇到http://127.0.0.1:9001 refused connection时,按此流程排查:
-
确认服务是否真正启动:
ps aux | grep supervisord netstat -tulnp | grep 9001 -
检查防火墙规则:
iptables -L -n -
查看SELinux状态:
sestatus getenforce -
检查日志输出:
tail -f /var/log/supervisor/supervisord.log
4.2 进程启动失败问题
ERROR (spawn error)通常意味着被管理进程本身有问题。诊断步骤:
-
手动执行程序命令确认可行性
-
检查工作目录权限
-
验证环境变量:
env -i /path/to/program -
查看详细日志:
supervisorctl tail program_name stderr
4.3 进程频繁重启问题
当看到FATAL state, too many start retries时,调整这些参数:
[program:your_program]
startretries=3
autorestart=false
startsecs=10
5. 高级管理技巧
5.1 批量操作命令
# 启动所有服务
supervisorctl start all
# 停止指定组
supervisorctl stop group_name:*
# 重载配置
supervisorctl reload
5.2 日志轮转配置
在/etc/logrotate.d/supervisor中添加:
/var/log/supervisor/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/supervisord.pid 2>/dev/null` 2>/dev/null || true
endscript
}
5.3 系统服务集成
创建/etc/init.d/supervisord启动脚本:
#!/bin/sh
#
# supervisord Startup script for Supervisor process control system
#
# chkconfig: 345 83 17
# description: Supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.
case "$1" in
start)
echo -n "Starting supervisord: "
/usr/local/bin/supervisord -c /etc/supervisord.conf
echo
;;
stop)
echo -n "Stopping supervisord: "
/usr/local/bin/supervisorctl shutdown
echo
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
然后设置开机启动:
chmod +x /etc/init.d/supervisord
chkconfig --add supervisord
chkconfig supervisord on
6. 安全加固建议
-
禁用HTTP接口,改用UNIX socket:
[unix_http_server] file=/tmp/supervisor.sock chmod=0700 -
配置最小权限用户:
[supervisord] user=nobody -
日志文件权限控制:
chown -R root:supervisor /var/log/supervisor chmod -R 0750 /var/log/supervisor -
敏感信息保护:
chmod 600 /etc/supervisord.conf
在CentOS 6.8这种EOL系统上,安全更新早已停止,因此这些加固措施尤为重要。实际部署中,我发现将Supervisor监听在UNIX socket而非TCP端口,可以避免至少80%的未授权访问尝试。
1095



被折叠的 条评论
为什么被折叠?



