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

docker nginx 反向代理 go 端口 反向不通,反向其它可以!

  •  
  •   coderabbit · 2019-09-26 21:23:01 +08:00 · 4912 次点击
    这是一个创建于 1884 天前的主题,其中的信息可能已经有所发展或是发生改变。

    docker 子网

    172.100.0.0/24
    

    本地宿主机 ip

    //我不确定
    172.100.0.1
    

    go 本地服务及端口

    127.0.0.1:9606
    

    本地域名

    www.demo.cn
    

    nginx 反向代理

    location ~ ^(/static|/service) {
        proxy_redirect off ;
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 50m;
        client_body_buffer_size 256k;
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
        proxy_read_timeout 60;
        proxy_buffer_size 256k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
        proxy_max_temp_file_size 128m;
        proxy_pass http://172.100.0.1:9606$request_uri;
    }
    

    目前遇到的问题就是这样的,我想访问 www.demo.cn/static 转发到 go 服务。一直转发不过去 我输入

    www.demo.cn/static/ 
    直接显示
    404 Not Found
    nginx/1.17.4
    

    我把代理地址改成百度的

    proxy_pass   http://www.baidu.com;
    

    然后访问 www.demo.cn/static 正常转发走了!

    我在 docker 里 curl 缩主机 172.100.0.1 无法 curl 然后找了设置 mac 回环地址

    sudo ifconfig lo0 alias 172.100.0.1/24
    

    本地访问 172.100.0.1 正常 docker curl 172.100.0.1 但是我加上端口 curl http://172.100.0.1:9606 端口又不通。

    docker ping 宿主机又能 ping 通

    64 bytes from 172.100.0.1: seq=0 ttl=64 time=0.175 ms
    

    不知道该怎么处理了,想请教下大家!

    9 条回复    2019-09-27 06:26:59 +08:00
    coderabbit
        1
    coderabbit  
    OP
       2019-09-26 21:35:18 +08:00
    docker curl 宿主机
    ```
    curl http://172.100.0.1:9606
    curl: (7) Failed to connect to 172.100.0.1 port 9606: Connection refused
    /var/www/html # curl http://172.100.0.1:9606/static
    curl: (7) Failed to connect to 172.100.0.1 port 9606: Connection refused
    ```
    coderabbit
        2
    coderabbit  
    OP
       2019-09-26 21:46:47 +08:00
    错误日志

    ```

    2019/09/26 21:43:01 [error] 6#6: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 172.100.0.1, server: www.demo.cn, request: "GET /static HTTP/1.1", upstream: "http://172.100.0.1:9606/static", host: "www.demo.cn"
    2019/09/26 21:43:01 [error] 6#6: *2 open() "/var/www/50x.html" failed (2: No such file or directory), client: 172.100.0.1, server: www.demo.cn, request: "GET /static HTTP/1.1", upstream: "http://172.100.0.1:9606/static", host: "www.demo.cn"

    ```
    看到把 50x 了 具体也没有说 50 几。
    iceheart
        3
    iceheart  
       2019-09-26 21:51:44 +08:00 via Android
    go listen 127.0.0.1 当然不行,改成 0.0.0.0
    openwrt
        4
    openwrt  
       2019-09-26 21:52:51 +08:00 via Android
    你的 go 服务部署在哪,监听的是 127.0.0.1 吗,监听 127.0.0.1 用 172.x.x.x 访问当然不通
    676529483
        5
    676529483  
       2019-09-26 21:55:37 +08:00
    你把 nginx 的配置 proxy_pass http://172.100.0.1:9606$request_uri;里面的 ip 改成 127.0.0.1,再试
    coderabbit
        6
    coderabbit  
    OP
       2019-09-26 22:14:27 +08:00
    经自己 curl ping
    curl docker.for.mac.host.internal:9606
    404 page not found
    已经返回 go 服务的 404 了!但是直接访问 www.demo.cn/static/index.html 还是 404 先回去再看原因

    @676529483 经测试过的 不通的!
    @openwrt 本地 mac 开发
    @iceheart 改成 0000 不行的
    mikeguan
        7
    mikeguan  
       2019-09-26 22:21:28 +08:00 via Android
    怎么宿主机和 docker 一个网段?正常安装 docker 的不会选同一网段的。还不如 docker 直接用 host 网络
    coderabbit
        8
    coderabbit  
    OP
       2019-09-26 23:53:55 +08:00
    彻底解决问题反代正常了 感谢大家的回答!
    参考: https://docs.docker.com/docker-for-mac/networking/#/known-limitations-use-cases-and-workarounds
    https://stackoverflow.com/questions/35744650/docker-network-nginx-resolver

    http {
    resolver 127.0.0.11 ipv6=off;
    }

    resolver 127.0.0.11 ipv6=off; 很重要 且 ip 不能变!

    location ~ ^(/static|/service) {
    proxy_pass "http://host.docker.internal:9606$request_uri";
    }

    http://host.docker.internal 这个地址是 dcoker 访问宿主机地址 https://docs.docker.com/docker-for-mac/networking/#/known-limitations-use-cases-and-workarounds 这里已经说的很清楚了! 之前我把 proxy_pass 设置成 http://host.docker.internal 代理依然不通!
    一直报 no resolver defined to resolve host.docker.internal, client: 172.100.0.1,
    然后去 stackoverflow 找到了答案 resolver 127.0.0.11 ipv6=off;设置好重启 nginx 反代顺利通过!
    mchl
        9
    mchl  
       2019-09-27 06:26:59 +08:00 via iPhone
    This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:51 · PVG 14:51 · LAX 22:51 · JFK 01:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.