52ll.org
52ll.org

使用 Nginx 反代谷歌与 wikipedia

本文使用 lnmp.org 提供的 lnmp 一键脚本进行相关示范,使用 lnmp1.4lnmp1.5 均可

获取lnmp1.5

wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz
tar zxf lnmp1.5.tar.gz

操作步骤

1. 编译 ngx_http_substitutions_filter_module 模块

分两种情况

已安装nginx的

编辑/root/lnmp1.5/lnmp.conf文件,找到位于第4行的Nginx_Modules_Options,在两个单引号之间插入--add-module=/root/ngx_http_substitutions_filter_module,保存

然后在/root目录下执行命令

git clone "https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git"

然后进入/root/lnmp1.5目录下

./upgrade.sh

输入1,回车,然后输入你当前的nginx版本号(Current Nginx Version这里的值),回车,回车,然后等待编译完成

https://52ll.org/wp-content/uploads/2018/08/nginx-reverse-proxy-1.png

未安装nginx的

/root目录下执行命令

git clone "https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git"

然后编辑/root/lnmp1.5/lnmp.conf文件,找到位于第4行的Nginx_Modules_Options,在两个单引号之间插入--add-module=/root/ngx_http_substitutions_filter_module,保存

最后,在/root/lnmp1.5目录下执行命令(仅会安装nginx

./install.sh nginx

2. 检查已编译的模块

输入nginx -V查看已编译的模块,包含--add-module=/root/ngx_http_substitutions_filter_module即可

https://52ll.org/wp-content/uploads/2018/08/nginx-reverse-proxy-2.png

3. 添加配置文件

使用lnmp vhost add命令添加配置文件。这里假设你的域名是domain.com,如果只想要反代谷歌,只需要添加

  • domain.com
  • www.domain.com

如果还想要反代wikipedia,还需要添加

  • zh.m.wikipedia.domain.com
  • zh.wikipedia.domain.com

注:我是单买了一个域名来作为谷歌和维基百科的镜像站用的,所以二级、三级域名都是形似谷歌、维基百科域名的。比如google.com对应domain.com,www.google.com对应www.domain.com等(我的域名用domain.com代替表达)。假设你的域名是abc.com,你不一定必须要按照教程设置abc.com和www.abc.com作为镜像站点的域名,你也可以设置google.abc.com和www.google.abc.com,或是自由发挥,均不影响使用

设置SSL

这里简单说一下,你可以通过 freessl.org 免费申请亚洲诚信的一年有效期SSL证书,或是通过 lnmp 申请有效期三个月(虽然有效期是三个月,但脚本会自动续期,不必担心)的 Let’s Encrypt 免费SSL证书

使用亚洲诚信SSL证书

1.将SSL证书的crt文件和key文件上传至服务器
2.在Add SSL Certificate项时输入y,回车,然后输入1
3.输入crt文件和key文件的绝对路径

使用 Let’s Encrypt SSL证书

Add SSL Certificate项时输入y,回车,然后输入2

https://52ll.org/wp-content/uploads/2018/08/nginx-reverse-proxy-3.png

4. 编辑配置文件

下面贴出了各个域名的配置文件模板,你需要将配置文件模板里的domain.com修改成你的对应域名,可以使用 ctrl + h 替换

Nginx配置文件目录:/usr/local/nginx/conf/vhost

domain.com

这个配置模板对应 google.com 域名,将http和gttps的请求301重定向到 www.domain.com 处理

server
	{
		listen 80;
		server_name domain.com;
		return 301 https://www.domain.com$request_uri;
	}

server
    {
        listen 443 ssl http2;
        server_name domain.com;
	return 301 https://www.domain.com$request_uri;
		
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/domain.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/domain.com/domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
    }

www.domain.com

这个配置模板对应 www.google.com 域名

server
	{
		listen 80;
		server_name www.domain.com;
		return 301 https://$server_name$request_uri;
	}

server
    {
        listen 443 ssl http2;
        server_name www.domain.com ;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/www.domain.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/www.domain.com/www.domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
		
		location / {
			subs_filter 'www.google.com.hk' 'www.domain.com';
			subs_filter 'zh.wikipedia.org' 'zh.wikipedia.google1s.com';
			subs_filter_types text/css text/xml text/javascript;
			
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-Proto https;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Referer https://www.google.com.hk;
			proxy_set_header User-Agent $http_user_agent;
			proxy_set_header Host www.google.com.hk;
			proxy_pass https://www.google.com.hk;
			proxy_set_header Accept-Encoding "";
			proxy_set_header Accept-Language "zh-CN";
			proxy_set_header Cookie "PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=en-US:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2W1IQ-Maw";
			proxy_cookie_domain www.google.com.hk www.domain.com;
		}
    }

zh.wikipedia.org

这个配置模板对应 zh.wikipedia.org 域名

server
	{
		listen 80;
		server_name zh.wikipedia.domain.com;
		return 301 https://$server_name$request_uri;
	}

server
    {
        listen 443 ssl http2;
        server_name zh.wikipedia.domain.com ;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/zh.wikipedia.domain.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/zh.wikipedia.domain.com/zh.wikipedia.domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
		
		location / {
			subs_filter 'zh.wikipedia.org' 'zh.wikipedia.domain.com';
			subs_filter_types text/css text/xml text/javascript;
			
			proxy_pass https://zh.wikipedia.org;
			proxy_redirect 'https://zh.m.wikipedia.org' 'https://zh.m.wikipedia.domain.com';
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-Proto https;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Referer https://zh.wikipedia.org;
			proxy_set_header User-Agent $http_user_agent;
			proxy_set_header Host zh.wikipedia.org;
			proxy_set_header Accept-Encoding "";
			proxy_cookie_domain zh.wikipedia.org zh.wikipedia.domain.com;
		}
    }

zh.m.wikipedia.domain.com

这个配置模板对应 zh.m.wikipedia.org 域名

server
	{
		listen 80;
		server_name zh.m.wikipedia.domain.com;
		return 301 https://$server_name$request_uri;
	}

server
    {
        listen 443 ssl http2;
        server_name zh.m.wikipedia.domain.com ;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/zh.m.wikipedia.domain.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/zh.m.wikipedia.domain.com/zh.m.wikipedia.domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
		
		location / {
			subs_filter 'zh.m.wikipedia.org' 'zh.m.wikipedia.domain.com';
			subs_filter_types text/css text/xml text/javascript;
			
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-Proto https;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Referer https://zh.m.wikipedia.org;
			proxy_set_header User-Agent $http_user_agent;
			proxy_set_header Host zh.m.wikipedia.org;
			proxy_pass https://zh.m.wikipedia.org;
			proxy_set_header Accept-Encoding "";
			proxy_cookie_domain zh.m.wikipedia.org zh.m.wikipedia.domain.com;
		}
    }

5. 重启Nginx

重启Nginx

lnmp nginx restart
https://52ll.org/wp-content/uploads/2018/08/nginx-reverse-proxy-5.png

如果没有报错,那就能用了。如果报错了,那就根据错误提示一步步排查,并解决问题

你可能会遇到的问题

访问镜像站点却跳转到了谷歌

谷歌会根据访问IP的归属地,将访问 www.google.com 的请求重定向到归属地的站点(如香港IP的访问会重定向到 www.google.com.hk,新加坡IP的访问会重定向到 www.google.com.sg)

如果你访问你的镜像站点,却被重定向到了谷歌的另一个站点,那只需要将这个站点的域名作为源站,修改 www.domain.com 域名的 nginx 配置文件,将配置文件中的 www.google.com.hk 全部替换为重定向到的这个站点的域名,然后重启 nginx 即可

重启nginx时报错

如果你使用了自己的SSL证书,或是使用了亚洲诚信签发的证书,在重启 nginx 时报错,那你需要将使用这些 SSL 证书的域名的 nginx 配置文件中的

ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

注释掉(在 ssl_dhparam 前面加上“#”号),然后重启 nginx

参考来源

https://www.moerats.com/archives/445/

52ll.org

使用 Nginx 反代谷歌与 wikipedia
本文使用 lnmp.org 提供的 lnmp 一键脚本进行相关示范,使用 lnmp1.4 和 lnmp1.5 均可 获取lnmp1.5 wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz tar zxf lnmp…
扫描二维码继续阅读
2018-08-20