8

加速国内 WordPress 站点官方后台服务访问(以腾讯轻量为例)

 3 years ago
source link: https://www.v2ex.com/t/778349
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  云计算

加速国内 WordPress 站点官方后台服务访问(以腾讯轻量为例)

  LuminousKK · 4 小时 53 分钟前 · 478 次点击

通过反代官方 API 加速位于国内的 WordPress 站点访问更新、主题等等服务的方法,最初国内 429 的时候 WP-ChinaYes 那个项目提出来的。那时候研究了下用一个域名完成整个反代,稳定使用了接近一年了,分享出来~

WP-ChinaYes 后来走了劫持并二次处理官方 API 的路线,个人不是很喜欢;而且个人需求也没到他们规划的程度,自己搭建的安全性方面也更放心。

在这里服务器推荐腾讯的轻量,香港或者硅谷到大陆链路都不错,我测试到国内腾讯云、华为云、UCloud 等等云厂都是走的 CN2 回国,24 一个月速度很棒也很划算,拿来搭建这样的服务非常合适。

*注意鹅厂的轻量不能给你在阿里云国内机器上的用,两家不和绕的很感人很慢很慢。


准备一个反代的域名,例如 proxy.example.com (文件中 20 处自行替换),SSL 自己配置好,反代的配置文件如下:

#PROXY-API
location /api/
{
    proxy_pass https://api.wordpress.org/;
    proxy_set_header Host api.wordpress.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Accept-Encoding "";
    proxy_redirect   https://developer.wordpress.org https://proxy.example.com/developer.wordpress.org;
    
    gzip off;
    sub_filter                 ps.w.org                 proxy.example.com/ps.w.org;
    sub_filter                 downloads.wordpress.org  proxy.example.com/dl;
    sub_filter                 profiles.wordpress.org   proxy.example.com/profiles.wordpress.org;
    sub_filter                 secure.gravatar.com      proxy.example.com/secure.gravatar.com;
    sub_filter                 0.gravatar.com           proxy.example.com/secure.gravatar.com;
    sub_filter                 1.gravatar.com           proxy.example.com/secure.gravatar.com;
    sub_filter                 2.gravatar.com           proxy.example.com/secure.gravatar.com;
    sub_filter                 ts.w.org                 proxy.example.com/ts.w.org;
    sub_filter                 wp-themes.com            proxy.example.com/wp-themes.com;
    sub_filter                 s.w.org                  proxy.example.com/s.w.org;
    sub_filter                 wordpress.org            proxy.example.com/wordpress.org;
    sub_filter_last_modified   on;
    sub_filter_once            off;
    sub_filter_types           application/json;
    
}
#PROXY-DL
location /dl/
{
    proxy_pass https://downloads.wordpress.org/;
    proxy_set_header Host downloads.wordpress.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_redirect   https://wordpress.org/download/ https://proxy.example.com/wordpress.org/download/;
}
#PROXY-Developer
location /developer.wordpress.org/
{
    proxy_pass https://developer.wordpress.org/;
    proxy_set_header Host developer.wordpress.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Accept-Encoding "";
    
    gzip off;
    sub_filter                 downloads.wordpress.org proxy.example.com/dl;
    sub_filter                 developer.wordpress.org proxy.example.com/developer.wordpress.org;
    sub_filter                 ps.w.org                proxy.example.com/ps.w.org;
    sub_filter_last_modified   on;
    sub_filter_once            off;
}
#PROXY-WPORG
location /wordpress.org/
{
    proxy_pass https://wordpress.org/;
    proxy_set_header Host wordpress.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Accept-Encoding "";
    
    gzip off;
    sub_filter                 //wordpress.org         //proxy.example.com/wordpress.org;
    sub_filter                 s.w.org                 proxy.example.com/s.w.org;
    sub_filter                 downloads.wordpress.org proxy.example.com/downloads.wordpress.org;
    sub_filter_last_modified   on;
    sub_filter_once            off;
}
#PROXY-WP-Theme
location /wp-themes.com/
{
    proxy_pass https://wp-themes.com/;
    proxy_set_header Host wp-themes.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Accept-Encoding "";
    
    gzip off;
    sub_filter wp-themes.com proxy.example.com/wp-themes.com;
    sub_filter_last_modified on;
    sub_filter_once off;
}
#PROXY-Profiles
location /profiles.wordpress.org/
{
    proxy_pass https://profiles.wordpress.org/;
    proxy_set_header Host profiles.wordpress.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;    
}
#PROXY-Secure
location /secure.gravatar.com/
{
    proxy_pass https://secure.gravatar.com/;
    proxy_set_header Host secure.gravatar.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
}
#PROXY-Ps
location /ps.w.org/
{
    proxy_pass https://ps.w.org/;
    proxy_set_header Host ps.w.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
}
#PROXY-TS
location /ts.w.org/
{
    proxy_pass https://ts.w.org/;
    proxy_set_header Host ts.w.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
}
#PROXY-S
location /s.w.org/
{
    proxy_pass https://s.w.org/;
    proxy_set_header Host s.w.org;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
}

然后把 WP-ChinaYes 的核心代码加到主题的 functions.php 即可,proxy.example.com 改成你搭建好的反代:

/**
 * WP-ChinaYes
 * https://github.com/litepress/wp-china-yes/tree/custom
 */ 
function my_pre_http_request($preempt, $r, $url) {
    if ( ! stristr($url, 'api.wordpress.org') && ! stristr($url, 'downloads.wordpress.org')) {
        return false;
    }
    $url = str_replace('api.wordpress.org', 'proxy.example.com/api', $url);
    $url = str_replace('downloads.wordpress.org', 'proxy.example.com/dl', $url);
    return wp_remote_request($url, $r);
}

add_filter('pre_http_request', 'my_pre_http_request', 10, 3);

最后就是注意,这个 NGINX 的 vhost 一定要关闭掉 php 解析哦,不然会有些莫名其妙的错误,效果如图:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK