Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
nginx docker容器:502网关响应错误_Nginx_Docker - Fatal编程技术网

nginx docker容器:502网关响应错误

nginx docker容器:502网关响应错误,nginx,docker,Nginx,Docker,我有一个监听8080端口的服务。这不是一个容器 然后,我使用官方图像创建了一个nginx容器: docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d -p 443:443 -p 80:80 nginx 毕竟: # netstat -tupln | grep 443 tcp6 0 0 :::443 :::* LISTEN

我有一个监听8080端口的服务。这不是一个容器

然后,我使用官方图像创建了一个nginx容器:

docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d -p 443:443 -p 80:80 nginx
毕竟:

# netstat -tupln | grep 443
tcp6       0      0 :::443                  :::*                    LISTEN      3482/docker-proxy
# netstat -tupln | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      3489/docker-proxy
tcp6       0      0 :::8080                 :::*                    LISTEN      1009/java
Nginx配置为:

upstream eighty {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name eighty.domain.com;

    location / {
      proxy_pass                        http://eighty;
    }
}
我已检查是否可以使用
#curl连接此服务器http://127.0.0.1:8080

 <html><head><meta http-equiv='refresh'
 content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body
 style='background-color:white; color:white;'>
 ...
日志,其中
上游{server 0.0.0.0:8080;}

2016/07/13 09:06:53 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:06:53 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
62.57.217.25 - - [13/Jul/2016:09:00:30 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" 2016/07/13 09:00:30 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client:
62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com" 2016/07/13 09:00:32 [error] 5#5: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:00:32 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
有什么想法吗?

这个问题 当谈到容器时,Localhost有点棘手。在docker容器中,localhost指向容器本身。 这意味着,对于这样的上游:

upstream foo{
  server 127.0.0.1:8080;
}

您正在告诉nginx将您的请求传递给本地主机。 但在docker容器的上下文中,localhost(以及相应的ip地址)指向容器本身:

通过寻址127.0.0.1,如果容器不在主机网络上,您将永远无法访问主机

解决 主机网络 您可以选择在与主机相同的网络上运行nginx:

docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d --net=host nginx
请注意,在这种情况下,您不需要公开任何端口

虽然您失去了docker网络的好处,但这仍然有效。如果有多个容器应该通过docker网络进行通信,那么这种方法可能会有问题。如果您只想使用docker部署nginx,而不想使用任何高级docker网络功能,那么这种方法很好

访问主机的远程IP地址 另一种方法是通过添加远程IP地址,重新配置nginx上游指令以直接连接到主机:

upstream foo{
  //insert your hosts ip here
  server 192.168.99.100:8080;
}
容器现在将通过网络堆栈正确解析主机:


如果您有DNS名称,也可以使用DNS名称。确保docker知道您的DNS服务器。

对我来说,这行代码帮助了代理设置头主机$http\u主机

server {
   listen            80;
   server_name  localhost;
location / {
   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_set_header Host $http_host;
   proxy_set_header X-NginX-Proxy true;

   proxy_redirect off;
   proxy_pass http://myserver;
}
nginx.sh nginx.conf
这对我很有用

您可以做的是配置
代理\u通行证
,从
容器
的角度来看,地址将指向您的真实主机

要从容器角度获取主机地址,您可以在Windows上使用docker
18.03
(或更新版本)执行以下操作:

从映像名为
nginx
的主机在容器上运行bash(适用于
Alpine Linux发行版
):

然后在容器内运行

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2
192.168.65.2
是主机的IP,而不是像
spinus
中那样的网桥IP

我在这里使用:

主机的IP地址正在更改(如果您没有网络访问权限,则没有IP地址)。从18.03起,我们建议连接到特殊DNS名称host.docker.internal,该名称解析为主机使用的内部IP地址。这是出于开发目的,在Docker for Windows之外的生产环境中不起作用

然后您可以将
nginx
config更改为:
proxy\u passhttp://192.168.65.2:{你的应用程序端口}

它应该很好用


请记住提供与本地应用程序运行时相同的
端口。

我遇到了这个问题,结果是由于权限问题,docker容器无法启动

就我而言

docker-compose ps 
显示容器尚未启动并退出,状态为1。结果表明,在迁移到新计算机时,权限已丢失。将权限调整为父目录上的Known staff用户为我解决了这个问题,然后我就可以在前面得到的位置启动docker服务

nginx_1_c18a7f6f7d6d | chown: /var/www/html: Operation not permitted

完整参考

为了完成其他答案,我使用mac进行开发,并使用host.docker.internal直接在上游为我工作,无需传递主机远程IP地址。以下是代理nginx的配置:

events { worker_connections 1024; }

http {
    upstream app1 {
        server host.docker.internal:81;
    }

    upstream app1 {
        server host.docker.internal:82;
    }
    
    server {
        listen 80;
        server_name app1.com;
    
        location / {
          proxy_pass    http://app1;
        }
    }

    server {
        listen 80;
        server_name app2.com;
    
        location / {
          proxy_pass    http://app2;
        }
    }
}
如您所见,我在nginx代理后面为不同的应用程序使用了不同的端口。我对app1使用端口81,对app2使用端口82,app1和app2都有自己的nginx容器:

对于app1:

docker run --name nginx -d -p 81:80 nginx
对于app2:

docker run --name nginx -d -p 82:80 nginx
此外,有关更多详细信息,请参阅此链接:

只是一个简单的猜测,可能是因为服务器地址吗?能否尝试将其从127.0.0.1更改为0.0.0.0?如果不是这样,则会出现其他一些应用程序故障,请检查日志或发布日志,我将尝试查看问题所在,并将端口(8080)添加到
http://eighty
代理通行证
行。我刚刚在post上添加了日志。您是否也尝试过更改
代理通行证
?是,我已将
proxy\u pass
设置为
http://0.0.0.0:8080
。同样的问题…我明白了,日志显示您正在使用IPv6,您能尝试将其更改为IPv4吗?回答非常好且直接。节省了我很多时间如果nginx和docker容器都在kubernetes上运行,我如何将它们连接到docker容器?据我所知,没有固定的IP,我可以指出nginx,因为可能有多个容器实例同时运行。在这里找到了我的kubernetes问题的答案:我的请求是192.168。*保持docker compose的定时输出您可以使用网络模式:“host”@pini cheyni()
bin/ash
确实存在-您可以在这里阅读相关信息,例如:这不是
bash
sh
的打字错误。您是对的,在我的Debian系统上它是不存在的,所以我认为这是一个打字错误。我花了几天时间试图弄清楚为什么docker compose bridge网络上我的nginx容器和django容器之间的网络连接如此缓慢。这真的是我的救命恩人。谢谢。请改进你的问题。代码+链接的答案很少适用。请为您的问题添加额外的解释。我已经格式化了你答案中我认为是代码的部分,请检查/更改为你最初想要的内容。我现在没有投反对票,但如果您不进行这些更改,它肯定会被标记为非常低的质量:(
nginx_1_c18a7f6f7d6d | chown: /var/www/html: Operation not permitted
# the upstream component nginx needs to connect to
upstream django {

    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket

    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}


location / {

        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
events { worker_connections 1024; }

http {
    upstream app1 {
        server host.docker.internal:81;
    }

    upstream app1 {
        server host.docker.internal:82;
    }
    
    server {
        listen 80;
        server_name app1.com;
    
        location / {
          proxy_pass    http://app1;
        }
    }

    server {
        listen 80;
        server_name app2.com;
    
        location / {
          proxy_pass    http://app2;
        }
    }
}
docker run --name nginx -d -p 81:80 nginx
docker run --name nginx -d -p 82:80 nginx