このトピックを再度持ち上げるのは気が引けますが、まだ関連性があります。Discourse としてのインストールは完璧に完了し、すべて問題なさそうですが、ポート 80 と 443 が外部から到達できません。
更新: 基本インストール は、Azure の Ubuntu Server 上でそのまま動作します。
2 回目に私が異なって行ったことは以下の通りです:
-
VM の作成後、
discourse-setupを実行した際、プロセスを中断しませんでした。そのため、すべてが一度に実行されました。1 回目はスワップ領域がないことに気づき、
discourse-setupスクリプトが不足している場合に設定するものの、一度シェルに戻って確認してしまいました。その後、インストールのプロンプトが 基本ガイド と異なっていたため、もう一度中断してしまいました。+ 驚いたのは Let’s Encrypt の項目で、通知を受け取るためのメールアドレスを求められることでした。HTTPS を手動で設定する必要があると思っていたのです。実際には、スクリプトが Let’s Encrypt の SSL 証明書を使用して Discourse インスタンスを設定してくれます。<c/br>+ もう一つは SMTP のユーザー名とパスワードの項目です。ここを空欄にできたかどうかは未だ確信が持てませんが、管理用メールアドレスとそのアカウントのパスワードを入力しました。
-
この meta.discourse のスレッド に従って、スワップ領域を手動で設定しました。
これが原因だったとは思いませんが、念のため記載します。2 回目は、1 回目と同じ手順で行いましたが、(1) スワップを手動で設定し、(2)
discourse-setupを中断せずに実行した点が異なります。1 回目のインスタンスを救えた可能性もありますが、Discourse のアーキテクチャはまだ謎が多く、HTTP/HTTPS エンドポイントを再起動する方法も確信が持てません。
netstat -tulpnの出力を比較すると、1 回目のインスタンスでは関連するすべてのサービスが適切なポートで実行・リッスンしていることがわかります(例:PostgreSQL は 5432、Redis は 6379 など)。ただし、ポート 80 と 443 のエントリが欠落しており、nginx が実行されていないことを示唆しています:
1 回目(失敗)のインスタンス:
$ sudo -s
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62396a99737c local_discourse/app "/sbin/boot" 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
# docker exec -it 62396a99737c bash
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp6 :::5432 :::* LISTEN -
tcp6 :::6379 :::* LISTEN -
2 回目のインスタンス:
(docker)# netstat -tulpn
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 0.0.0.0:6379 0.0.0.0:* LISTEN -
tcp 0.0.0.0:80 0.0.0.0:* LISTEN 2359/nginx: master
tcp 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0.0.0.0:443 0.0.0.0:* LISTEN 2359/nginx: master
tcp6 :::6379 :::* LISTEN -
tcp6 :::5432 :::* LISTEN -
今後の自分へのメモ:
-
1 回目はポート 80 と 443 のリスナーがないことに気づきましたが、
127.0.0.1:3000のソケット(デフォルトの Rails ソケットだと記憶していました)は確認できました。nginx が実行されていないかもしれないという考えは浮かばず、何らかの理由で Docker のポートマッピングが原因だと疑い、netcat を使って基本的なリダイレクトを行いました:Docker 内:
nc -l -p 80 -c "nc 127.0.0.1 3000"
VM 内の Docker 外:nc -zv localhost 80およびcurl localhost:80(これで Docker に問題がないことが確認できました) -
また、Azure のインバウンドポートルール を疑いましたが、
nc -zvがConnection refusedを返し続けるのは、ポートは開いているが、相手側でリスナーが動作していないことを意味すると気づきました。(もしポートがブロックされていれば、ncは単にフリーズするはずです。)