Nginx не работает с доменом/URL, указывающим на IP-адрес сервера

Nginx не работает с доменом/URL, указывающим на IP-адрес сервера

Конфигурация, которую я установил (ниже), работает для localhost, но не для моего домена. Цель — получить внешний доступ к порту 3000 с помощьюбазовая аутентификацияпоэтому только я могу получить к нему доступ. Когда я перехожу на 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 захватывается блоком default server из конфигурации nginx по умолчанию.

Добавьте здесь домен, как вы это сделали в блоке SSL-сервера.

server_name localhost api.example.com;

решение2

Я сомневаюсь, что ваше DNS-имя действительно api.example.com, но это хорошая практика — НЕ публиковать его здесь. Однако эта ошибка ожидается, если вы указали недопустимое имя хоста, то есть содержащее символы, отличные от az, 0-9, '.' и '-'. Это может быть непреднамеренно — пропуск завершающего ';' из списка имен, вероятно, приведет к тому же результату. В таком сценарии nginx откажется загружать файл конфигурации. ЕговсегдаХорошая идея — протестировать конфигурацию nginx -tперед применением; «systemctl reload nginx» не сообщит вам, что у вас плохая конфигурация.

Связанный контент