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

2022-12-22 14:44:02 +08:00
 GogoGo666
目前有个需求,我们的业务场景是,客户流量->nginx(卸载 ssl ,https 转为 http)->流量处理(类似防火墙,但是有很多处理的过程)->nginx(将处理过的 http 重新加密为 https)->客户服务器,然后要求客户端和服务端都无感知,想请教大家,第二个 nginx(将处理过的 http 重新加密为 https)如何处理?
3418 次点击
所在节点    NGINX
31 条回复
ProProPro
2022-12-22 14:52:48 +08:00
直接 301 跳转?
Lax
2022-12-22 14:56:29 +08:00
简单来说可以: “proxy_pass https://backend.example.com;”
复杂来说的话,有一些关于证书的配置,去文档里看看 proxy_ssl_ 开头的
zhanlanhuizhang
2022-12-22 15:00:03 +08:00
直接加个代理配置就可以了。很简单的配置。
Lax
2022-12-22 15:00:16 +08:00
另外建议先看看现有成熟的方案,一般的需求不需要搞两个 nginx 。
大部分预处理需求都可以在读请求体这个阶段实现。
zhanlanhuizhang
2022-12-22 15:00:54 +08:00
简单来说,就是 nginx 配置 https ,你的服务不配置 https 。然后通过 proxy_pass 设置一下。
defunct9
2022-12-22 15:05:25 +08:00
开 ssh ,让我上去试试
kaedeair
2022-12-22 15:30:02 +08:00
这个应该是要 nginx 管理证书,nginx 我用得比较少
我用过的 traefik 可以实现,网关后面的服务都是 http ,但是进到网关强制 https
storyxc
2022-12-22 15:32:45 +08:00
#6 ssh 哥 虽迟但到
darkengine
2022-12-22 16:31:55 +08:00
nginx 配置文件最后加一个

server {
listen 80;
server_name <your-domain-name>;
return 307 https://$host$request_uri;
}
Xusually
2022-12-22 17:10:44 +08:00
就最简单的 proxy_pass 就行了
sss15
2022-12-22 17:13:39 +08:00
server {
listen 443;
server_name example.com;

location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
监听 443 端口,返回出去的也是 443 端口,所有的请求,都会代理到 localhost:8000 端口,且是 http 的,就是这样子简单,无需 2 台 nginx 转来转去,想复杂了
xwayway
2022-12-22 17:33:18 +08:00
看了下,你服务端就是一个流量处理的过程,拓扑图不用这么复杂
用户请求 --> 贵司 nginx --> 贵司服务 --> 调用三方服务
至于 nginx 配置可以参考

server {
listen 443 ssl;
server_name abc.com;
client_max_body_size 10m;

ssl_certificate conf.d/ssl/abc.com.pem;
ssl_certificate_key conf.d/ssl/abc.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Via "nginx";
}
}
GogoGo666
2022-12-22 17:36:04 +08:00
@darkengine #9 感谢回复,我尝试了你的配置,结果是会重定向,我的目的是使用 nginx 启动 httpserver ,并将 http 数据加密,然后将生成的 https 数据给服务器
@kaedeair #7 感谢回复,我研究下 traefik
@zhanlanhuizhang #5 感谢回复,被代理的服务器是 https 服务,我们的业务时先将流量解密,进行安全处理,然后加密回去,再到服务器,我是在不知道怎么办了
@ProProPro #1 感谢回复,直接 301 不可行,会重定向
@Lax #4 感谢回复,我尝试了直接使用 proxy_pass 配置,也查看了相关的配置,感觉没有能实现我的目标的配置,我查了相关配置后,感觉 nginx 好像不能对接收到的 http 请求转为 https 请求到服务器,感觉其中难点应该是不使用重定向,直接将 https 的响应解密成 http 在返回给流量处理层。
500
2022-12-22 17:45:12 +08:00
用户-----( https)-----nginx_a
nginx_a-----( http)-----nginx_b
nginx_b-----( https)-----服务器

这样看的话比较清楚:
1. ( https)-----nginx_a-----( http)
2. ( http)-----nginx_b-----( https)


假设:
用户访问的地址是: https://a.nginx.org
nginx_b 的地址是: http://b.nginx.org
服务器的地址是:server.org


nginx_a 做升级代理,需要证书

```
server {
listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate cert.pem;
ssl_certificate_key key.pem;
ssl_client_certificate ca.cer;
ssl_verify_client optional;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

server_name a.nginx.org;

root /var/www/a.nginx.org;
index index.html;

location = / {
proxy_pass http://b.nginx.org:80;
proxy_set_header Host $http_host;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
```

nginx_b 做降级代理,不需要证书

```
server {
listen 80;
listen [::]:80;

server_name b.nginx.org;

root /var/www/b.nginx.org;
index index.html;

location = / {
proxy_pass http://server.org:443;
proxy_set_header Host $http_host;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
```

其实这个完全可以一次代理完成,用两次代理是需要劫持流量?
GogoGo666
2022-12-22 18:20:53 +08:00
@500 #14 感谢回复,我马上尝试您的配置,您说的劫持流量,我们的业务应该就是这个意思,我们是与安全厂商合作,中间流量处理会有多个防火墙和 waf ,整体流量调度使用 vswitch 实现的。我是负责做安全厂商 api 对接和镜像制作的工作,所以这个 nginx 镜像的工作交到我这里了,我自己折腾 3 天没搞定。
crab
2022-12-22 18:46:02 +08:00
o00o
2022-12-22 18:51:45 +08:00
这是要作恶?
GogoGo666
2022-12-22 19:14:36 +08:00
@o00o #17 感谢回复,不是的,中间的流量处理是安全厂商提供的,最终客户一般是地方 zf 单位
darkengine
2022-12-22 19:29:22 +08:00
我明白你的需求了。根据我当前对后端的理解(本人菜鸡),你还是写个代码吧。例如跑个 go 服务,nginx 的所有 http 请求都到它那里,然后它负责请求目标机( https),将响应作为进来的 http 请求的响应返回去。
GogoGo666
2022-12-22 19:54:58 +08:00
@darkengine #19 感谢,这也是个方法,但是无法保证性能,为了提高性能我们在服务器加了 QAT 卡,用来加速证书加密解密,用 go 不确定性能是否足够,我会想办法试试

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

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

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

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

© 2021 V2EX