V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
perbugwei
V2EX  ›  NGINX

关于 nginx 代理的问题

  •  
  •   perbugwei · 166 天前 · 1982 次点击
    这是一个创建于 166 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  165 天前
    兄弟们,第一个问题解决了。
    是因为网络厂商那边做互联网端口映射的时候 验证了“类似明文密码登录”给拦截了,也不是因为 post 请求不到。
    第二个问题还没开始搞。
    各位兄弟的方法我去试试。
    还有,点赞我怎么找不到在哪点。
    第 2 条附言  ·  164 天前
    感谢兄弟们,第二个问题也解决了,就是不知道有没有啥风险

    方案是:
    在可以连外网的机器 B 上装了 nginx ,走正向代理配置的是
    proxy_pass http://$http_host$request_uri ;
    然后在内网服务器 A 上 配的环境变量
    export http_proxy=http://服务器 B Ip:80
    export https_proxy=http://服务器 B IP:80
    所有的 http 都走代理。
    然后就通了。
    奥对了,还要再 nginx 里面配个 DNS 地址。
    13 条回复    2024-06-18 16:17:04 +08:00
    LLaMA2
        1
    LLaMA2  
       166 天前   ❤️ 1
    首先一键三连,谢谢

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


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

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

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


    那么就可以使用 ssh -R 实现服务器 B 访问互联网
    详细情况请自行 goolge ,gpt 或者翻看我以前的回帖!
    evill
        6
    evill  
       165 天前   ❤️ 1
    # 将所有目标端口为 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
        7
    evill  
       165 天前   ❤️ 1
    记得打开转发 sysctl -w net.ipv4.ip_forward=1
    evill
        8
    evill  
       165 天前   ❤️ 1
    nginx 套 nginx ,涉及多次内核和用户空间转换
    evill
        9
    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
        10
    Karte  
       165 天前
    nginx redirect (rewrite) 不支持 POST 转发.
    LLaMA2
        11
    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
        12
    perbugwei  
    OP
       165 天前
    @LLaMA2 我们有个 java 程序部署到了 内网服务器 A (这个是不能访问外网的),这个 java 程序内有调用阿里云的发送短信的,调用这个阿里云的 api 的时候想要 走服务器 B (服务器 A 可以访问服务器 B 的 80 和 443 端口)去访问阿里云的 api 。想要实现的是不改程序,直接做服务器之间的代理实现。
    LLaMA2
        13
    LLaMA2  
       165 天前   ❤️ 1
    如果你的服务器 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 上,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1490 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:23 · PVG 01:23 · LAX 09:23 · JFK 12:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.