贵州做网站公司
贵州做网站公司~专业!靠谱!
10年网站模板开发经验,熟悉国内外开源网站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等网站程序,可为您提供网站建设,网站克隆,仿站,网页设计,网站制作,网站推广优化等服务。我们专注高端营销型网站,企业官网,集团官网,自适应网站,手机网站,网络营销,网站优化,网站服务器环境搭建以及托管运维等。为客户提供一站式网站解决方案!!!

yisu(Nginx作为反向代理并以HTTP协议反向代理HTTPS服务)

来源:网络转载 时间:2024-05-08 12:06:59

简单记录一下 Nginx 作为反向代理,以 HTTP 协议向下游客户端代理基于Spring Security 实现的HTTPS 服务时遇到的问题及解决办法。

背景

有个基于 Spring Security、Spring MVC 实现的 HTTPS Web 应用,需要通过 Nginx 作为反向代理向外提供服务。
Nginx 和 Web 应用部署在同一台机器,IP 为 10.115.6.165。Web 应用以 HTTPS 协议监听在端口 19026。


关于Nginx,因为我们会需要 headers more 模块中的 more_set_headers 指令。所以,如果是 Windows 环境,推荐在http://nginx-win.ecsds.eu/下载,因为它的nginx编译进了更多模块。如果是 Linux 环境,也请确认 headers more 模块的 more_set_headers 指令可用。

Nginx 以 HTTP 的方式反向代理。

用以下配置运行 Ngnix, 使Nginx用 HTTP 协议在 9080 端口反向代理 19026 上的 HTTPS 服务。

server {
listen 9080;
server_name 10.115.6.165;

location /databoard/ {
proxy_pass https://10.115.6.165:19026/databoard/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}

但是如果我们用浏览器访问http://10.115.6.165:9080/databoard/login,就会发现如下图所示的两个问题:

1)后端服务使用 redirect 重定向导致的问题

浏览器地址栏上显示被重定向到了https://10.115.6.165/databoard/dataCmder。这是因为后端Web应用执行了redirect重定向语句,而重定向的协议、地址是基于web应用上下文的,而nginx并没有做特别的处理就转发给了浏览器,浏览器自然不能访问到这个地址。解决办法如下:

map $upstream_http_Location $location {
~https://10.115.6.165/(?<param>.*) http://10.115.6.165:9080/$param;
default $upstream_http_Location;
}

server {
... ...
location /databoard/ {
... ...
more_set_headers -s '301 302' 'Location $location';
2)Cookie 携带 Secure 属性导致浏览器不能在请求中携带 SessionID 的问题。

有 Secure 属性的 Cookie 意味着如果浏览器不是使用 HTTPS 与服务建立链接,那么这个 cookie 里的值不会随请求一起向服务器发送。要解决这个问题就需要在 Nginx 中把 cookie 中的 Secure 属性去掉再传给浏览器。解决办法如下:

map $sent_http_set_cookie $resp_cookie {
~*(?<CK_WITHOUT_SECURE>.+)Secure $CK_WITHOUT_SECURE;
}

server {
... ...
location /databoard/ {
... ...
more_set_headers 'Set-Cookie: $resp_cookie';
完整的相关配置
map $upstream_http_Location $location {
~https://10.115.6.165/(?<param>.*) http://10.115.6.165:9080/$param;
default $upstream_http_Location;
}

map $sent_http_set_cookie $resp_cookie {
~*(?<CK_WITHOUT_SECURE>.+)Secure $CK_WITHOUT_SECURE;
}

server {
listen 9080;
server_name 10.115.6.165;

location /databoard/ {
proxy_pass https://10.115.6.165:19026/databoard/;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;

more_set_headers -s '301 302' 'Location $location';
more_set_headers 'Set-Cookie: $resp_cookie';
}
}

Nginx 以 HTTPS 的方式反向代理。

如果 nginx 是以 HTTPS 协议向外提供反向代理,那么无论使用七层代理还是四层代理配置起来都很简单,如下:

3)四层反向代理。
stream {
upstream databoardServer {
hash $remote_addr consistent;
server 10.115.6.165:19026 weight=5;
}

server {
listen 9082;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass databoardServer;
}
}
4)七层反向代理。
server {
listen 443 ssl;
server_name 10.115.6.165;
ssl_certificate D:\\tmp\\opensslCrt\\demoAppChain.crt;
ssl_certificate_key D:\\tmp\\opensslCrt\\demoApp.key;

location / {
proxy_pass https://10.115.6.165:19026;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header referer https://10.115.6.165;
}
}

关于 Spring Session Cookie Secure 配置

当时为了不用在 Nginx 上处理 Cookie ,想通过直接配置 Spring Web 应用不让 Cookie 带上 Secure 属性。于是直接修改配置 application.properties 如下,但是返回给 nginx 的 Cookie 还是带 Secure 属性。(类似的还有cookie的HttpOnly也不仅仅是一个配置能决定的)

server.session.cookie.secure=false

通过跟踪 Spring 源码发现,只要应用是运行在 HTTPS 协议下的,那么就会让生成的 Cookie 是 Secure 的。

到此,关于“Nginx作为反向代理并以HTTP协议反向代理HTTPS服务”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注本站网站,小编会继续努力为大家带来更多实用的文章!

标签:yisu-

免费主页空间申请建网站服务平台 高端免费主页空间申请系统平台值得您免费注册使用 ▶ 网站模板免费使...

一、功能效果填写公众号Appsecret有什么用呢?公众号Appsecret可用于微信支付、自定义微信分享样式、微信登录等功能的设置。二、获取AppSecret...

一、关于账号问题 1、凡科账号怎么填写? 凡科建站账号的填写规则:由字母+数字组成,如:ab40;或由纯字母组成,如:abcd。 注意:凡科账...

“王心凌概念股”市值蒸发千亿怎么回事?王心凌概念股其实指的是芒果超媒,由于现在网上都把芒果超媒股票称之为“王心凌概念股”所以王心凌概念股也因此而诞生了。王心凌概念股诞生之后,原本以为芒果超媒的股票开市后会一路高涨,结果5月23日开盘后,芒果超媒的股价却是一路下跌。5月23日芒果超媒股价一路下跌,截止当日收盘时间,芒果超媒下跌超1%。根据数据显示,芒果...

热钱又可以被称之为游资或者是被称之为投机型的短期资金。热钱最主要的目的就是可以用尽量少的时间以钱来生钱,是一种只为追求高的回报而在股票市场当中迅速流动的短期投机性的资金。热钱最主要的一个目的也就是纯粹的投机盈利,而不是制造就业或者是商品以及服务。在2010年10月份以来,新增外汇占款近四年,第一次出现了负增长,海外热钱撤离到了中国,对于中国的经济造成了不同程度的影响。甄别热钱以及确定热钱金额的大小...

天天省呗爵士卡是什么意思?办理骑士卡的两种渠道是什么?天天省呗爵士卡是成都优选仓科技有限公司旗下APP“天天省呗”推出的一-张会员权益卡,购卡后可以享受加油、餐饮、网购、视频会员充值等优惠,该权益卡需要购买后绑定APP使用。天天省呗爵士卡目前有150多项会员权益,覆盖衣食住行等多个方面,可以领取大额优惠券,现金返利、领取饿了么红包、一部分视频充值会员可打4折,还有车主加油可...

TOP