Total Pageviews

Saturday 18 February 2012

用nginx webserver替被封的网站做反向代理

研究了一下用自己的主机给 *.wordpress.com 做反向代理的方法。研究过程很纠结。我先把结论拿出来,然后大概解释下为什么。
比如,我希望把annsherry.wordpress.com 绑定到 liruqi.me。步骤如下:
1. 重新编译 nginx, 加上 HttpSubModule(http://wiki.nginx.org/HttpSubModule) 模块。简而言之,是 ./configure 时加上参数 –with-http_sub_module 其它参数保持不变即可。
2. 修改Nginx 配置。在 http 块中加入 server:
server {
listen   80;
server_name liruqi.me;
location / {
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  Accept-Encoding  ”";
proxy_pass http://annsherry.wordpress.com;
sub_filter annsherry.wordpress.com liruqi.me;
sub_filter_once off;
}
}
3. 启动 nginx 或者重新加载配置文件.
只要 域名 liruqi.me 是指向正确的主机ip, 反向代理就做好了。而且点链接不会跳回到 annsherry.wordpress.com 域名上。
大概说下原理。
a) *.wordpress.com 上的连接不少是绝对路径。如果直接proxy_pass ,再点一次连接就会回到 wordpress 域名上。所以这里做了一个简单的文本替换。
HttpSubModule 仅支持单模式的纯文本替换,不支持正则表达式。如果希望用正则,做一个更复杂的替换,可以考虑一个华人开发的 HttpSubsModule (http://wiki.nginx.org/HttpSubsModule) 第三方模块。
b) proxy_set_header  Accept-Encoding  ”";  这一项,可以让nginx 不法送 Accept-Encoding HTTP header。这个时候,wordpress 返回的页面是不做 gzip压缩的。因为gzip 压缩之后,文本替换就会失效了。
国外有VPS的同学(而且ip没被墙的),可以考虑用类似的方式给自己的 blogspot 或者其它博客做反向代理.
from http://liruqi.wordpress.com/2011/02/26/reverse-proxy-for-wordpress/