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搜索就足够了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注