Nginx 无法使用指向服务器 IP 的域/url

Nginx 无法使用指向服务器 IP 的域/url

我设置的配置(如下)适用于localhost我的域,但不适用于我的域。目标是使用基本认证所以只有我可以访问它。当我转到 时localhost,它会升级为https,我必须完成身份验证,然后才会显示端口 3000,正如它应该的那样。但是,转到api.example.com不会提示身份验证,不会升级连接,只显示Invalid Host header。当我打开端口 3000 进行端口转发并转到 时api.example.com:3000,我可以访问该端口,但它不需要身份验证,不使用https,我的目标是避免端口转发。这个配置来自说明,所以我不知道可能是什么问题。为什么我的子域不能使用此配置?

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream supabase {
    server 127.0.0.1:3000;
}

server {
    listen      80;
    server_name localhost *host IP* api.example.com;
    access_log  off;
    rewrite ^ https://$host$request_uri? permanent;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name localhost *host IP* api.example.com;

    ssl_certificate /etc/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/api.example.com/privkey.pem;

    # STUDIO
    location / {
        auth_basic "Authentication Required";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_set_header Host $host;
        proxy_pass http://supabase;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
    }
}

防火墙:

 sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp (Nginx HTTP)        ALLOW IN    Anywhere
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
8000                       ALLOW IN    Anywhere
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere
443/tcp (Nginx HTTPS)      ALLOW IN    Anywhere
80/tcp (Nginx HTTP (v6))   ALLOW IN    Anywhere (v6)
80 (v6)                    ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)
8000 (v6)                  ALLOW IN    Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)
443/tcp (Nginx HTTPS (v6)) ALLOW IN    Anywhere (v6)

答案1

您的 80 端口服务器块仅配置了名称localhost

server_name localhost;

这里缺少域名api.example.com。因此,通过 HTTP 对该域名的请求被 nginx 默认配置中的默认服务器块捕获。

在此处添加域,就像在 SSL 服务器块中所做的那样。

server_name localhost api.example.com;

答案2

我怀疑您的 DNS 名称是否真的是 api.example.com - 但最好不要在此处发布它。但是,如果您提供的主机名无效 - 即包含除 az、0-9、'.' 和 '-' 之外的字符,则会出现此错误。这可能不是故意的 - 从名称列表中省略尾随的 ';' 可能会产生相同的结果。在这种情况下,nginx 将拒绝加载配置文件。其总是在应用之前测试您的配置是一个好主意nginx -t;“systemctl reload nginx”不会告诉您您的配置不好。

相关内容