关于 nginx 代理的问题

166 天前
 perbugwei

因为项目网络开通的问题,现在需要使用 nginx 代理一下。

服务器 A 有 nginx 服务器 B 有 nginx 服务器 A 代理 服务器 B 的 ip:端口,然后服务 b 代理真正的服务。 现在 get 请求能访问,但是 post 请求访问,后端服务返回结果。但是前端接收不到。 这是为什么呢

1982 次点击
所在节点    NGINX
13 条回复
LLaMA2
166 天前
首先一键三连,谢谢

1.在服务器 B 上使用 curl 测试真正的服务能否 post
2.在服务器 B 上使用 curl 测试 nginx 能否 post
3.在服务器 A 上使用 curl 测试 nginx 能否 post
4.查看服务器 A 的 nginx 日志
5.查看服务器 B 的 nginx 日志
6.查看真正的服务的日志


请严格按照以上顺序排查,排查后请在此贴出你发现的问题!
hideon
166 天前
每台服务器都安装 tcpdump ,抓包解决一切牛鬼蛇神问题
perbugwei
166 天前
@LLaMA2 ok,我去排查一波,头大
perbugwei
166 天前
还有一个问题我想咨询一下要怎么实现。
内网环境访问外网全部都通过 某一台机器 A 去访问。
那我比如 有一台内网服务想要访问 http://dysmsapi.aliyuncs.com/ 。那我如何让他通过 A 去访问 http://dysmsapi.aliyuncs.com/

我能想到的时候通过修改 服务所以在机器的 host 文件,将 dysmsapi.aliyuncs.com 域名解析到 A ,然后 A 配置代理去访问。还没有实验不知道是否能行。如果可以的话,还有问题就是 要访问多个外网域名的时候改怎么配置。
LLaMA2
166 天前
说好的三连呢,红心拿来!

如果有纯内网服务器 A
同时有能访问互联网服务器 B ,
且该服务器可以 ssh 到服务器 A


那么就可以使用 ssh -R 实现服务器 B 访问互联网
详细情况请自行 goolge ,gpt 或者翻看我以前的回帖!
evill
165 天前
# 将所有目标端口为 80 ( HTTP )的 TCP 流量进行目标地址转换( DNAT ),将 100.64.0.1:80 改为 B 机器
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 100.64.0.1:80
# 将所有目标端口为 443 ( HTTPS )的 TCP 流量进行目标地址转换( DNAT ),将 100.64.0.1:80 改为 B 机器
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 100.64.0.1:443
# 启用 MASQUERADE 功能,将出站流量的源地址动态地替换为发出流量的网络接口的 IP 地址
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables-save
evill
165 天前
记得打开转发 sysctl -w net.ipv4.ip_forward=1
evill
165 天前
nginx 套 nginx ,涉及多次内核和用户空间转换
evill
165 天前
@perbugwei ip route add xx.xx.xx.xx/24 via 192.168.1.1
xx.xx.xx.xx 为 dysmsapi.aliyuncs.com 的 ip ,192.168.1.1 为机器 A 得 ip
Karte
165 天前
nginx redirect (rewrite) 不支持 POST 转发.
LLaMA2
165 天前
关于你提到的需求
“那我比如 有一台内网服务想要访问 http://dysmsapi.aliyuncs.com/ 。那我如何让他通过 A 去访问 http://dysmsapi.aliyuncs.com/ 。”

如果你是开发软件,你可以在 B 服务代码中的 http client 配置 proxy, socks5 即可,socks5 部署在 A 上
也可以将服务直接部署在 A 上,B 调用 A 的服务实现外网访问,此时就不用配置 proxy 里

如果你只是运维,需要借助 A 下载一点外网的数据之类的,那么就 ssh -R 就可以
perbugwei
165 天前
@LLaMA2 我们有个 java 程序部署到了 内网服务器 A (这个是不能访问外网的),这个 java 程序内有调用阿里云的发送短信的,调用这个阿里云的 api 的时候想要 走服务器 B (服务器 A 可以访问服务器 B 的 80 和 443 端口)去访问阿里云的 api 。想要实现的是不改程序,直接做服务器之间的代理实现。
LLaMA2
165 天前
如果你的服务器 B 可以放开 socks 代理的端口的话,那么你只需要
java -DsocksProxyHost=192.168.100.200 -DsocksProxyPort=1080 -jar spingboot-snap1.0.0.jar
也可以 http 代理 https 代理
java -Dhttp.proxyHost=192.168.100.200 -Dhttp.proxyPort=1082 -jar spingboot-snap1.0.0.jar
java -Dhttps.proxyHost=192.168.100.200 -Dhttps.proxyPort=1083 -jar spingboot-snap1.0.0.jar

这是破坏最小的方法,记住,可能还要排除掉 localhost 127.0.0.1 等其他本地地址,避免程序中出现错误



但我还是建议将你的程序中所有涉及请求外部服务的功能全部拆出来到另外一个工程,
然后原来的调用改成 feign 调用,这样部署的时候就可以将需要请求外网的服务器部署在 B 上,

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

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

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

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

© 2021 V2EX