アップデート
提供された汎用 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 -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)
これはポートが正しく開かれていることを示していると思います。
ピングチェック
ドメインでサーバーに ping を実行すると、期待される 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」が機能しているかどうかを確認したときのエントリが 1 つあります (機能しています)
したがって、私が知る限り、nginx にはエラーは表示されていません。
結論
現時点では、Google サポートに直接支払うこと以外、この問題を解決するために考えられるすべての手段を試しました... 変数を最小限に抑えるために、可能な限り最も単純なユースケースを使用しようとしていますが、Google によってホストされているときに IP またはドメイン経由でサイトにアクセスすると、「接続拒否」エラーが発生します。他の 2 つのプロバイダーによってホストされているときは、問題なく動作します。結論は? 私は困惑しています...
答え1
質問には 3 つの主なポイントがあることがわかります。バックエンドとしての nodejs アプリ、ポート 443 でリッスンしていない nginx、リバース プロキシ構成です。各ポイントを個別に確認してみましょう。
- nodejs アプリ: ローカルホストからアクセスして、正しく応答することを確認します
- 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を再起動してテストします。
- 3 番目のポイントは、アプリケーションを HTTPS 経由で公開するためのリバース プロキシとして nginx を構成することです。上記の構成は機能するはずです。機能しない場合は、この種の構成について正確に説明している GoCD のこのドキュメントを読むことをお勧めします。
答え2
私はそれを考え出した!!!
.APP! これまでずっと .app TLD でした!!!
コメント投稿者に名前と IP を提供するためにランダムなドメイン名を購入しようとしていたところ、面白半分に .app を選択しました (このテスト用にばかげた名前を考えていました)。すると、次のメッセージを読みました。「.APP は安全な名前空間です。Foobarington.app を今すぐ購入できますが、Web サイトへの接続には SSL 証明書が必要になります。安全な名前空間と SSL 証明書の取得方法について詳しくは、こちらをご覧ください。
そうなんです! .app ドメインをサーバーに指定しようとしたところ、その時点でサーバーに SSL 証明書がなかったため、ロードされませんでした。証明書を取得するために CertBot を使用するつもりでしたが、自動証明書付与を行うには最初に http アクセスが必要でした。
この TLD タイプとホストを使用して Certbot (または同等のソリューション) を機能させる方法を見つける必要がありますが、この問題が発生しているのは間違いなく私が使用している TLD タイプです。