【问题标题】:NGINX redirect to docker containersNGINX 重定向到 docker 容器
【发布时间】:2018-03-27 10:54:27
【问题描述】:

我有一个运行 docker 的 CentOS 服务器,带有 3 个容器和 NGINX。开放的端口是 80、443 和 22。容器的端口如下:

  • 集装箱 A:9000
  • 集装箱 B:4201
  • 容器 C:5443

每个 NGINX 配置文件几乎完全相同:

/etc/nginx/conf.d/A.conf

server {
    listen 80;

    server_name A.local;
    return 301 https://A.local$request_uri;
}
server {
    listen 443 ssl;

    server_name A.local;

    ssl_certificate ...;
    ssl_certificate_key ...;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

文件之间唯一改变的是 A 到 B、A 到 C 以及 127.0.0.1 之后的端口号。

现在,当我浏览到 A.local(位于我本地机器上的 /etc/hosts 中)时,我得到了一个自签名的 ssl,我接受,我得到了正确的网站!一个作品!

浏览到 B.local,我得到一个自签名的 ssl,我接受,我得到 502 bad gateway...

浏览到 C.local,我得到一个自签名的 ssl,我接受,我得到 502 bad gateway...

当我转到 192.168.1.247:4201 时,我得到了正确的网站,容器运行正常,我可以直接访问它,nginx 没有正常通过。

编辑附加信息:

码头工人ps

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                  PORTS                                                 NAMES
047f31019eb9        gitlab/gitlab-ce      "/assets/wrapper"        6 hours ago         Up 6 hours (healthy)    80/tcp, 0.0.0.0:5522->22/tcp, 0.0.0.0:5443->80/tcp    gitlab
7ffe8b06b16b        crate                 "/docker-entrypoin..."   26 hours ago        Up 26 hours (healthy)   4300/tcp, 5432/tcp, 0.0.0.0:4201->4200/tcp            crate-01
f82437f328de        portainer/portainer   "/portainer"             2 days ago          Up 2 days               0.0.0.0:9000->9000/tcp                                portainer

sudo 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:
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}


# configuration file /usr/share/nginx/modules/mod-http-geoip.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so";

# configuration file /usr/share/nginx/modules/mod-http-image-filter.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so";

# configuration file /usr/share/nginx/modules/mod-http-perl.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_perl_module.so";

# configuration file /usr/share/nginx/modules/mod-http-xslt-filter.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so";

# configuration file /usr/share/nginx/modules/mod-mail.conf:
load_module "/usr/lib64/nginx/modules/ngx_mail_module.so";

# configuration file /usr/share/nginx/modules/mod-stream.conf:
load_module "/usr/lib64/nginx/modules/ngx_stream_module.so";

# configuration file /etc/nginx/mime.types:

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/font-woff                 woff;
    application/java-archive              jar war ear;
    application/json                      json;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.apple.mpegurl         m3u8;
    application/vnd.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/xspf+xml                  xspf;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp2t                            ts;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

# configuration file /etc/nginx/conf.d/A.local.conf:
server {
    listen 80;

    server_name A.local;
    return 301 https://A.local$request_uri;
}
server {
    listen 443 ssl;

    server_name A.local;

    ssl_certificate /etc/ssl/certs/www/A.local/A.local.crt;
    ssl_certificate_key /etc/ssl/certs/www/A.local/A.local.key;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

# configuration file /etc/nginx/conf.d/B.local.conf:
server {
    listen 80;

    server_name B.local;
    return 301 https://B.local$request_uri;
}
server {
    listen 443 ssl;

    server_name B.local;

    ssl_certificate /etc/ssl/certs/www/B.local/B.local.crt;
    ssl_certificate_key /etc/ssl/certs/www/B.local/B.local.key;

    location / {
        proxy_pass http://127.0.0.1:5443;
    }
}

# configuration file /etc/nginx/conf.d/C.local.conf:
server {
    listen 80;

    server_name C.local;
    return 301 https://C.local$request_uri;
}
server {
    listen 443 ssl;

    server_name C.local;

    ssl_certificate /etc/ssl/certs/www/C.local/C.local.crt;
    ssl_certificate_key /etc/ssl/certs/www/C.local/C.local.key;

    location / {
        proxy_pass http://127.0.0.1:4201;
    }
}

【问题讨论】:

  • 你能发布docker ps的输出吗?您是否通过nginx -T 确认一切都按照nginx 中的例外情况运行?
  • 在你发布的 nginx -T 的输出中,所有proxy_pass都指向proxy_pass 127.0.0.1:4201;没有端口 9000 或 5443。
  • @LucaG 这是我的问题中的错字,我已修复。 nginx -T 的输出显示它们是不同的端口。
  • 如果你在运行 nginx 的同一台主机上执行 wget -q -O- 127.0.0.1:4201,你会得到错误还是正确的输出?
  • @lucaG,9000 得到了我期望的 HTML,4201 给了我正在运行的 crate 容器上的 JSON,5443 给了我期望的 HTML。 JSON 有点奇怪,因为通过我的浏览器访问它可以获得预期的界面,但是它似乎正在工作。

标签: nginx


【解决方案1】:

我认为 SELinux 可能会阻止 nginx 打开到 127.0.0.1:5443 的连接。尝试禁用 SELinux 或允许 nginx 打开与任何端口的连接:

setsebool -P httpd_can_network_connect true

【讨论】:

  • 是的,我刚刚阅读的错误日志显示其他端口的权限错误。是的,setsebool 命令修复了端口。所以这是一个问题。但是现在那个消失的奇怪错误又出现了……试图去 B.local 重定向到 C.local……至少我可以很好地访问我的服务器的 2/3。
  • 你刚刚拯救了我的理智。
猜你喜欢
  • 2017-05-07
  • 2020-12-10
  • 1970-01-01
  • 2021-12-27
  • 2018-05-23
  • 2019-03-11
  • 2022-01-20
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多