为JetPack插件的OutBound HTTP请求设置代理

JetPack是WordPress官方提供的建站插件,它可能是我用过的最好用的WordPress插件。

它用于扩展你的网站,把你的站点和WordPress账户体系连通起来,于是你便可使用WordPress为你提供的访问统计、评论审核、会员接入、移动端仪表盘和远程管理等功能。

但因为WordPress的敏感性,我的主机提供商(IDC)封锁了WordPress相关域名有段时间了。所以每次我登录后台时,JetPack插件都会提示我它无法建立和WordPress的出站连接(outbound request failed)。

这个outbound流量如果阻塞,你会发现你打开你网站和后台管理页面等都会变慢,因为jetpack会倾向等待outbound timeout以后才继续,故会阻塞你网站页面的加载。

具体而言,就是你主机上的PHP解析器(php-fpm)无法发起到jetpack.wordpress.com的直连HTTP请求,因为到该域名的出站请求被优化了。

所以,通常而言,你需要先在你的主机运行环境里面建立代理通道,然后通过HTTP_PROXY等环境变量指定给后台程序,使得它们能通过代理的隧道出口进行上网。

但是对于php解析器,就有些复杂了。因为php-fpm并不自动识别HTTP_PROXY等环境变量的。

所以,我们需要修改php-fpm的配置,具体而言就是www.conf这个配置文件,在配置中添加类似下方示例的代码:

env[HTTP_PROXY] = 10.0.0.1:8080
env[HTTPS_PROXY] = 10.0.0.1:8080

来为php-fpm强制添加环境变量。其中“env”就是用于给php-fpm添加环境变量的宏。

www.conf这个配置文件可能会存在在不同的地方,具体取决于你按照php-fpm的方式。如果是采用软件包形式的安装,它可能位于“/etc/php-fpm.d/www.conf”,如果是采用自编译安装的方式,它可能位于“/usr/local/php/etc/php-fpm.d/www.conf”。

更多信息,可以参考下方链接:


2025.05.20更新:

后续发现,给php-fpm设置全局代理的办法还不能完整解决这个问题。这个设置添加后,在Dashboard站点健康上只能解决JetPack的OutBound HTTPS的问题,无法解决OutBound HTTP问题。实际在服务器后台用命令手动测试JetPack的API的反馈也是如此(成功会返回OK):

http(s)://jetpack.wordpress.com/jetpack.test/1

然后我找了下,发现WordPress这个套件本身就支持设置全局代理的。设置以后,WordPress套件内所有outbound流量都会按照设置走代理,包括WordPress的插件的outbound流量。可参考下方链接:

WordPress使用代理服务器进行更新-一蓑烟雨

具体而言,就是在wp-config.php中添加下方的设置:

/* Configure HTTP Proxy Server */
define('WP_PROXY_HOST', '192.168.1.1');
define('WP_PROXY_PORT', '3128');
define('WP_PROXY_USERNAME', '');
define('WP_PROXY_PASSWORD', '');
define('WP_PROXY_BYPASS_HOSTS', 'localhost, 你的网站域名,你的所有主机域名等');

如此添加以后,本着最小原则,前面强制添加到php-fpm的环境变量也就可以删除了;并且必须删除,否则后面WordPress的站点健康可能报更多的错误,比如关于restful API的。

并且,务必记得在WP_PROXY_BYPASS_HOSTS中把你站点的各级域名添加进去,使得WordPress可以正确访问站点自身。否则这些请求会通过你的代理隧道在国外转一圈再回来,反而可能造成WordPress访问站点自身失败,进而影响到很多后台请求或者插件使用。

至此,我的站点健康的JetPack测试终于可以通过了。站点页面的加载也变快了。

更多背景,请参考:


关于DREAMSCAPER

I am what I seem.

用Facebook、WordPress或邮箱即可评论