docker nginx反向代理无错误,但返回空负载
在我的java/tomcat应用程序前面放一个简单的nginx反向代理,在端口8080上运行良好,但我没有运气。我的浏览器返回一个空响应,我在服务器上看不到任何日志记录或错误 这是我的nginx Dockerfile: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
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
我仍在试图找出如何从日志中获取更多信息——例如,它正在侦听的端口号。Cygwinnetstat
没有显示任何侦听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正在反向代理上侦听-仍在侦听。不知道为什么,根本不要在命令行上声明它。