docker vs docker-compose nginx:在 /etc/nginx/nginx.conf:21 的上游"httpstat.us"中找不到 [emerg] 主机



我对这组 docker 文件有一个非常特殊的问题:

docker run将做我想做的,而docker-compose不会

我对 Docker 很感兴趣,因此这个问题可能相当简单 - 我提前道歉!

  • 但我只是无法确定我的错误

docker run -p 80:8080 -i -t lakrids_devlakrids 172.17.0.1 - - [01/Feb/2017:23:29:36 +0000] "GET / HTTP/1.1" 200 6979 "-" "curl/7.29.0"

但是如果我使用 docker-compose 启动同一个容器,我会得到

docker-compose up devlakrids Recreating devlakrids Attaching to devlakrids devlakrids | 2017/02/01 23:28:19 [emerg] 11#11: host not found in upstream "httpstat.us" in /etc/nginx/nginx.conf:21 devlakrids | nginx: [emerg] host not found in upstream "httpstat.us" in /etc/nginx/nginx.conf:21 devlakrids exited with code 1

两个可能的罪魁祸首:

  • nginx是一个有趣的野兽:如果上游在nginx已经在运行时出现故障,那么nginx就会继续运行。但是,如果在启动时无法访问上游nginx则后者将无法启动。要解决此问题,您可能需要添加一个启动脚本,nginx容器测试,以便在启动nginx之前

  • 启动上游;
  • 尝试显式添加links:不知何故,我们遇到了这个问题,即nginx docker 没有看到通过compose服务名称隐式定义的其他机器。

最后,一个真正被遗忘的选项是:您没有在文件中指定显示 httpstat.us 服务在 docker 引擎中启动的位置的任何位置,因此它实际上令人惊讶的是,它无需组合即可为您工作。

从说明来看,您在撰写之外运行的图像可能与您在撰写中运行的图像不同,或者您的卷装载不同。为了解决您的错误,我会使用上游定义更新您的nginx.conf:

daemon off;
worker_processes 1;
events { worker_connections 1024; }
http {
   upstream httpstat.us {
       least_conn;
       server httpstat.us:80 fail_timeout=60s max_fails=2;
   }
   sendfile on;
   server {
      listen 8080;
      server_name dev.lakrids.premier-is.dk;
      location / {
         proxy_pass http://httpstat.us/;
         proxy_set_header  X-Real-IP  $remote_addr;
      }
   }
}

这就是让我的一天(我永远感谢C.伊斯特伍德先生):)的原因

在我的设计中,nginx容器兼作反向代理 - 并处理443安全端 - 允许"普通"应用程序服务器处理业务逻辑:

# ./docker-compose.yml
version: '2'
services:
  proxy:
    build: ./shared/proxy
    networks:
    - sand
    links:
    - devlakrids:devlakrids
    ports:
    - 80:80
    - 443:443
  # sand[kassen]
  #
  devlakrids:
    build: ./sand/current/spark
    expose:
    - "4567"
    tmpfs: /tmp
    volumes:
    - ./sand/current/:/mnt/lakrids
    - ./shared/sand/:/shared
    links:
    - sandmysql
    networks:
    - sand
    - sanddb
# ./shared/proxy/services.conf
server {
        listen 80;
        listen 443 ssl http2;
        server_name dev.lakrids.xxxx.xxx;
        # Path for SSL config/key/certificate
        ssl on;
        ssl_certificate /etc/ssl/certs/nginx/xxx.crt;
        ssl_certificate_key /etc/ssl/certs/nginx/xxxx.pem;
        include /etc/nginx/includes/ssl.conf;
        add_header Strict-Transport-Security "max-age=31536000";
        location / {
                include /etc/nginx/includes/proxy.conf;
                proxy_pass http://devlakrids:4567;
        }
        access_log off;
        error_log  /var/log/nginx/error.log error;
}
# ./shared/proxy/includes/proxy.conf
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_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_intercept_errors on;

有了这个 - 剩下要做的就是大体上docker-compose up;)

最新更新