抱歉,我重复了之前已经问过十几次的问题,但我已经阅读了这些问题的每一个答案,却无法解决我的问题。
我正在尝试设置一个 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/hosts
dnsmasq 用于本地 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。