Nginx 反向代理给出 404 错误,但仅针对特定域名

Nginx 反向代理给出 404 错误,但仅针对特定域名

抱歉,我重复了之前已经问过十几次的问题,但我已经阅读了这些问题的每一个答案,却无法解决我的问题。

我正在尝试设置一个 nginx docker 容器作为反向代理,以便能够通过易于记忆的域名访问本地网络上的资源,并提供 SSL 加密。

域名是 amars.no,这是我拥有的一个域名,但官方 DNS 条目(即 Google/Cloudflare DNS 报告的条目)与我将在本地网络上用于访问反向代理的条目不匹配。相反,我设置了一个 dnsmasq 服务器,其中包含此域名的多个子域的自定义条目,这似乎按预期工作(dig hub.amars.no 返回 nginx 服务器的 IP)。

然后,我在 nginx 配置中添加了站点,每个本地服务都应该有自己的 URL,每个服务的子域名为 amars.no。问题是,尝试在浏览器中访问这些域中的任何一个都会返回 404 未找到错误。非常奇怪的是,我可以将 amars.no 更改为任何其他内容,甚至是 google.com 之类的内容,只要 dnsmasq hosts 文件中的条目和 nginx 配置匹配,它就会按照我想要的方式工作。只有当我使用我拥有的域名 amars.no 时,才会返回 404。我必须使用 amars.no 才能从 let's encrypt 获取有效的 SSL 证书。

我已尝试简化故障排除的设置,并且目前将 HTTPS 排除在设置之外,以避免由此引起的任何问题。

以下是网络设置的摘要:

  • 192.168.0.22:dnsmasq 服务器(端口 53)和 Jenkins Web 界面(端口 8081)
  • 192.168.0.23:nginx 反向代理服务器(在 docker 中)(端口 80 和 443),还提供包含指向不同服务的链接的静态 html 文件

现在我正在尝试让两个不同的 URL 工作:

  • jenkins.amars.no(应该指向(代理传递)192.168.0.22:8081)
  • hub.amars.no(应在 nginx 服务器上提供静态 html 文件

这是 dnsmasq 使用的 hosts 文件的内容(lone-gatekeeper 是计算机名称):

127.0.0.1 localhost
127.0.1.1 lone-gatekeeper

192.168.0.23 hub.amars.no
192.168.0.23 jenkins.amars.no

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

nginx 容器由该 docker-compose 文件配置并运行:

version: '3'

services:
  reverse:
    container_name: reverse
    hostname: reverse
    image: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - /opt/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /opt/nginx/conf.d:/etc/nginx/conf.d
      - /opt/ssl:/etc/ssl/private
      - /var/www/html:/usr/share/nginx/html

nginx 配置(使用 docker exec reverse nginx -T 的结果):

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# configuration file /etc/nginx/nginx.conf:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    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;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/sites-enabled/*.conf;
}

# 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/avif                                       avif;
    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    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.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/wasm                                 wasm;
    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;

    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/sites-enabled/hub.conf:
server {
  listen      80;
  server_name hub.amars.no;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }

}

# configuration file /etc/nginx/conf.d/sites-enabled/jenkins.conf:
upstream jenkins {
  server 192.168.0.22:8081;
}

server {
  listen      80;
  server_name jenkins.amars.no;

  location / {
    proxy_pass http://jenkins;
  }

}

dig jenkins.amars.no 的结果(在将 192.168.0.22 设置为主 DNS 服务器的计算机上)(hub.amars.no 给出相同的结果):

; <<>> DiG 9.10.6 <<>> jenkins.amars.no
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18497
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;jenkins.amars.no.      IN  A

;; ANSWER SECTION:
jenkins.amars.no.   0   IN  A   192.168.0.23

;; Query time: 18 msec
;; SERVER: 192.168.0.22#53(10.0.0.52)
;; WHEN: Mon Aug 07 01:01:42 CEST 2023
;; MSG SIZE  rcvd: 60

答案1

好吧,经过几个月的苦苦思索之后(在这里提问之前),我想我终于找到了问题的根源,以及为什么其他解决方案都不起作用。

这似乎是 ipv6 问题。我用于访问服务的计算机配置为在可用时优先使用/优先考虑 ipv6 连接(我想大多数现代系统都是这样)。当我的 dnsmasq 实例没有相关域名的 ipv6 地址时,它会查询其上游 DNS 服务器(Google DNS),并获取此域的官方 ipv6 地址记录。运行dig jenkins.amars.no AAAA证实了这一点。我没有为这个域创建任何网站/服务,因此它自然会返回 404。

我无法将 nginx 代理服务器的 ipv6 地址添加到/etc/hostsdnsmasq 用于本地 DNS 记录的文件中,因此我终止了 dnsmasq 实例,而是启动了一个 pihole docker 实例,在其中我将 ipv4 和 ipv6 地址都添加到 nginx 代理服务器。有了这个,现在一切都正常了,在此基础上配置 SSL 支持也按预期工作。

此外,如果我没有使用互联网上已经存在的域名(并且存在于公共 DNS 记录中),这也不会造成问题,因为本地 DNS 服务器不会从其上游 DNS 获得响应。但是,我必须使用我拥有的有效现有域名才能获得有效的 SSL 证书。

我不完全明白为什么更改为另一个(现有)域名不会造成麻烦。我尝试将 URL 更改为 jenkins.vg.no(vg.no 是一个知名的现有域名,在公共 DNS 服务器中具有 AAAA 记录),它运行正常(显然只适用于纯 HTTP,没有 SSL)。

tl;dr:在 2023 年,确保在本地 DNS 服务器上创建自定义 DNS 记录时同时支持 ipv4 和 ipv6。

相关内容