V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ackmanfork
V2EX  ›  问与答

求助: docker nginx 转发 同一台机器上 部署的 go 服务。

  •  
  •   ackmanfork · 2020-04-26 09:50:06 +08:00 · 2106 次点击
    这是一个创建于 1663 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新买入一个阿里云服务器,以及一个域名 已经做了域名解析。 二级域名准备了两个 a.xx.com b.xx.com

    用 docker 搞了一个 nginx 运行在本地 80 端口 容器内也为 80 端口 其中 a.xx.com 直接指向静态资源,可以访问。 b.xx.com 反向代理到 本地已经运行的 9090 端口 但是一直报 404 使用 b.xx.com 不能访问 报 404 但是使用 b.xx.com:9090 却可以访问。 端口 9090 也已经在阿里云做了 安全组, 本地也打开了防火墙

    查看 err.log 报以下错误 *2 connect() failed (111: Connection refused) while connecting to upstream,

    百度 google 换了各种关键字 查找了一个星期 网上各种相关的问答基本试过了一遍 但是还是未能解决这个问题

    小弟愚钝,初学 ocker 以及 go 服务 望大手帮忙看下问题出在哪里

    感谢 下面是 conf.d 配置

    server { listen 80;
    #listen [::]:80; server_name b.xx.com

    #charset koi8-r;  
    
    #location /(css|js|fonts|img)/ {
    #    root /usr/web/Html;
    #	try_files $uri @backend;
    #}
    
    location / {  
    try_files @uri  @backend;
    }  
    location @backend{
    proxy_redirect off;
    #proxy_pass http://backendserver;
    proxy_pass http://127.0.0.1:9090;
    proxy_set_header    Host    $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
    }
    #error_page  404              /404.html;  
    
    # redirect server error pages to the static page /50x.html  
    #  
    error_page   500 502 503 504  /50x.html;  
    location = /50x.html {  
        root   /usr/share/nginx/html;  
    }  
    
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
    #  
    #location ~ \.php$ {  
    #    proxy_pass   http://127.0.0.1;  
    #}  
    
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
    #  
    #location ~ \.php$ {  
    #    root           html;  
    #    fastcgi_pass   127.0.0.1:9000;  
    #    fastcgi_index  index.php;  
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
    #    include        fastcgi_params;  
    #}  
    
    # deny access to .htaccess files, if Apache's document root  
    # concurs with nginx's one  
    #  
    #location ~ /\.ht {  
    #    deny  all;  
    #}  
    

    }

    12 条回复    2020-04-26 12:20:36 +08:00
    ackmanfork
        1
    ackmanfork  
    OP
       2020-04-26 09:53:40 +08:00
    上周被这个问题搞的掉了 一斤头发 。 跪求 V 站 大佬。
    kebyn
        2
    kebyn  
       2020-04-26 10:02:40 +08:00
    @ackmanfork
    proxy_pass http://127.0.0.1:9090; -> proxy_pass http://b.xx.com:9090;
    docker 内的 127.0.0.1:9090 应该没有这个服务
    ackmanfork
        3
    ackmanfork  
    OP
       2020-04-26 10:07:48 +08:00
    @kebyn 意思是 nginx 访问 127.0.0.1 是访问到 docker 容器内了吗? 刚才试了下 报了另一个错
    host not found in upstream "bb.xx.com" in /etc/nginx/conf.d/mo.conf:22
    ackmanfork
        4
    ackmanfork  
    OP
       2020-04-26 10:24:29 +08:00
    大佬们,指点下吧。 (╯﹏╰)
    MisakaTang
        5
    MisakaTang  
       2020-04-26 10:29:06 +08:00
    试一下配置二级域名的反向代理?
    zdt3476
        6
    zdt3476  
       2020-04-26 10:32:03 +08:00
    ```
    upstream bb.xx.com {
    server 127.0.0.1:9090;
    }

    server {
    ...
    proxy_pass http://bb.xx.com;
    ...
    }
    ```
    这样呢?
    stille
        7
    stille  
       2020-04-26 10:32:56 +08:00
    如果反代强制 https 话用这个试试,自己改下域名和 ssl 路径

    upstream dockername {
    server 172.17.0.1:9090; # 端口改为 docker 容器提供的端口
    }

    server {
    listen 80;
    server_name www.yourdomain.com;
    return 301 https://www.yourdomain.com$request_uri;
    }

    server {
    listen 443 ssl;
    server_name www.yourdomain.com;
    gzip on;

    ssl_certificate /usr/local/nginx/conf/ssl/www.yourdomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/www.yourdomain.com.key;

    # access_log /var/log/nginx/dockername_access.log combined;
    # error_log /var/log/nginx/dockername_error.log;

    location / {
    proxy_redirect off;
    proxy_pass http://dockername;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Frame-Options SAMEORIGIN;

    client_max_body_size 100m;
    client_body_buffer_size 128k;

    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    }
    }


    如果不用 https,用这个.

    server
    {
    listen 80;
    #listen [::]:80;
    server_name www.yourdomain.com ;
    index index.html index.htm index.php default.html default.htm default.php;
    #root /home/wwwroot/www.yourdomain.com;

    return 301 https://www.yourdomain.com$request_uri;

    include enable-php-pathinfo.conf;

    location / {
    proxy_redirect off;
    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_pass http://172.17.0.1:9090;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    }

    #location ~ .*\.(js|css)?$
    #{
    # expires 12h;
    #}

    location ~ /.well-known {
    allow all;
    }

    location ~ /\.
    {
    deny all;
    }

    access_log off;
    }
    stille
        8
    stille  
       2020-04-26 10:34:48 +08:00
    反代 IP 127.0.0.1 是 nginx 所在的主机,也就是容器内的本地 IP,你应该用宿主机的内网 IP
    ackmanfork
        9
    ackmanfork  
    OP
       2020-04-26 11:08:48 +08:00
    @kebyn
    @MisakaTang
    @zdt3476
    @stille

    谢谢回复, 找到问题。就是很基础的 docker 部署的 nginx, 配置的 127.0.0.1 就是 nginx 所在容器内环境

    我换成 本地内 网 ip 可以, 瞬间豁然开朗。可是之前改过一次外网的 ip 没有成功是为什么呢
    容器内环境解析不到外网 ip ?
    还是得看先看点基础书啊。
    再次感谢。
    @stille

    拜谢。
    xiri
        10
    xiri  
       2020-04-26 11:12:38 +08:00
    你都用 docker 了为什么不干脆把 go 服务也做成 docker 运行,然后 docker 容器之间用网络桥接
    你的 nginx 在 docker 里面的话访问到的 127.0.0.1 是 docker 里面的,然而你的 docker 里面并没有这个服务
    ackmanfork
        11
    ackmanfork  
    OP
       2020-04-26 11:18:20 +08:00
    @xiri 嗯嗯, 因为 就是新手学 docker 练手的。正好前不久看到 git 有个 go 服务,我就拿来做网站用了 。没有规划那么多
    谢谢老哥建议。 接下来 试下你说的网络桥接方式。
    whileFalse
        12
    whileFalse  
       2020-04-26 12:20:36 +08:00
    运行 nginx 的时候,docker run 加上 --network=host 这个参数就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2310 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:12 · PVG 00:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.