2021年Nginx配置搭建HTTPS正向代理服务的2种⽅式
⽬录
⼀、背景
⽬前Nginx常⽤的操作就是作为反向代理服务器,还被⽤于搭建负载均衡,⽽某些场景下则需要使⽤正向代理,正向代理的特点如下:
客户端⾮常明确要访问的服务器地址;
服务器只清楚请求来⾃哪个代理服务器,⽽不清楚来⾃哪个具体的客户端;
正向代理模式屏蔽或者隐藏了真实客户端信息。
常见的情况是,当开发好的应⽤部署在多台服务器上时,且部分服务器属于内⽹,只有⼏台服务器可以访问互联⽹,那么部署在内⽹的服务器上的应⽤,如果涉及到调⽤第三⽅互联⽹API的情况时(⽐如:内⽹调⽤⽀付API、内⽹调⽤API等等),在不改变调⽤⽅URL 的情况下,可以使⽤正向代理服务进⾏⽹络调⽤。
例如作者⽬前的环境就是拥有1台公⽹阿⾥云服务器,多台内⽹阿⾥云服务器,部署在内⽹的微服务需要访问第三⽅⽀付接⼝、第三⽅短信系统、第三⽅认证系统等。
⼆、Nginx配置⽅案
⽬前,作者发现⽹上这⽅⾯相关的⽂章都没有写出⼀个较好的说明,看起来⽐较费劲,配置到⾃⼰的环境中有时也不好使,⼤多数好使的情况配置的都是HTTP协议的正向代理,⽽实际调⽤第三⽅API时,有很多都是HTTPS协议的,那就需要通过Nginx配置基于HTTPS协议的正向代理。
本⽂主要说明基于HTTPS的正向代理配置⽅案。
⽅案⼀:基于客户端输⼊HTTP请求,Nginx代理HTTPS协议
⽅案⼆:基于Nginx三⽅模块ngx_http_proxy_connect_module实现HTTPS代理
先来看⼀下,正常情况下的HTTP协议的正向代理如何配置?
#DNS解析(核⼼配置)
resolver 10.2.1.10;
client_max_body_size 50m;
access_log logs/access_proxy.log;
location / {
proxy_pass $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⽂件增加全局系统代理
如何设置代理服务器2、CURL测试⽅⾯配置
3、应⽤⽅⾯
Java应⽤底层⽹络连接对象都提供了设置代理的接⼝,传递参数即可。
⽽本⽂梳理的配置⽅案实现如下:
⽅案⼀:基于客户端输⼊HTTP请求,Nginx代理HTTPS协议
#DNS解析(核⼼配置)
resolver 10.2.1.10;
client_max_body_size 50m;
access_log logs/access_proxy.log;
location / {
proxy_pass $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安装⼀个第三⽅的⼀个模块,模块地址为:
其项⽬介绍中,已经说明了如何安装该模块,不过这⾥我需要补充的是,在执⾏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代理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论