目录
目前Nginx常用的操作就是作为反向代理服务器,还被用于搭建负载均衡,而某些场景下则需要使用正向代理,正向代理的特点如下:
客户端非常明确要访问的服务器地址;
服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
正向代理模式屏蔽或者隐藏了真实客户端信息。
常见的情况是,当开发好的应用部署在多台服务器上时,且部分服务器属于内网,只有几台服务器可以访问互联网,那么部署在内网的服务器上的应用,如果涉及到调用第三方互联网API的情况时(比如:内网调用微信支付API、内网调用公众号API等等),在不改变调用方URL的情况下,可以使用正向代理服务进行网络调用。
例如作者目前的环境就是拥有1台公网阿里云服务器,多台内网阿里云服务器,部署在内网的微服务需要访问第三方支付接口、第三方短信系统、第三方认证系统等。
目前,作者发现网上这方面相关的文章都没有写出一个较好的说明,看起来比较费劲,配置到自己的环境中有时也不好使,大多数好使的情况配置的都是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代理