当前位置: 首页 > 工具软件 > https > 使用案例 >

2021年Nginx配置搭建HTTPS正向代理服务的2种方式

暨弘毅
2023-12-01

目录​​​​​​​

一、背景

二、Nginx配置方案

三、总结

一、背景

目前Nginx常用的操作就是作为反向代理服务器,还被用于搭建负载均衡,而某些场景下则需要使用正向代理,正向代理的特点如下:

  • 客户端非常明确要访问的服务器地址;

  • 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;

  • 正向代理模式屏蔽或者隐藏了真实客户端信息。

常见的情况是,当开发好的应用部署在多台服务器上时,且部分服务器属于内网,只有几台服务器可以访问互联网,那么部署在内网的服务器上的应用,如果涉及到调用第三方互联网API的情况时(比如:内网调用微信支付API、内网调用公众号API等等),在不改变调用方URL的情况下,可以使用正向代理服务进行网络调用。

例如作者目前的环境就是拥有1台公网阿里云服务器,多台内网阿里云服务器,部署在内网的微服务需要访问第三方支付接口、第三方短信系统、第三方认证系统等。

二、Nginx配置方案

目前,作者发现网上这方面相关的文章都没有写出一个较好的说明,看起来比较费劲,配置到自己的环境中有时也不好使,大多数好使的情况配置的都是HTTP协议的正向代理,而实际调用第三方API时,有很多都是HTTPS协议的,那就需要通过Nginx配置基于HTTPS协议的正向代理。

本文主要说明基于HTTPS的正向代理配置方案。

方案一:基于客户端输入HTTP请求,Nginx代理HTTPS协议

方案二:基于Nginx三方模块ngx_http_proxy_connect_module实现HTTPS代理

先来看一下,正常情况下的HTTP协议的正向代理如何配置?

server {        listen 1443;         charset utf-8;         #DNS解析(核心配置)         resolver 10.2.1.10;         client_max_body_size     50m;         access_log logs/access_proxy.log;        location / {                proxy_pass http://$http_host$request_uri;                proxy_connect_timeout 10;                proxy_send_timeout 10;                proxy_read_timeout 10;                proxy_redirect     off;                proxy_set_header Host $http_host;                proxy_buffers 256 4k;                proxy_set_header   X-Real-IP        $remote_addr;                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;                proxy_next_upstream error timeout invalid_header http_502;                proxy_max_temp_file_size 0k;         } }

如上配置就是一个正常情况下的HTTP协议的代理,设置完成后重启Nginx。

测试时,通常有如下几种配置方式:

1、系统层面配置

/etc/profile文件增加全局系统代理

export HTTP_PROXY=http://ip:1443

2、CURL测试方面配置

curl --proxy ip:1443 http://www.baidu.com

3、应用方面

Java应用底层网络连接对象都提供了设置代理的接口,传递参数即可。

而本文梳理的配置方案实现如下:

方案一:基于客户端输入HTTP请求,Nginx代理HTTPS协议

这种方案实现的效果是,改变客户端的请求协议为HTTP协议,然后在Nginx中进行协议转换,即可实现对HTTPS协议的代理,例如想代理https://www.baidu.com,当使用这种方案配置时,客户端的输入地址为:http://www.baidu.com,核心配置如下:

server {   listen 1443;   charset utf-8;   #DNS解析(核心配置)   resolver 10.2.1.10;   client_max_body_size     50m;   access_log logs/access_proxy.log;   location / {        proxy_pass https://$http_host$request_uri;        set $fixed_destination $http_destination;        if ( $http_destination ~* ^http(.*)$ ) {           set $fixed_destination https$1;        }        proxy_set_header Destination $fixed_destination;        proxy_connect_timeout 10;        proxy_send_timeout 10;        proxy_read_timeout 10;        proxy_redirect     off;        proxy_set_header Host $http_host;        proxy_buffers 256 4k;        proxy_next_upstream error timeout invalid_header http_502;        proxy_max_temp_file_size 0k;        proxy_ssl_server_name on;    }}

该配置增加对HTTP协议的判断,并转换为HTTPS方式,从而实现了Nginx服务器代理HTTPS地址的一种方法。

方案二:基于Nginx三方模块ngx_http_proxy_connect_module实现HTTPS代理

这种方案需要为Nginx安装一个第三方的一个模块,模块地址为:

https://github.com/chobits/ngx_http_proxy_connect_module

其项目介绍中,已经说明了如何安装该模块,不过这里我需要补充的是,在执行configure时,建议增加上之前Nginx中的配置参数(nginx -V)方式进行获取,防止影响之前的Nginx配置。

作者推荐大概的操作如下:

1、根据Github的介绍,下载模块并进行patch操作

2、执行configure操作(建议加上自己的之前配置)

3、make

4、make upgrade

5、make install

当安装模块成功后,Nginx代理HTTPS协议的地址核心配置如下:

server {    listen 1443;    charset utf-8;    #DNS解析(核心配置)    resolver 10.2.1.10;    client_max_body_size     50m;    access_log logs/access_proxy.log;    #need ngx_proxy module    proxy_connect;    proxy_connect_allow            443 80;    proxy_connect_connect_timeout  10s;    proxy_connect_read_timeout     10s;    proxy_connect_send_timeout     10s;    location / {        proxy_pass $scheme://$http_host$request_uri;        proxy_connect_timeout 10;         proxy_send_timeout 10;         proxy_read_timeout 10;         proxy_redirect     off;         proxy_set_header Host $http_host;         proxy_buffers 256 4k;         proxy_next_upstream error timeout invalid_header http_502;         proxy_max_temp_file_size 0k;        proxy_ssl_server_name on;    }}

这样当我们的客户端输入原始HTTPS地址时,配置了正向代理,即可以实现在不改变客户端请求的情况下,调用HTTPS接口。

三、总结

本文介绍了2种方式,用Nginx搭建正向代理服务器:

方案一:基于客户端输入HTTP请求,Nginx代理HTTPS协议

方案二:基于Nginx三方模块ngx_http_proxy_connect_module实现HTTPS代理

 类似资料: