Nginx가 서버 IP를 가리키는 도메인/URL과 작동하지 않습니다.

Nginx가 서버 IP를 가리키는 도메인/URL과 작동하지 않습니다.

내가 설정한 구성(아래)은 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를 통한 해당 도메인에 대한 요청은 nginx 기본 구성의 기본 서버 블록에 의해 캡처됩니다.

SSL 서버 블록에서 했던 것처럼 여기에 도메인을 추가하세요.

server_name localhost api.example.com;

답변2

귀하의 DNS 이름이 실제로 api.example.com인지 의심스럽습니다. 하지만 여기에 게시하지 않는 것이 좋습니다. 그러나 이 오류는 잘못된 호스트 이름(예: az, 0-9, '.' 이외의 문자가 포함된 호스트 이름)을 제공하는 경우 예상됩니다. 그리고 '-'. 이는 의도적인 것이 아닐 수도 있습니다. 후행 ';'을 생략합니다. 이름 목록의 결과는 아마도 동일할 것입니다. 이러한 시나리오에서 nginx는 구성 파일 로드를 거부합니다. 그것은언제나적용하기 전에 구성을 테스트하는 것이 좋습니다 nginx -t. 'systemctl reload nginx'는 구성이 잘못되었음을 알려주지 않습니다.

관련 정보