GCE에서 가장 간단한 nginx centos 설정으로 "연결 거부"가 발생하는 이유는 무엇입니까?

GCE에서 가장 간단한 nginx centos 설정으로 "연결 거부"가 발생하는 이유는 무엇입니까?

업데이트

제공된 일반 VPS(Google 아님)를 제외하고는 아래와 동일한 단계를 따랐으며 Certbot으로 HTTPS 활성화와 같은 비공개 단계를 포함하여 예상대로 작동했습니다... 그래서 제 추정으로는 제가 GCE에 특별한 구성이 있는 것 같습니다. 오해/오용/하지 않음으로 인해 아래 설명된 문제가 발생합니다. 그게 GCE가 될 수 있는지에 대한 아이디어가 있나요?

설정

Debian이 설치된 Google Cloud Compute Engine 인스턴스가 있습니다. 기본적으로 이 GCE 인스턴스를 설정하는 동안 제공된 GCE 방화벽 옵션을 통해 HTTP 및 HTTPS 트래픽을 허용했습니다. SSH를 통해 GCE 인스턴스에 들어가서 다음을 수행했습니다.

GCE http/https 권한 부여 스크린샷트래픽을 허용하는 GCE의 증거

1.) nginx 및 ufw 설치

sudo apt install nginx ufw

2.) HTTP, HTTPS 및 SSH 연결을 허용하는 UFW 규칙을 활성화했습니다.

sudo ufw allow (http/https/ssh)
sudo systemctl enable ufw
sudo systemctl start ufw

3.) 기본 구성을 떠나 nginx를 활성화했습니다.

sudo systemctl enable nginx
sudo nginx -t ( returned "ok" results )
sudo systemctl start nginx

4.) 내 도메인이 올바른 IP를 가리키고 있는지 확인

테스트

컬링 테스트

도메인을 방문하면 여전히 "domain.com 연결 거부" 오류가 발생합니다.

curl localhost

입력하면 예상되는 기본 콘텐츠를 얻습니다.

Netstat 확인

netstat -a

적절한 포트에서 외부 세계의 소리를 듣고 있음을 알 수 있습니다.

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN  

UFW 확인

방화벽 규칙을 확인하면 다음이 표시됩니다.

sudo ufw status
SSH                        ALLOW       Anywhere                  
224.0.0.251 mDNS           ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
3000                       ALLOW       Anywhere                  
SSH (v6)                   ALLOW       Anywhere (v6)             
ff02::fb mDNS              ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
3000 (v6)                  ALLOW       Anywhere (v6)  

내 포트가 올바르게 열려 있음을 나타냅니다.

핑 확인

도메인별로 내 서버를 핑할 수 있으며 예상 IP로 올바르게 반환됩니다.

Pinging FizzBuzz.app [cor.rec.t.IP] with 32 bytes of data:
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=34ms TTL=57

Ping statistics for cor.rec.t.IP:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 33ms, Maximum = 34ms, Average = 33ms

로깅 확인

/var/log/nginx/error.log를 방문하면 비어 있습니다(실패한 결과로 도메인을 방문한 후).

/var/log/nginx/access.log를 방문하면 "curl localhost"가 작동했는지 확인할 때 대한 단일 항목이 있습니다.

따라서 내가 알 수 있는 한 nginx에는 오류가 표시되지 않습니다.

결론

현재로서는 Google 지원에 직접 문의하는 것 외에는 이 문제를 해결하기 위해 가능한 모든 방법을 다 동원했습니다... 변수를 최소화하기 위해 가능한 가장 간단한 사용 사례를 사용하려고 시도하고 있지만 여전히 '거부됨' 메시지가 표시됩니다. Google에서 호스팅할 때 IP나 도메인을 통해 내 사이트를 방문할 때 '연결' 오류가 발생했는데, 다른 2개 제공업체에서 호스팅하면 정상적으로 작동합니다. 결론? 나는 당황했다 ...

답변1

귀하의 질문에서 3가지 주요 사항을 볼 수 있습니다: 백엔드로서의 nodejs 앱, 포트 443에서 수신 대기하지 않는 nginx 및 역방향 프록시 구성입니다. 분리된 각 지점을 살펴보기 위해 분해해 보겠습니다.

  1. nodejs 앱: localhost에서 액세스를 시도하고 제대로 응답하는지 확인하세요.

곱슬 곱슬하다http://127.0.0.1/3000

  1. nginx가 포트 443에서 수신 대기하지 않음: 이를 위해 nginx에서 서버 블록을 구성해야 하며 HTTP에서 HTTPS로 리디렉션하는 것도 좋은 아이디어입니다.
server {
    listen 80 default_server;
    server_name fizzbuzz.app www.fizzbuzz.app;
    return 301 https://fizzbuzz.app$request_uri;
}


server {
    listen 8443 ssl;
    server_name fizzbuzz.app www.fizzbuzz.app;

    index index.html index.htm;

    access_log /var/log/nginx/fizzbuzz-access.log;
    error_log /var/log/nginx/fizzbuzz-error.log error;

     location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
     }

    ssl_certificate     /etc/ssl/certs/fizzbuzz.app-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/fizzbuzz.app.key;
}

인증서를 발급하려면 certbot이나 ACME 스크립트를 사용하는 것이 좋습니다.

즉, acme.sh를 사용하면 다음 명령을 사용하여 인증서를 발급할 수 있습니다.

/root/.acme.sh/acme.sh --issue --nginx -d fuzzbuzz.app -d www.fuzzbuzz.ap

/root/.acme.sh/acme.sh --install-cert -d fuzzbuzz.app -d www.fuzzbuzz.app \
--cert-file /etc/ssl/certs/fuzzbuzz.app.crt \
--key-file /etc/ssl/certs/fuzzbuzz.app.key \
--fullchain-file ${CERTS_DIR}/fuzzbuzz.app-fullchain.pem \
--log /var/log/acme_log \
--reloadcmd "systemctl restart nginx"

인증서를 발급하고 제자리에 둔 후 nginx를 다시 시작하고 테스트하세요.

  1. 세 번째 요점은 HTTPS를 통해 애플리케이션을 노출하기 위해 nginx를 역방향 프록시로 구성하는 것입니다. 위의 구성이 작동해야 한다고 생각합니다. 그렇지 않은 경우에는 이러한 종류의 구성을 정확하게 설명하는 GoCD의 이 문서를 읽어 보시기 바랍니다.

역방향 프록시 구성

답변2

나는 그것을 알아!!!

.앱! 지금까지 .app TLD였습니다!!!

댓글 작성자에게 이름과 IP를 제공하기 위해 임의의 도메인 이름을 구입하려고 하다가 재미삼아 .app 하나를 선택했습니다(이 테스트를 위해 어리석은 이름을 생각해 냈습니다). 다음을 읽었습니다. ".APP은 안전합니다. 지금 Foobarington.app을 구매할 수 있지만 웹사이트 연결을 위해서는 SSL 인증서가 필요합니다. 보안 네임스페이스와 SSL 인증서를 얻는 방법에 대해 자세히 알아보세요.

그래서! 서버에서 내 .app 도메인을 가리키려고 했을 때 해당 시점의 내 서버에 SSL 인증서가 없었기 때문에 로드되지 않았습니다. 인증서를 얻기 위해 CertBot을 사용하려고 했지만 자동화된 인증서 부여 작업을 수행하려면 처음에 http 액세스가 필요합니다.

이 TLD 유형과 호스트를 사용하여 Certbot(또는 동등한 솔루션)이 작동하도록 하는 방법을 알아내야 하지만 이 문제를 일으킨 것은 확실히 TLD 유형입니다!

관련 정보