Конфигурация, которую я установил (ниже), работает для 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» не сообщит вам, что у вас плохая конфигурация.