You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 12 Hetzner服务器Nginx配置问题:主域名静态页面访问异常,子域名TCP转发需正确区分

Debian 12 Hetzner服务器Nginx配置问题:主域名静态页面访问异常,子域名TCP转发需正确区分

看起来你现在卡在Nginx的TCP转发和主域名静态页共存的问题上了,咱先捋清楚之前配置里的坑:

  1. 最开始的TCP stream配置直接监听了443端口,不管访问哪个域名都一股脑转发到mail.mydomain.com:44369,这就导致主域名mydomain.com的请求也被转走了,自然看不到静态页。
  2. 后来换成HTTP反向代理,Nginx会终止SSL连接,替换成主域名的证书,这不符合你要让Cowmail用自己证书的需求。
  3. 最后尝试的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 16:28:14