docker nginx反向代理无错误,但返回空负载

docker nginx反向代理无错误,但返回空负载,docker,nginx,reverse-proxy,Docker,Nginx,Reverse Proxy,在我的java/tomcat应用程序前面放一个简单的nginx反向代理,在端口8080上运行良好,但我没有运气。我的浏览器返回一个空响应,我在服务器上看不到任何日志记录或错误 这是我的nginx Dockerfile: FROM nginx COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 10040 CMD ["nginx"] 和nginx-T中的我的nginx.conf $ docker run -p 10040:8080 --name rproxy

在我的java/tomcat应用程序前面放一个简单的nginx反向代理,在端口8080上运行良好,但我没有运气。我的浏览器返回一个空响应,我在服务器上看不到任何日志记录或错误

这是我的nginx Dockerfile:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 10040
CMD ["nginx"]
和nginx-T中的我的nginx.conf

$ docker run -p 10040:8080 --name rproxy --rm we1p2xxxxxxx.xxx.xx.com:11095/myapp-rproxy nginx -T
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
daemon off;
error_log /dev/stdout info;
worker_processes 1;

events { worker_connections 1024; }

http {
    access_log /dev/stdout;
    sendfile on;

    upstream docker-myapp {
        server localhost:8080;
    }

    server {
        listen 10040;

        location / {
            proxy_pass         http://docker-myapp;
            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_set_header   X-Forwarded-Host $server_name;
        }
    }

}
当我从浏览器打电话时,我什么也没有得到——一个空洞的回应。甚至没有响应状态

也没有记录任何内容-没有错误,没有访问日志,这两个我都已重定向到/dev/stdout

这是nginx的启动日志输出:

$ docker run -p 10040:8080 --name rproxy --rm we1pxxxxxxxx.xxx.xxx.com:11095/myapp-rproxy nginx-debug
2017/11/29 14:17:06 [notice] 1#1: using the "epoll" event method
2017/11/29 14:17:06 [notice] 1#1: nginx/1.13.7
2017/11/29 14:17:06 [notice] 1#1: built by gcc 6.3.0 20170516 (Debian 6.3.0-18)
2017/11/29 14:17:06 [notice] 1#1: OS: Linux 4.9.49-moby
2017/11/29 14:17:06 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2017/11/29 14:17:06 [notice] 1#1: start worker processes
2017/11/29 14:17:06 [notice] 1#1: start worker process 7
我仍在试图找出如何从日志中获取更多信息——例如,它正在侦听的端口号。Cygwin
netstat
没有显示任何侦听10040端口的内容-尽管我在Dockerfile中有
EXPOSE 10040

这是docker ps:

$ docker ps
CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS              PORTS                                        NAMES
03d17ec349f7        we1pxxxxxxxx.xxx.xxx.com:11095/myapp-rproxy    "nginx"                  52 seconds ago      Up 51 seconds       80/tcp, 10040/tcp, 0.0.0.0:10040->8080/tcp   rproxy
eaf3ed033908        we1pxxxxxxxx.xxx.xxx.com:11095/myapp           "/bin/sh -c 'java ..."   2 hours ago         Up 2 hours          0.0.0.0:8080->8080/tcp                       myapp
这就是我使用
curl
时发生的情况:

$ curl -i http://localhost:8080
HTTP/1.1 401
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="xx.xx.xx.COM"
Content-Length: 0
Date: Wed, 29 Nov 2017 15:57:38 GMT

$ curl -i http://localhost:10040
curl: (52) Empty reply from server
$
我在Windows 10上使用docker 17.09.0-ce-win33,使用cygwin

有希望吗,世界

[更新2017-11-30]端口已锁定

Alexander Altshuler在回答中指出了一个简单的错误-我已经在docker容器内将nginx连接到10040,因此通过尝试使用命令行
-p 10040:80
参数将10040映射到80阻止了我的请求-由此产生了几个问题:

  • 我应该在哪里看到错误?我的curl请求应该在没有端口侦听的情况下超时吗

  • 为什么
    docker ps
    PORTS
    字段显示
    80/tcp
    ?这肯定没有打开(
    curl
    连接超时)

  • 现在docker用
    -p 10040:10040
    运行它,我看到:

$docker ps
容器ID映像命令已创建状态端口名称
b6379d40d0c2 we1pxxxxxxxx.xxx.xxx.com:11095/myapp”/bin/sh-c“java…”2分钟前上升2分钟0.0.0.0:8080->8080/tcp myapp
d3d5feb9e63f we1pxxxxxxxx.xxx.xxx.com:11095/myapp rproxy“nginx”20分钟前启动20分钟80/tcp,0.0.0.0:10040->10040/tcp rproxy
curl

$curlhttp://localhost:10040

502坏网关
502坏网关

nginx/1.13.7
运行docker coniatner的命令应以

docker run -p 10040:10040 ...
更新:

为什么docker ps PORTS字段显示80/tcp?肯定没有打开(卷曲连接超时)

我只能想象一个原因——你确实提供了
docker-run-p80…

nginx响应502坏网关的原因很清楚:

您已将nginx配置为连接到localhost:8080,但后端在外部主机上从容器中运行

此处的常规做法-创建用户定义的网络:

docker network create --driver bridge mynetwork
docker run --network=isolated_nw -p 10040:8080 --name rproxy ...
docker run --network=isolated_nw --name myapp ...
Nginx配置应如下所示:

daemon off;
error_log /dev/stdout info;
worker_processes 1;

events { worker_connections 1024; }

http {
    # use docker embedded DNS server to resolve myapp host name
    resolver 127.0.0.11;

    access_log /dev/stdout;
    sendfile on;

    upstream docker-myapp {
        server myapp:8080; # !!!
    }

    server {
        listen 10040;

        location / {
            proxy_pass         http://docker-myapp;
            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_set_header   X-Forwarded-Host $server_name;
        }
    }

}
首先发布解决方案:

使用用户定义的网桥网络:

docker网络创建-d桥myapp-net

然后我启动容器,将它们连接到
myapp-net

docker-run-p8080:8080--network=myapp-net--name myapp--rm myregistry:11095/myapp

docker run-p 10040:443--network=myapp-net--name rproxy--rm myregistry:11095/myapp rproxy


警告:我还不明白为什么默认的docker网桥网络不能工作,尽管读了

嗨,Alex,我去掉了上游的,看起来是多余的。另外,端口80正在反向代理上侦听-仍在侦听。不知道为什么,根本不要在命令行上声明它。