Nginx反向代理Gοοgle
一、情景
在某些网络环境下不能使用代理,如管理较为严格的公司中,但仍有访问Gοοgle的需求。这种情况下可以事先搭建好Gοοgle反向代理,在公司时通过访问反向代理来使用Gοοgle搜索。前提条件是有一台在公司可以访问且它也可以访问Gοοgle的VPS(Virtual Private Server 虚拟专用服务器)。
二、配置
我选择使用Nginx来建反向代理,我的Nginx版本是:
nginx/1.10.3 (Ubuntu)
给出配置文件:
server {
listen 80;
listen [::]:80;
server_name search.werner.wiki;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name search.werner.wiki;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/httppasswd.users;
ssl_certificate ssl/chain.pem;
ssl_certificate_key ssl/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
underscores_in_headers on;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
location / {
proxy_pass https://www.google.com;
sub_filter www.google.com search.werner.wiki;
sub_filter_once off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Accept-Language "zh-CN";
proxy_set_header Accept-Encoding "gzip, deflate, br";
proxy_redirect http://www.google.com/ /;
proxy_cookie_domain google.com search.werner.wiki;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
}
}
三、详细说明
配置文件的含义如下:
(1) 服务名为search.werner.wiki
server_name search.werner.wiki;
这句话的含义是服务名为search.werner.wiki,即只有头部Host字段值为search.werner.wiki的HTTP请求才归此配置文件。
(2) 80跳转443
server {
listen 80;
listen [::]:80;
server_name search.werner.wiki;
rewrite ^(.*) https://$server_name$1 permanent;
}
这一段配置新建了一个服务,监听80端口,永久(permanent)重定向(rewrite)所有请求(^(.*))到https,参数不变($1)。
(3) 开启HTTP基本认证
开启认证的原因是Gοοgle反向代理使用的人越少,生命力越强。
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/httppasswd.users;
这两句开启了HTTP基本认证,认证由Nginx的ngx_http_auth_basic_module模块提供。
auth_basic可设置为off或其它字符串,为off时表示不开启密码认证。为其他字符串时表示需要密码认证,字符串内容是任意的,在某些版本的浏览器中,它会显示在弹出的认证框中。
auth_basic_user_file 为包含用户名和密码的文件,最好写成绝对路径,文件内容为一行一个用户名和密码,用户名和密码之间用冒号分隔。密码当然不是明文存储的,支持以下几种加密方式:
- 采用系统函数crypt()加密,可通过htpasswd命令或者openssl passwd命令生成;
- 采用Apache提供的基于MD5的变种哈希算法(apr1)加密,同样可通过htpasswd或者openssl passwd命令生成;
- 以“{scheme}data”格式(RFC 2307)表示的加密后的密码,其中scheme指的是加密算法,Nginx支持的加密算法有PLAIN, SHA,SSHA算法。
我使用如下的命令生成用户名和密码:
sudo htpasswd -bc /etc/nginx/httppasswd.users Admin DWfvmAGMvGNOadmEjF
(4) 配置HTTPS
将反向代理配置为通过HTTPS更加安全。相关配置为:
ssl_certificate ssl/chain.pem; # 证书
ssl_certificate_key ssl/private.key; # 私钥
ssl_session_cache shared:SSL:1m; # SSL会话缓存,提供性能
ssl_session_timeout 5m; # SSL会话超时时间
ssl_ciphers HIGH:!aNULL:!MD5; # 不使用MD5等弱密码组件
ssl_prefer_server_ciphers on; # SSLv3或TLSv1握手时服务器密码优先
(5) 跨域头部设置
不忽略HTTP头部中的下划线:
underscores_in_headers on;
HTTP响应头中添加字段以支持跨域访问:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
(6) 反向代理相关配置
proxy_pass https://www.google.com;
反向代理的目标地址。
sub_filter www.google.com search.werner.wiki;
替换返回页面中的字符串“www.google.com”为“search.werner.wiki”。注意若是被代理服务器返回压缩过的页面,则替换不能成功。
sub_filter_once off;
关闭只替换一次,即全部替换。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
在代理发出的HTTP请求头中添加字段。添加这些字段让被代理服务器可以获取到访问者真实IP地址。换句话说,有这些字段,这个代理便不是高匿代理。
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Accept-Language "zh-CN";
proxy_set_header Accept-Encoding "";
在代理发出的HTTP请求头中添加字段。这些字段是浏览器用户代理,语言和接受的编码。”Accept-Encoding”设置为空,防止被代理服务器返回压缩内容,使得内容替换配置失效。
proxy_redirect http://www.google.com/ /;
修改从被代理服务器传来的HTTP响应的头部中的”Location”和”Refresh”字段,将“http://www.google.com/”重写为“/”。
proxy_cookie_domain google.com search.werner.wiki;
修改从被代理服务器传来的HTTP响应的头部set-cookie中的domain,将domain的值由“google.com”替换为“search.werner.wiki”。
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
设置几个超时时间。
四、后记
反向代理的好处是只要有浏览器便可以使用Gοοgle搜索,就像使用百度搜索一样方便。缺点是只能使用Gοοgle搜索,不能访问Facebοοk等网站。但这有什么关系呢?只要能使用Gοοgle搜索就足够了。