nginx代理容器的Docker网络问题

nginx代理容器的Docker网络问题,nginx,networking,docker,routing,iptables,Nginx,Networking,Docker,Routing,Iptables,我目前正在尝试建立一个基于docker的jira和confluence平台,该平台由nginx代理,并遇到了一些路由和网络问题 基本设置由三个docker容器组成-nginx conatainer处理特定域名(例如jira.mydomain.com、confluence.mydomain.com)的https请求,并将请求重定向(代理传递)到jira和confluence的特定容器 此设置通常正常工作-我可以通过在浏览器中打开来访问jira实例和confluence实例 登录jira时,我遇到的

我目前正在尝试建立一个基于docker的jira和confluence平台,该平台由nginx代理,并遇到了一些路由和网络问题

基本设置由三个docker容器组成-nginx conatainer处理特定域名(例如jira.mydomain.com、confluence.mydomain.com)的https请求,并将请求重定向(代理传递)到jira和confluence的特定容器

此设置通常正常工作-我可以通过在浏览器中打开来访问jira实例和confluence实例

登录jira时,我遇到的问题变得明显:

以及以下“了解更多”链接:

不幸的是,所提供的建议解决方案没有帮助我确定和解决问题。相反,日志文件中的某些异常会导致出现以下问题:

2017-06-07 15:04:26980 http-nio-8080-exec-17错误christian.schlaefcke 904x1078x1 eqafq3 84.141.114.234172.17.0.7/rest/applinks/3.0/applicationlinkForm/manifest.json[c.a.a.c.rest.ui.CreateApplicationLinkUIResource]检索清单时引发的ManifestNotFoundException异常
检索清单时引发ManifestNotFoundException
com.atlassian.applinks.spi.manifest.ManifestNotFoundException:java.net.NoRouteToHostException:没有到主机的路由(无法访问主机)
...
原因:java.net.NoRouteToHostException:没有到主机的路由(无法访问主机)

当我遵循JIRA容器中的提示并在其中运行curl语句时:

curl-H“接受:应用程序/json”https://jira.mydomain.com/rest/applinks/1.0/manifest -v

我最终得到了这个错误:

*正在尝试。。。
*连接到端口443失败:没有到主机的路由
*无法连接到jira.mydomain.com端口443:没有到主机的路由
*正在关闭连接0
curl:(7)无法连接到jira.mydomain.com端口443:没有到主机的路由

编辑: 可以从容器内部ping外部URL jira.mydomain.com:

root@c9233dc17588:#ping jira.mydomain.com
PING jira.mydomain.com()56(84)字节的数据。
来自rs226736.mydomain.com()的64字节:icmp_seq=1 ttl=64时间=0.082毫秒
来自rs226736.mydomain.com()的64字节:icmp_seq=2 ttl=64时间=0.138毫秒
来自rs226736.mydomain.com()的64字节:icmp_seq=3 ttl=64时间=0.181毫秒

从JIRA容器外部(例如docker主机或其他机器),curl语句工作正常

一般来说,我对linux有很好的经验,但我对网络、路由和iptables的了解相当有限。Docker正在centos 7系统上结合Docker compose运行当前的17.03.1-ce版本:

~]#uname-a
Linux rs226736 3.10.0-514.21.1.el7.x86#u 64#1 SMP周四5月25日17:04:51 UTC 2017 x86_64 x86_64 GNU/Linux

目前我甚至不明白这到底是什么样的问题(iptables?、路由、docker?),以及如何调试:-(

我在谷歌上找到了一些iptables和nginx相关的提示,但都没有成功。如果有任何提示能给我指明正确的方向,我将不胜感激

请求的配置:

NGINX docker-compose.yml

nginx:
  image: nginx
  container_name: nginx
  ports:
    - 80:80
    - 443:443
  external_links:
    - my_domain-jira
    - my_domain-confluence
  volumes:
    - /opt/docker/logs/nginx:/var/log/nginx
    - ./nginx.conf:/etc/nginx/nginx.conf
    - ./certs/jira.mydomain.com.crt:/etc/ssl/certs/jira.mydomain.com.crt
    - ./certs/jira.mydomain.com.key:/etc/ssl/private/jira.mydomain.com.key
    - ./certs/confluence.mydomain.com.crt:/etc/ssl/certs/confluence.mydomain.com.crt
    - ./certs/confluence.mydomain.com.key:/etc/ssl/private/confluence.mydomain.com.key
JIRA docker-compose.yml(汇流相似):

NGINX-NGINX.conf

upstream jira {
    server my_domain-jira:8080;
}

# begin jira configuration
server {
    listen 80;
    server_name  jira.mydomain.com;

    client_max_body_size 500M;
    rewrite ^ https://$server_name$request_uri? permanent;
}

server {
    listen       443 ssl;
    server_name  jira.mydomain.com;

    ssl          on;
    ssl_certificate      /etc/ssl/certs/jira.mydomain.com.crt;
    ssl_certificate_key  /etc/ssl/private/jira.mydomain.com.key;

    ssl_session_timeout  5m;

    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';

    server_tokens off;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    client_max_body_size 500M;

    location / {
        proxy_pass http://jira/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
    }
}
创意(nginx/代理通行证/上游)主要来自:


与虚拟服务器提供商讨论后发现,plesk firewall和iptables之间的防火墙规则冲突导致了此问题。提供商修复冲突后,可以访问容器


此问题现已解决-感谢所有参与的人!

可以添加更多疑难解答信息:从容器内部(
docker exec-it bash
)你能ping jira.mydomain.com吗?它能解析为转发到nginx容器的IP地址吗?谢谢你的支持-我用请求的信息更新了帖子。公共IP地址是分配给主机本身还是在网络级别上进行了一些NAT?如果是,你能详细说明更多的网络布局吗(路由器、型号等)。我怀疑这是一个发夹式NAT问题。公共IP是直接分配的。该系统是一个由公共VM提供商托管的虚拟根服务器。发夹式NAT问题意味着缺少iptables规则?能否添加您的撰写文件,这将有助于了解网络设置。
upstream jira {
    server my_domain-jira:8080;
}

# begin jira configuration
server {
    listen 80;
    server_name  jira.mydomain.com;

    client_max_body_size 500M;
    rewrite ^ https://$server_name$request_uri? permanent;
}

server {
    listen       443 ssl;
    server_name  jira.mydomain.com;

    ssl          on;
    ssl_certificate      /etc/ssl/certs/jira.mydomain.com.crt;
    ssl_certificate_key  /etc/ssl/private/jira.mydomain.com.key;

    ssl_session_timeout  5m;

    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';

    server_tokens off;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    client_max_body_size 500M;

    location / {
        proxy_pass http://jira/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
    }
}