MacOS下Supervisord运行Laravel应用出现Guzzle/Curl error 7问题
问题解决步骤
这个问题核心是Supervisor托管进程的运行环境与你手动执行命令的环境不一致,导致网络出站请求被阻断,按以下顺序排查即可:
1. 修正Supervisor程序配置的用户与环境变量
你手动执行命令时的用户、代理等环境变量不会被Supervisor默认继承,需要显式配置:
- 在你的
octane和测试用的curl_test配置块中添加user参数,值为你手动执行php artisan octane:start时使用的普通用户名(如ubuntu、www-data等,不推荐直接用root) - 如果你当前网络需要代理才能访问外网,添加
environment参数声明代理环境变量
修改后测试配置参考:
[program:curl_test] process_name=%(program_name)s user=ubuntu # 替换为你自己的用户名 # 无代理可删除下一行 environment=http_proxy="http://127.0.0.1:7890",https_proxy="http://127.0.0.1:7890" command=/bin/sh -c "curl -v google.com" autostart=true loglevel=debug autorestart=false stdout_logfile=/tmp/curl-test.log redirect_stderr=true
修改完成后重载配置生效:supervisorctl reread && supervisorctl update
重启测试程序查看日志是否恢复正常。
2. 排查系统安全模块限制
SELinux、AppArmor等安全模块默认会阻断后台服务的网络出站请求:
- 如果你使用CentOS/RHEL/Fedora系统:
临时关闭SELinux验证:setenforce 0
若测试正常,永久放行后台服务网络权限:setsebool -P httpd_can_network_connect on - 如果你使用Debian/Ubuntu系统:
临时卸载Supervisor的AppArmor规则验证:apparmor_parser -R /etc/apparmor.d/supervisor
若测试正常,调整AppArmor规则允许Supervisor管理的进程访问网络即可。
3. 排查systemd对Supervisor的网络限制
当前主流发行版的Supervisor均由systemd托管,默认可能开启网络隔离限制:
打开Supervisor的systemd配置文件(路径通常为/usr/lib/systemd/system/supervisor.service或/etc/systemd/system/supervisor.service),检查是否存在以下配置项:
PrivateNetwork=trueRestrictAddressFamilies=~AF_INET AF_INET6IPAddressDeny=any
删除上述限制项后执行:systemctl daemon-reload && systemctl restart supervisor
再测试请求是否正常。
4. 排查iptables/ufw规则限制
部分防火墙规则会针对root用户或后台进程组做出站限制,可先手动以root身份执行curl验证:sudo curl -v google.com
若root身份执行也报错,调整防火墙规则放开对应用户的出站访问,或者始终使用普通用户运行Supervisor托管的程序。
内容的提问来源于stack exchange,提问作者Layiwola Akinnagbe
相关产品推荐
相关产品推荐

