nginx 正向代理

正向代理:局域网中的客户端不能直接访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。Nginx本身只支持http的正向代理,并通过ngx_http_proxy_connect_module模块支持http、https的正向代理;

反向代理:如果局域网向Internet提供资源服务,让Internet上的其他客户端来访问局域网内不的资源,使它们必须通过一个代理服务器来进行访问内部资源,这种服务就称为反向代理;Nginx通过proxy模块实现反向代理功能。

假设现在的环境是,局域网中只有一台机器:192.168.10.154配有某个公网IP,如此可以直接访问公网,而其他局域网服务器需要通过154上的代理来访问公网: 

正向代理http:

1、# vim /etc/nginx/conf.d/proxy.conf

server {

resolver 8.8.8.8; 

listen 9999;

access_log /var/log/nginx/proxy.access.log main;

error_log /var/log/nginx/proxy.error.log;

location / {

proxy_pass http://$http_host$request_uri;

}

}

2、在需要访问公网的服务器配置环境变量

# vim /etc/profile

export http_proxy=http://192.168.10.154:9999

# source /etc/profile

yum源配置:

# vim /etc/yum.conf    

proxy=http://192.168.10.154:9999

通过curl指定代理来测试http串是否返回200

# curl -x 192.168.10.154:9999 -I http://xxxx.xxxx.xxxx/xxx.xxx

3、不支持代理 Https 网站

作为 web_server Nginx 当然是可以处理 ssl 的,但作为proxy则是不行的。因为nginx不支持CONNECT,收到“CONNECT /:443 HTTP/1.1”后会报一个包含“client sent invalid request while reading client request line,” 的错误。因为 CONNECT 是正向代理的特性。

例:

访问:# curl -I -x 192.168.10.154:9999 'https://www.baidu.com/?tn=93380420_hao_pg'

日志:192.168.10.X - [04/Nov/2017:10:23:46 +0800] "CONNECT www.baidu.com:443 HTTP/1.1" 400 173 "-" "-" - - - - "-"

那么,如何让nginx的正向代理,既支持http又支持https的代理访问呢?

需要安装模块:ngx_http_proxy_connect_module

1、安装(具体省略)

./configure --add-module=/path/to/ngx_http_proxy_connect_module

make && make install

2、配置

server {

    listen 3128;

    # dns resolver used by forward proxying

    resolver 8.8.8.8;

    # forward proxy for CONNECT request

    proxy_connect;

    proxy_connect_allow 443 563;

    proxy_connect_connect_timeout 10s;

    proxy_connect_read_timeout 10s;

    proxy_connect_send_timeout 10s;

    # forward proxy for non-CONNECT request

    location / {

        proxy_pass http://$host;

        proxy_set_header Host $host;

    }

}

3、测试

# curl https://github.com/ -v -x 192.168.10.154:3128

……

HTTP/1.0 200 Connection Established

……

推荐阅读更多精彩内容