想请教大家如何将 http 请求反代到 https 服务

2022-12-22 14:44:02 +08:00
 GogoGo666
目前有个需求,我们的业务场景是,客户流量->nginx(卸载 ssl ,https 转为 http)->流量处理(类似防火墙,但是有很多处理的过程)->nginx(将处理过的 http 重新加密为 https)->客户服务器,然后要求客户端和服务端都无感知,想请教大家,第二个 nginx(将处理过的 http 重新加密为 https)如何处理?
3441 次点击
所在节点    NGINX
31 条回复
Lax
2022-12-22 21:31:02 +08:00
@GogoGo666 https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 仔细看看 Syntax proxy_pass 的第一段内容,第二层 nginx 接收 http 协议请求,回源采用 https 协议,有什么问题吗?
另外,既然要求性能,楼主的这个方案是一定程度上来说是不太靠谱了。如果是串联的方式来做,可以使用 auth_request 或者 nginx-lua-module 。如果是 nginx 流量镜像,是有 ngx_http_mirror_module 可以做到的。
honhon
2022-12-22 23:24:25 +08:00
开 ssh ,让我上去试试
honhon
2022-12-22 23:32:30 +08:00
流量处理(类似防火墙,但是有很多处理的过程) 这一个阶段也类似反向代理,但是不支持 https ,但是客户服务器只支持 https ,是这个意思么
EminemW
2022-12-23 00:09:33 +08:00
建议直接从交换机镜像流量出来,别搞这种串联的
yikyo
2022-12-23 00:16:01 +08:00
是要对流量进行修改?
如果仅记录,可以尝试镜像,traefik 也有该功能
GogoGo666
2022-12-23 09:39:30 +08:00
@Lax #21 感谢回复,关于您提到的文档中 proxy_pass 的第一段内容,我是查阅了的,也在本地做了测试,结果依然是重定向实现的。关于方案的问题,其实流量调度是 vswitch 实现的,我只需要在 nginx 配置即可,所以才有了这个方案。我会尝试 nginx-lua-module
GogoGo666
2022-12-23 09:45:00 +08:00
@honhon #23 其实客户服务本身是 https 服务,只是在流量到达客户服务之前,需要过我们业务串联的防火墙,但是 https 需要加密解密,会影响性能,所以才有第一个 nginx 来卸载流量的 ssl ,https 流量卸载 ssl 后变为 http 流量,然后开始由防火墙处理,处理完成后需要重新加密为 https 以请求真实的客户服务,所有才有了第二个 nginx
@EminemW #24 这种旁路的方式我们也有,只是现在需要实现串联的业务
@yikyo #25 是的,仅记录的话就简单了
eryajf
2022-12-23 17:50:55 +08:00
@storyxc #8 如果真开了,那就是两个 2 的问题😂
lazyfighter
2022-12-23 18:09:45 +08:00
目前能想到的只能是 body_fitler_by_lua, 通过 lua 在将 body 请求转发到 nginx 上面 ,由 nginx 转发到你们的服务器 ,拿到结果 lua 覆盖原始 body , 最终在进行 proxy_pass , 看了一下 nginx 提供的 7 个钩子,基本不可能在 proxy_passs 就是 rewrite 阶段之后在进行 rewrite 。
lazyfighter
2022-12-23 18:12:20 +08:00
@lazyfighter 抱歉错了, 应该是在 rewrite 阶段转发到你们的服务上面
GogoGo666
2023-01-10 14:15:48 +08:00
感谢诸位 v 友回复,给了我很大帮助,我不再一一 @回复了,我会把我的配置放到之后的内容
————————————————————————————————————————————————————————
nginx 最终使用了 headers_more 模块,qat_zip 模块,qat 模块
以下为相关配置

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

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

server {
listen 80;
server_name $Name;
location / {
proxy_pass https://$IP;
proxy_ssl_asynch on;
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';
}
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/904120

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX