本地正常线上报错111 Connection refused:iOS推送发送失败
iOS推送通知服务器端报111 Connection refused的排查方案
嘿,我来帮你搞定这个头疼的问题——本地跑PHP脚本能正常发iOS推送,一部署到服务器就炸出111 Connection refused,这基本都是服务器网络或配置层面的锅,咱们一步步排查:
最常见的原因:服务器防火墙/安全组拦了端口
苹果APNs推送需要连接特定端口,你得先确认服务器的防火墙和云服务商的安全组有没有放行这些出站端口:
- 开发测试环境:
gateway.sandbox.push.apple.com:2195 - 正式生产环境:
gateway.push.apple.com:2195
如果你的脚本用的是APNs的HTTP/2接口(现在更推荐的方式),还要确保443端口能正常出站。
检查服务器能不能解析APNs域名
在服务器上敲个命令试试:
nslookup gateway.push.apple.com
要是解析不出IP,那就是服务器DNS配置有问题,换个公共DNS(比如8.8.8.8)就能解决。
确认SSL证书的路径和权限
虽然本地能跑,但服务器上的证书可能出问题:
- 检查PHP脚本里加载的pem证书路径是不是绝对路径(服务器上相对路径容易出错)
- 证书文件的权限要让PHP进程能读取,比如设置成
chmod 644 your-cert.pem,所属组和web服务器进程一致(比如www-data) - 还要确认证书没过期,而且是对应环境的(开发用沙箱证书,生产用正式证书,别搞混了)
服务器网络出口被限制
有些虚拟主机或者服务器提供商默认会封掉2195这类非通用端口,这种情况可以:
- 联系服务商确认是否开放了对应端口
- 改用APNs的HTTP/2接口(用443端口,这个几乎不会被封)
另外提个小细节:你代码里的消息内容里的链接写法有问题,<ahref="http://google.com">应该改成<a href="http://google.com">,虽然这不是连接拒绝的原因,但会导致推送内容里的链接失效哦。
内容的提问来源于stack exchange,提问作者Mohammad tavakoly




