Nginx除了具备反向代理的功能,也可以进行正向代理,正向代理与反向代理的区别就是,正向代理代理的是客户端,反向代理代理的是服务端,比如我们内网有一台机器需要上网。此时就可以通过正向代理,通过一台有网的机器代理出去,下面演示一个正向代理的例子,实现机器上网。
机器准备:
服务器IP | 网卡情况 | Nginx版本 | 角色 |
机器A:192.168.238.130、192.168.64.130 | 两块网卡(238.130可上网) | 1.24.0 | 代理服务器 |
机器B:192.168.64.129 | 一块网卡且不能上网 | 不用安装nginx | 需要上网的机器 |
上面两台机器,机器A中有两块网卡,192.168.238.130是可以上网的网卡,192.168.64.130不能上网,机器B网卡与192.168.64.130在同一网段,也是不能上网,两个机器都是通过vmware制作的虚拟机。192.168.238.130机器A网卡情况如图:
192.168.64.129机器B网卡情况如图:
机器A与机器B有一块共同的网卡VMnet1,因此这两块网卡在同一局域网,但是机器B的IP到机器A的网卡192.168.238.130之间是网络不通的,现在的需求就是让机器B通过正向代理来实现上网。
组件准备:
Nginx:版本1.24.0
ngx_http_proxy_connect_module:Nginx代理模块,这个模块需要与Nginx版本对应,此模块是针对https访问,如果只访问http,那么不需要此模块
Nginx代理模块的GitHub地址为:
http://www.github.com/chobits/ngx_http_proxy_connect_module
复制
查看代理模块与Nginx版本对应情况,1.24.0对应的patch为102101,如图:
实战
一、使用ngx_http_proxy_connect_module配置代理
1、在192.168.238.130机器上编译安装Nginx,同时将代理模块安装进去,如下:
tar xf nginx-1.24.0.tar.gz
wget https://github.com/chobits/ngx_http_proxy_connect_module/archive/master.zip
unzip master.zip
cd nginx-1.24.0
#如果提示path没有发现,就执行yum -y install patch
patch -p1 < root/ngx_http_proxy_connect_module-master/patch/proxy_connect_rewrite_102101.patch
./configure --prefix=/usr/local/nginx --add-module=/root/ngx_http_proxy_connect_module-master
make && make install
复制
2、编辑nginx配置文件,添加server模块,如图:
上图中的代码如下:
server {
resolver 8.8.8.8 ipv6=off; #执行DNS,关闭ipv6
resolver_timeout 10s; #解析超时
listen 88; #监听端口
proxy_connect; #启用连接代理功能
proxy_connect_allow 443 80; #指定代理CONNECT方法可以连接的端口号或范围的列表
proxy_connect_connect_timeout 20s; #定义客户端与代理服务器建立连接的超时时间
proxy_connect_read_timeout 20s; #定义客户端从代理服务器读取响应的超时时间
proxy_connect_send_timeout 20s; #设置客户端将请求传输到代理服务器的超时时间
location {
proxy_pass $scheme://$http_host$request_uri;
proxy_set_header Host $host; #可选
}
}
#$scheme:请求使用的协议,比如 http 或 https
#$http_host:请求头中的 Host,通常是域名
#$request_uri:请求的 URI 路径
复制
2、登录192.168.64.129机器,配置环境变量,如下:
vim /etc/profile
export http_proxy="http://192.168.64.130:88"
export https_proxy="http://192.168.64.130:88"
source /etc/profile
复制
3、登录192.168.64.129机器,测试是否可以上网,如图:
从上图可以看出,机器已经可以实现上网功能,有网之后就可以使用类似wget这种命令下载文件了,或其他操作
注意:使用ngx_http_proxy_connect_module后,我们通过一个88端口即可代理请求80与443端口,如果不使用此模块,就需要单独代理到80,443不支持,Nginx原生不支持正向代理到https
二、不使用ngx_http_proxy_connect_module模块
1、修改上述Nginx配置文件中的80端口对应的server,如图:
2、修改192.168.64.129机器的环境变量,添加内容如下:
export http_proxy="http://192.168.64.130:80"
source /etc/profile
复制
配置后测试下已经可以上网,如图:
注意:不使用ngx_http_proxy_connect_module模块的情况下,正向代理是不支持https的,因此如果有https代理请求,建议使用模块,ngx_http_proxy_connect_module模块主要用于支持HTTP CONNECT方法创建隧道代理,Nginx默认不支持CONNECT方法,如果要配置成一个通用的HTTP/HTTPS代理服务器,才需要用到这个模块。