基于Nginx实现谷歌反向代理

这两天舅舅闲的无聊开虚拟信用卡开了个AWS,其实也是因为最近(应该说很久以来)广大人民功夫网成功升级以后GAE作死门PPTP什么的全线OVER。在帮他配完AWS的Shadowsock以后我寻思着毕竟之前拿搬瓦工最低配开的美国Shadowsock代理实在慢的离谱,为了避免用谷歌还要忍受坑爹的网(tian)络(chao),刚好我这边因为开博客多了一台AWS的服务器,就想着用Nginx的反向代理实现下试试。 然而度娘却十分的不给力,整个搜索结果全部TMD是一个模式,完全没有P用,甚至有些配置文件给出的方式使用HTTP 1.0 (然而2.0都快出来了你特么在逗我)。在苦心翻了大半天以后,总算找到了个好用的。 原文地址在此。当然,我个人操作上有了一些不同。 由于之前服务器用的是Apache2,所以在此之前先卸载Apache2 sudo apt-get remove apache2 然后全新安装Nginx sudo apt-get install nginx 反正Ubuntu的那啥蛮快的,过会儿就好系列。 然后编辑Nginx配置文件 cd /etc/nginx/sites-available sudo nano default 按照我的想法,由于国内屏蔽谷歌,因此直接明文(80端口)搜索可能会被打断,进而考虑使用HTTPS加密。因此在80端口监听请求,然后强制跳转https。

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/com.itncre/;
index index.php index.html index.htm;
# Make site accessible from http://localhost/
server_name itncre.com www.itncre.com;
#rewrite ^(.*)$ https://$host$1 permanent;
return 301 https://$server_name$request_uri;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ /.ht {
deny all;
}

}

然后。。。。。。。坑爹时刻来了。我之所以说度娘坑爹,因为我搜出来这里各种千奇百怪的配法,最坑爹的情况是我反向代理配置完了TMD居然跳转谷歌自己的域名了(然而,国内是屏蔽滴)。。。。。。 想想也是蛋疼。为了配个反代,光是重启Nginx失败都多少次了,差点让我疯狂到砸电脑。 好吧,不废话。直接上配置文件。

proxy_cache_path /var/cache/com.itncre/cache levels=1:2 keys_zone=one:10m max_size=1g;
proxy_cache_key “$host$request_uri”;
upstream google{
server 172.217.0.132:443 max_fails=3;
server 74.125.200.199:443 max_fails=3;
}
server{
server_name g.itncre.com;
index index.php index.html;
server_tokens off;
listen 443 http2;
ssl on;
ssl_certificate /etc/ssl/g.crt;
ssl_certificate_key /etc/ssl/g.key;
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:!MEDIUM:!LOW”;
add_header Strict-Transport-Security “max-age=31607200”;
ssl_session_cache shared:SSL:5m;
ssl_session_timeout 5m;
resolver 8.8.8.8;
ssl_stapling on;
ssl_trusted_certificate /etc/ssl/g.crt;
location / {
proxy_cache one;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_redirect https://www.google.com/ /;
proxy_pass https://google;
proxy_set_header Host “www.google.com";
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_set_header Accept-Language “zh-CN”;
proxy_set_header Accept-Encoding “”;
proxy_set_header Cookie “PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=zh-CN:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2w1IQ-Maw”;
sub_filter www.google.com g.itncre.com;
sub_filter_once off;
}
# location ~ .php$ {
# fastcgi_split_path_info ^(.+.php)(/.+)$;
# fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
# include fastcgi_params;
# fastcgi_param HTTPS on;
# }
}

解释说明:第一行指定缓存请求的位置,以及最大缓存文件大小。第二行指定缓存保存关键字。 upstream里面是谷歌的服务器地址。nslookup www.google.com.hk就可以看到。 然后就是常规的server段,不过这部分中包括了SSL的配置。其中:

  • server_tokens off避免将服务器处理程序版本暴露,以免针对攻击。
  • ssl_certificate为证书文件地址,key为私钥文件。
  • ssl_protocols为允许的SSL协议。由于心血漏洞和POODLE漏洞,一般情况只开TLS。SSLv3及以下都不被推荐甚至是强烈反对的。
  • ssl_prefer_server_ciphers 表示服务器选择加密方式对(这玩意儿好像意思是由服务器决定加密传输的方式和算法)
    • ssl_ciphers 传输加密算法。在这里我禁用了任何RC4,DES,MD5这类弱算法,因为破解难度并不高了。
    • add_header Strict-Transport-Security “max-age=7200”; 参见WIKI对“HSTS”技术的解释。

Location段意思则是很明显的,除了Cookie部分。原作者的解释是:

传固定的cookie给谷歌,是为了禁止即时搜索,因为开启即时搜索无法替换内容。还有设置为新窗口打开网站,这个符合我们打开链接的习惯。

嗯,好吧,按照说得来,配置,重启,搜索,OK了。 然而为了搜索资料上谷歌(度娘坑B不解释系列),这B装的也真是特么不容易:) p.s. 服务器的SSL证书可以免费申请。一个是StartSSL,一个是沃通的免费SSL。搜索下就有~