Debian 12 Hetzner服务器Nginx配置问题:主域名静态页面访问异常,子域名TCP转发需正确区分
Debian 12 Hetzner服务器Nginx配置问题:主域名静态页面访问异常,子域名TCP转发需正确区分
看起来你现在卡在Nginx的TCP转发和主域名静态页共存的问题上了,咱先捋清楚之前配置里的坑:
- 最开始的TCP stream配置直接监听了443端口,不管访问哪个域名都一股脑转发到
mail.mydomain.com:44369,这就导致主域名mydomain.com的请求也被转走了,自然看不到静态页。 - 后来换成HTTP反向代理,Nginx会终止SSL连接,替换成主域名的证书,这不符合你要让Cowmail用自己证书的需求。
- 最后尝试的
ssl_preread配置思路是对的,但你把default指向了一个不存在的上游glance-no-upstream-instance,导致主域名访问443时找不到后端,直接报了PR_END_OF_FILE_ERROR。
接下来给你一套能完美解决问题的配置,核心思路是用stream模块监听公网的80/443,通过域名区分转发目标:mail子域名转去Cowmail端口,其他请求转去Nginx内部的HTTP端口处理静态页,这样既不会干扰SSL证书,又能让主域名正常显示静态内容。
第一步:调整TCP stream配置(/etc/nginx/tcpconf.d/lb)
stream { # 处理443端口:通过SNI识别域名,转发到对应端口 map $ssl_preread_server_name $target_443_port { mail.mydomain.com 44369; # 主域名和其他域名转发到Nginx内部的HTTPS端口(自定义的4430,避免和公网端口冲突) default 4430; } server { listen 443; ssl_preread on; # 开启SNI识别,不终止SSL连接 proxy_connect_timeout 20s; proxy_timeout 30s; proxy_pass 127.0.0.1:$target_443_port; } # 处理80端口:通过HTTP Host头识别域名,转发到对应端口 map $http_host $target_80_port { mail.mydomain.com 8069; # 主域名和其他域名转发到Nginx内部的HTTP端口(自定义的8080) default 8080; } server { listen 80; proxy_connect_timeout 20s; proxy_timeout 30s; proxy_pass 127.0.0.1:$target_80_port; } }
第二步:调整HTTP站点配置(/etc/nginx/sites-available/default)
让Nginx监听内部的8080和4430端口,处理静态页和跳转:
# 处理IP访问和主域名的80跳转 server { listen 8080 default_server; listen [::]:8080 default_server; root /home/www-none/public; index index.html; server_name _; # 主域名和www域名的80请求跳转到HTTPS if ($host ~* ^(www\.)?mydomain.com$) { return 301 https://mydomain.com$request_uri; } location / { try_files $uri $uri/ =404; } } # 主域名的HTTPS静态页服务 server { listen 4430 ssl; listen [::]:4430 ssl; root /home/www-mydomain-com/public; server_name mydomain.com; ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { try_files $uri $uri/ =404; } } # www域名跳转到主域名 server { listen 4430 ssl; listen [::]:4430 ssl; server_name www.mydomain.com; ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://mydomain.com$request_uri; }
第三步:验证配置并重启Nginx
先检查配置语法是否正确:
nginx -t
如果提示test is successful,就重启Nginx服务:
systemctl restart nginx
关键说明
- 这样配置后,Nginx只是作为TCP透传的桥梁,
mail.mydomain.com的SSL连接完全由Cowmail处理,不会替换证书。 - 主域名的请求会被转送到Nginx内部的HTTP/HTTPS端口,正常加载静态页面。
- 自定义的内部端口8080、4430不会暴露到公网,只会在服务器内部转发,避免冲突。
最后别忘了检查Hetzner的防火墙和服务器本地的ufw是否开放了80、443端口,不然外部访问还是会失败。
备注:内容来源于stack exchange,提问作者user1041501
相关产品推荐
相关产品推荐

