首页 > 技术文章 > nginx 正向代理

dangwgKing 2017-11-04 13:36 原文

 

正向代理:局域网中的客户端不能直接访问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
……

 

推荐阅读