CentOS 7 配置 Nginx 正向代理 http、https 最详解


手头项目中有使用到 nginx,因为使用的三方云服务器,想上外网需要购买外网IP的,可是有些需要用到外网却不常用的主机也挂个外网IP有点浪费了,便想使用nginx的反向代理来实现多台内网服务器使用一台代理服务器进行外网访问。

查了很多资料,分享这个功能的人很多(都是好人啊),参考着实现还是费了大半天功夫才搞定,总结了一下,让后来的人少走一些弯路。

我有两台云服务器:
172.25.114.72 是有外网的服务器,在这台上面安装 nginx
172.25.114.71 是没有外网的服务器,这台服务器通过 72 的 nginx 代理来上网

# more /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

nginx 的安装和其他相关插件的使用,以及我们使用的代理端口是否被占用,不再啰嗦赘述,直接进入正题。

准备:查询当前服务器的 DNS (经测试,这步没有什么作用)

# more /etc/resolv.conf
nameserver 100.100.2.138
nameserver 100.100.2.136

首先先打通 http 正向代理,http 正向代理非常容易,打通这步功能后,对整个 nginx 的正向代理会有一个更直接的感官。

1)在 nginx 安装目录下找到 nginx.conf 文件,使用 vi 命令打开,找个空白的位置键入如下内容:

server {
    resolver 100.100.2.138; #指定DNS服务器IP地址,然而并没有什么用,可以使用 8.8.8.8
    listen 8080; #指定代理的端口
    location / {
        proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
    }
}

说明:经测试,这种写法是最好的,其他如下写法会有一个问题,当端口不是 80 的时候,代理还是会跳转到 80,显然不是我们想要的

proxy_pass $scheme://$host$request_uri; #设定代理服务器的协议和地址
proxy_set_header Host $http_host;

2)保存修改,重启 nginx 后可以验证代理是否正确

# ./sbin/nginx -s reload
# curl --proxy 172.25.114.72:8080 http://www.baidu.com

如果没有看到返回的 html 代码内容或者返回错误页如400这样的错误页面代码,可以使用

3)在 172.25.114.71 服务器配置代理

# vi /etc/profile
http_proxy=http://172.24.103.72:8080/
export http_proxy

4)保存并刷新后,检查代理是否配置成功

# source /etc/profile
# curl http://www.baidu.com

说明:如果此时返回 curl: (7) Failed connect to 172.25.114.72:8080; Connection refused,可能是 profile 配置有误,可以执行如下命令检查代理是否正常:

# curl --proxy 172.25.114.72:8080 http://www.baidu.com

到此,nginx 的 http 正向代理配置成功。


接下来是 https 的正向代理,坑也是在这里。主流说 nginx 默认是不支持 https 的正向代理的,也有人信誓旦旦的说支持,归根到底,使用nginx的一个插件包肯定是能实现的。
1)下载 ngx_http_proxy_connect_module 组件并传到服务器上
说明:nginx-1.9.2 版本包里面自带,其他版本的各自按习惯来,github 地址:https://github.com/chobits/ngx_http_proxy_connect_module

2)查询当前 nginx 安装的配置信息,默认安装如下

# ./sbin/nginx -V
configure arguments: --prefix=/usr/local/nginx

3)nginx 添加 ngx_http_proxy_connect_module,注意第二条命令,在上一步查出的结果后面追加模块,别把之前安装的模块搞没了

# patch -p1 < /opt/tool/ngx_http_proxy_connect_module-master/patch/proxy_connect.patch 
# ./configure --prefix=/usr/local/nginx --add-module=/opt/tool/ngx_http_proxy_connect_module-master
# make
# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# cp ./objs/nginx /usr/local/nginx/sbin/

4)在 nginx 配置文件添加 https 的正向代理配置(最小集如下,注意修改端口号),配置完后重启 nginx

server {
    resolver 8.8.8.8; #指定DNS服务器IP地址,就用 8.8.8.8 算了
    listen 8080;
    location / {
        proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
    }
}

server {
    resolver 8.8.8.8; #指定DNS服务器IP地址,就用 8.8.8.8 算了
    listen 8084;
    proxy_connect;
    proxy_connect_allow all;
    location / {
        proxy_pass https://$host$request_uri; #设定代理服务器的协议和地址
        proxy_set_header Host $host;
    }
}

5)在 172.25.114.71 服务器配置代理

# vi /etc/profile
http_proxy=http://172.25.114.72:8080/
https_proxy=https://172.25.114.72:8084/
export http_proxy https_prox

6)保存并刷新后,检查代理是否配置成功

# source /etc/profile
# curl -k https://www.baidu.com

至此 nginx 的 http、https 代理完成。
这套配置就是为什么我大言不惭地说“最详解”?
1.解决 http 正向代理非 80 端口无法代理问题(大部分没有说明这个问题);
2.解决 https 正向代理任意端口都可以代理问题(大部分没有说明这个问题);
3.2 台服务器完全打通的最小集(最干净,容易理解)成功案例。
当然,对于大牛来说,有点班门弄虎的嫌疑,其中有很多小细节,让初次接触的人可以少走很多弯路。

如果这条博客有帮到了你,麻烦点一下“推荐”让更多的人看到,能给大家带来帮助也不枉我辛辛苦苦打这么多字。
感谢你的阅读,谢谢!

猜你喜欢

转载自www.cnblogs.com/xsbx/p/10180177.html