玩转nginx:用nginx搭建正向代理,支持http和https

什么是代理,什么是正向代理,什么是反向代理,详见代理那些事

用nginx搭建反向代理,这个是nginx最大的功能,网上资料一大堆,这里不再复述。

用nginx搭建正向代理,假如只是http的代理,那么网上也是一大堆,也都是正确的;但是https的代理,网上所讲得一大堆,绝大部分是错误的。(吐槽一下,明明是很明显错误的内容,难道作者都没有验证一下就发出来吗?)希望读者能通过搜索引擎找到我这一篇文章,而不是先找到那些错误的文章,耗时耗精力。

nginx的正向代理支持https,其实也是很简单,只要 nginx 加入 ngx_http_proxy_connect_module 这个模块即可。(所以网上的文章假如说支持https的nginx正向代理没有提到 ngx_http_proxy_connect_module 这个模块,看都不用看,是错误的)

下面是安装步骤:
#所有操作在 /opt 目录下
cd /opt
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar xzvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
patch -p1 < /opt/ngx_http_proxy_connect_module/patch/proxy_connect_xxxx.patch
#注意这里选用的补丁文件proxy_connect_xxxx.patch需要参照 https://github.com/chobits/ngx_http_proxy_connect_module 中的nginx不同版本来决定,如下所示:

因为我们的nginx是1.14版本,参照上面,所以上面的命令应该是:
patch -p1 < /opt/ngx_http_proxy_connect_module/patch/proxy_connect_1014.patch
假如不成功,会显示错误信息。成功后,进行编译nginx
./configure --add-module=/path/to/ngx_http_proxy_connect_module
make && make install

然后nginx的配置如下:

server {
        listen 6281;
        resolver 114.114.114.114;

        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_read_timeout     10s;
        proxy_connect_send_timeout     10s;

        location / {
                #下面的居然是 http 而不是 https,很奇怪的设置,但是事后验证确实没有问题
                proxy_pass      http://$host;
                proxy_set_header        Host $host;
        }
}

然后启动nginx,这样即可支持 https 的正向代理。

另外多说两句:
1. 一定要知道这样一件很重要的事情,nginx的 http/https的代理,是不支持认证的(不是说nginx不支持认证,而是这种机制下认证是没有用的),所以该代理只能放在内网里,否则你就等着哪一天突然你的外网nginx被别人使用了。
2. 支持 http/https 的代理,还可以用 tinyproxy。