node.js - Docker 和 Nginx 解析错误的 IP 地址

标签 node.js docker nginx dokku

我在 DigitalOcean 上运行 Dokku 0.9.4 来托管多个 Node.js 应用程序服务器(应用程序:apicmswww)。以下是我对新 Droplet 安装所做的操作:

  1. 通过 Dokku 创建应用:dokku apps:create {app-name}
  2. 在我的开发计算机上初始化 GIT 存储库并成功将所有 3 个应用部署到服务器

此时应用程序将一直工作,直到我重新启动服务器或执行service docker restart。当这两种情况发生后,问题就开始出现。首先,应用程序在一两分钟内根本无法访问(当我尝试通过 {app-name}.domain.tld 访问这些应用程序中的任何一个时,我收到 502 Bad gateway (DNS 由 Cloudflare 处理)。然后,如果它决定在几分钟后开始工作,应用程序映射似乎会混淆。

例如,如果我尝试打开 www.domain.tld,我实际上会从 api 应用程序获取响应,同时打开 cms.domain.tld 返回 502 Bad gateway

昨天花了一整天的时间试图找出问题所在,现在我终于找到了问题的位置,但我不明白为什么会发生。

运行dockernetworksinspectbridge给出以下结果:

[
    {
        "Name": "bridge",
        "Id": "e9edc54047f3d93b9033706d17fd78355440470a090c8010577cfca6ef767946",
        "Created": "2017-12-12T09:16:52.784428035Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {
            "28d7242a146a160dafc94b325439b6385bd49155dec9124e501daf88f8744740": {
                "Name": "www.web.1",
                "EndpointID": "26f276f07c983755f0baab9999292b23445d4cdf060328e9e1e3cd8914326310",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            },
            "32b2a15f8ccaff48e46f707bb9619d7d106fb18a0632483cc6db341d24d5b606": {
                "Name": "cms.web.1",
                "EndpointID": "a605bab5af1ec76c802537953b1869116d0ade37bdecf2f76c33c1592ee25b01",
                "MacAddress": "02:42:ac:11:00:07",
                "IPv4Address": "172.17.0.7/16",
                "IPv6Address": ""
            },
            "500bd73a805ef63d9b2eb4589b3abe4316b72f2d7e029d2dfc71886c6f6fc807": {
                "Name": "api.web.1",
                "EndpointID": "cd5f8ebd7f2c6dfc8b5828eed1f0a46336415ba8204f9b58270b18ae42aaf357",
                "MacAddress": "02:42:ac:11:00:08",
                "IPv4Address": "172.17.0.8/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

但是,如果我检查 /home/dokku/{app-name}/nginx.conf 中每个应用程序的 nginx.conf,我就可以看到问题出在哪里。例如,应用程序api具有以下nginx.conf:

server {
  listen      [::]:80;
  listen      80;
  server_name api.tourlyapp.com;
  access_log  /var/log/nginx/api-access.log;
  error_log   /var/log/nginx/api-error.log;

  location    / {

    gzip on;
    gzip_min_length  1100;
    gzip_buffers  4 32k;
    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
    gzip_vary on;
    gzip_comp_level  6;

    proxy_pass  http://api-5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/api/nginx.conf.d/*.conf;

}

upstream api-5000 {

  server 172.17.0.5:5000;
}

而应用www具有以下nginx.conf:

server {
  listen      [::]:80;
  listen      80;
  server_name www.tourlyapp.com;
  access_log  /var/log/nginx/www-access.log;
  error_log   /var/log/nginx/www-error.log;

  location    / {

    gzip on;
    gzip_min_length  1100;
    gzip_buffers  4 32k;
    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
    gzip_vary on;
    gzip_comp_level  6;

    proxy_pass  http://www-5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/www/nginx.conf.d/*.conf;

  error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html;
  location /400-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

  error_page 404 /404-error.html;
  location /404-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

  error_page 500 501 502 503 504 505 506 507 508 509 510 511 /500-error.html;
  location /500-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

}

upstream www-5000 {

  server 172.17.0.8:5000;
}

除了由于某种我不知道的原因 www 应用程序在 nginx.conf 中比 api 应用程序有更多条目这一事实之外,它还表明 IP 是混合的:

www 应用程序的上游 IP 地址设置为 172.17.0.8,而该 IP 地址由 Docker 分配给 api 应用程序。 api 应用程序的上游 IP 地址设置为 172.17.0.8,它与 Docker 分配给它的 IP 地址相同

无论我做什么,IP 地址仍然是困惑的(我尝试过 dokku nginx:build-config www,我尝试过制作最简单的 Node.js 应用程序,但问题仍然存在,我尝试过全新的 Droplet 安装等)。

使所有应用程序正常工作的唯一方法是运行 dokku ps:restart {app-name}。这神奇地使它工作到下一次服务器重新启动为止。

有谁知道到底出了什么问题,因为我已经浪费了太多时间试图修复应该开箱即用的东西。

最佳答案

解决方案似乎是将 Dokku 更新到版本 0.11.0,其中添加了新插件 network,该插件除其他外,还可以在 Docker 服务重新启动后重建 IP 地址。

相关问题:

关于node.js - Docker 和 Nginx 解析错误的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47769865/

相关文章:

angularjs - 无法运行 `npm install -g angular/cli`

node.js - 插入 Mongoose 后找不到文档

node.js - 使用 node.js 移动文件

docker - 从 Github Actions 上的 package.json 安装私有(private) github 包

maven - Jenkins 教程 maven 项目(使用 Docker)在构建阶段失败

部分 URI 的 Nginx 映射

deployment - Nginx 位置、别名、重写、root

javascript - 使用 dart 作为 node.js 的转译器

java - 将多个微服务相互依赖地部署到docker容器中

c++ - 如何让 WebSocket 服务器在 aws 上运行