1. 首页 > 知识 > 技术

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

此方式暂时感觉有问题,不能给https添加证书

一、背景

目前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代理


链接:https://blog.csdn.net/longyuhome/article/details/122181497


本文由傻鸟发布,不代表傻鸟立场,转载联系作者并注明出处:https://www.shaniao.net/jishu/171.html

加载中~

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:10:30-15:30,节假日休息