質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

5回答

6722閲覧

EC2+nginxでWebが表示されず、接続がタイムアウトします

query1000

総合スコア5

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

1クリップ

投稿2021/10/02 04:25

編集2021/10/03 06:32

事象

AWSにEC2サーバーをUbuntuで立て、SSHでアクセス出来ています。
nginxをインストールしましたが、ホスト名およびIPアドレスでアクセスするとタイムアウトになります。

$ curl localhost

では正しくnginxのサンプルindex.htmlが表示されますが、

$ curl www.example.com # 自分のホスト名

curl: (28) Failed to connect to xxx.xxx.xxx.xxx port 80: 接続がタイムアウトしました

および

$ curl www.example.com # EC2サーバーのElastic IPアドレス

curl: (28) Failed to connect to xxx.xxx.xxx.xxx port 80: 接続がタイムアウトしました

となる状態で、ブラウザーからアクセスしてもタイムアウトになります。
正しくWebページを表示させるにはどうすればいいでしょうか。

環境

OSはUbuntuです。

$ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.3 LTS (Focal Fossa)" (以下略)

nginxは1.20.1です。

$ nginx -V nginx version: nginx/1.20.1 built by gcc 9.3.0 (Ubuntu 9.3.0-10ubuntu2) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled (以下略)

設定

nginx.conf

インストール時のままです。
(空行と注釈を削っています)

$ cat /etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }

conf.d/default.conf

サーバー名を追加しました。

$ cat /etc/nginx/conf.d/default.conf server { listen 80; #server_name localhost; # ここに自分のホスト名を書きました server_name www.example.com; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

試したこと

curl localhostできていますので、nginxは動いていると思います。

$ curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>

プロセスの起動も確認しました。

$ ps ax | grep nginx 11435 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 11437 ? S 0:00 nginx: worker process 11495 pts/1 S+ 0:00 grep --color=auto nginx

ポートの状態は以下の通りです。

$ ss -natu | grep LISTEN | grep 80 tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*

しかし、curl 自分のホスト名とすると、接続がタイムアウトします。

$ curl www.example.com curl: (28) Failed to connect to login.tododone.biz port 80: 接続がタイムアウトしました

ブラウザーで同じホスト名にアクセスしても「接続がタイムアウトしました」と言われます。

自分のホスト名の名前解決は出来ています。

$ dig www.example.com ; <<>> DiG 9.16.1-Ubuntu <<>> www.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60139 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;www.example.com. IN A ;; ANSWER SECTION: www.example.com. 108 IN A xxx.xxx.xxx.xxx # 実際にはEC2のElastic IPが入っています ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: 土 10月 02 12:53:35 JST 2021 ;; MSG SIZE rcvd: 63

IP直打ちでcurlしても結果は同じでした。

$ curl xxx.xxx.xxx.xxx curl: (28) Failed to connect to xxx.xxx.xxx.xxx port 80: 接続がタイムアウトしました

アクセスログを確認しましたが、localhost からのアクセスしか記録されていませんでした。

$ cat /var/log/nginx/access.log 127.0.0.1 - - [02/Oct/2021:11:22:51 +0900] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.68.0" "-" 127.0.0.1 - - [02/Oct/2021:12:01:11 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" 127.0.0.1 - - [02/Oct/2021:12:06:58 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" 127.0.0.1 - - [02/Oct/2021:12:11:16 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" 127.0.0.1 - - [02/Oct/2021:12:23:00 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" 127.0.0.1 - - [02/Oct/2021:12:33:01 +0900] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

補足情報

AWSのEC2 > セキュリティグループから、以下のエントリーを追加しています。
SSHにはアクセス出来ています。

(セキュリティグループ名) IPv4 SSH TCP 22 0.0.0.0/0 (セキュリティグループ名) IPv4 HTTP TCP 80 0.0.0.0/0 (セキュリティグループ名) IPv4 HTTPS TCP 443 0.0.0.0/0 (セキュリティグループ名) IPv6 SSH TCP 22 ::0/0 (セキュリティグループ名) IPv6 HTTP TCP 80 ::0/0 (セキュリティグループ名) IPv6 HTTP TCP 443 ::0/0

ACLは設定していません。

追記

デフォルトのVPCを使っています。

デフォルトゲートウェイは以下のように設定されていました。
イメージ説明

また、ルートテーブルが以下のように設定されていました。
イメージ説明

VPC、サブネット、RTBの関係についてです、

まず、以下の位置に設定されたVPCについて
イメージ説明

サブネットが3つできていました。
イメージ説明

このVPCと、ルートテーブルが以下のように設定されていました。
イメージ説明

サブネットとルートテーブルの関連付けについては以下の通りです。
イメージ説明

どうか、よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mike2mike4

2021/10/02 04:56

IGWを設定してないとか?
query1000

2021/10/02 05:04

ありがとうございます。 デフォルトのVPCを使用していますが、インターネットゲートウェイはすでに作られていて、アタッチされていました。
guest

回答5

0

ありがとうございます。私が設定されたのではないのですが、VPC、サブネット、ルートテーブルの関係について、スクショを3枚添付しました。これでお答えになっているでしょうか。。

インターネットゲートウェイへのルートを設定したルートテーブルが、サブネットに関連付けられているかを確認してほしいです。

確認方法の一例です。

該当EC2インスタンスがあるサブネットをマネージメントコンソールで表示します。サブネットとルートテーブルが関連付けられていれば、インターネットゲートウェイへのルートが表示されるはずです。

イメージ説明

投稿2021/10/03 04:50

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

であれば、インターネットからアクセスできてないので、Reachability Analyzerを使ってみてはどうでしょうか。

インターネットゲートウェイからEC2の80ポートへのネットワーク到達性を検証するサンプルです。

イメージ説明

投稿2021/10/02 07:10

編集2021/10/02 07:11
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

query1000

2021/10/03 06:21

ありがとうございます。こちらも試したのですが、1時間ぐらいstill in progressという状態です。終わったらご報告させてもらいます。
jhashimoto

2021/10/03 06:23

1時間はおかしいですね。通常数分で分析は終わります。
query1000

2021/10/03 07:26

ありがとうございます。 リロードしたら終わっていました ^^; サービスからEC2を選び、 インスタンスから唯一のインスタンスi-xxxxを選びました。 VPC IDにはVPC ID vpc-xxxxが、 サブネット IDには subnet-xxxxが結び付けられていました。 ここで、vpc-xxxxをクリックし、 Reachable Analyserを選び、パスの作成と分析をクリックし、 送信元=インターネットゲートウェイ=igw-xxxx、送信先=インスタンス=i-xxxx、ポート80を選び、 パスの作成と分析をサイドクリックしました。 > 到達のステータス=(x)到達不可能 > (x)送信先は到達不能です。詳細については、以下の説明を参照してください。 > 次のセキュリティグループの ingress ルールはいずれも適用されません:sg-xxxx。 ここでsg-xxxxをクリックしてみると sg-xxxx - launch-wizard-1というセキュリティグループで、 インバウンドルールにSSH (Port=22)しかないものでした。 一つ上の階層のセキュリティグループを選ぶと、以下の3つのセキュリティグループがありました。 セキュリティグループID=sg-wwww、セキュリティグループ名=default セキュリティグループID=sg-xxxx、セキュリティグループ名=launch-wizard-1 セキュリティグループID=sg-yyyy、セキュリティグループ名=ec2-security-groupが この中の、 セキュリティグループID=sg-yyyy、セキュリティグループ名=ec2-security-groupは IPv4、IPv6についてSSH、HTTP、HTTPSがあって、合計6つのインバウンドグループがあります。 しかし、さっきテストに使われた セキュリティグループID=sg-xxxx、セキュリティグループ名=launch-wizard-1は、 さきほど申し上げた通りインバウンドルールにSSH (Port=22)しかありません。 ということで、 (1) VPC vpc-xxxxに、セキュリティグループ sg-xxxxではなくて sg-yyyy を使うようにするか、 (2) VPC vpc-xxxxが使っているセキュリティグループ sg-xxxxにもHTTPやHTTPSを追加すればいいんですよね。 (1)はやり方が分かりませんし、(2)はやっていいのかどうか分かりません。 図々しくてスミマセンが、ご教示くだされば幸いです。
query1000

2021/10/03 08:04

大変おせわになりました。 なんとなく出来ました。 VPCではなくインスタンスのセキュリティグループを追加しました。 サービスからEC2を選択 インスタンスから唯一のインスタンスi-xxxxを選択 セキュリティタブ=>セキュリティグループに、sg-xxxx、launch-wizard-1しか入っていなかった、 アクション=>セキュリティ=>セキュリティグループの選択を変更 関連付けられたセキュリティグループに、sg-yyyy、ec2-security-groupを セキュリティタブ=>セキュリティグループのインバウンドルールが増えた https://www,example.comにアクセス、nginxのサンプルページが見えた curl www,example.comも正常に動作した これでセキュリティ的にOKでしょうか?
jhashimoto

2021/10/03 08:48 編集

ec2-security-groupに許可したいインバウンドルールを設定していたが、EC2インスタンスにec2-security-groupがアタッチされていなかった。以上が原因と理解しました。 セキュリティ的にOKかどうかは、要件によるのでこちらでは判断できませんが、一般的にはセキュリティグループでは必要最低限の通信を許可し、不要な通信は受け付けないようにします。
query1000

2021/10/03 10:02

ありがとうございます。 現状では、サーバーは、SSHもHTTPもHTTPSも許している状況ですね。 私が現状わからないことは、複数あるセキュリティグループの使い分け方です。 自分が使うときはSSH、HTTP、HTTPSを許すが、任意の他人が使うときはHTTP、HTTPSだけにするとかしたいのですが、その場合はIPアドレスの範囲を使うしかないんでしょうかね。 *セキュリティグループAは自分用で、IPアドレスの範囲を自分が持っているグローバルIPアドレスのみとして、SSHを許す *セキュリティグループBはお客さん用で、0.0.0.0/0からのアクセスを許し、HTTPおよびHTTPSを許す 家でも会社でも仕事するし、何なら空港やスタバなどでも緊急作業したいかもしれないとすると、IPアドレスでの制限は難しいですね。 (SSHは秘密鍵で管理してるからいいのかな。。 まだSSLを理解していないんですが、将来有効にしたら、HTTPを削除してHTTPSだけにするとかしようと思ってます。 ありがとうございます。
query1000

2021/10/03 10:06

それにしても、大変お世話になりました。 Reachability Analyzerが決め手でした。 ありがとうございます。
jhashimoto

2021/10/03 11:01

> *セキュリティグループAは自分用で、IPアドレスの範囲を自分が持っているグローバルIPアドレスのみとして、SSHを許す > *セキュリティグループBはお客さん用で、0.0.0.0/0からのアクセスを許し、HTTPおよびHTTPSを許す 1つのセキュリティグループには複数のルールを設定できますから、必ずしもA,B2つ作る必要はありません。 > (セキュリティグループ名) IPv4 SSH TCP 22 0.0.0.0/0 ↑0.0.0.0/0をご自身のグローバルIPアドレスに変える > (セキュリティグループ名) IPv4 HTTP TCP 80 0.0.0.0/0 > (セキュリティグループ名) IPv4 HTTPS TCP 443 0.0.0.0/0
query1000

2021/10/03 11:12

なるほど。ありがとうございます!しかし、そうなると、ますますセキュリティグループが複数ある理由がわからなくなります。すばやく切り替えるためとかでしょうか?
jhashimoto

2021/10/03 11:19 編集

EC2インスタンスが複数ある場合、通常それぞれで通信の要件は違います。 インスタンスAにセキュリティグループAを、インスタンスBにセキュリティグループBをアタッチすれば、それぞれの通信要件に沿って、ルールを設定できます。 また、EC2以外にもセキュリティグループを利用するAWSのサービスはたくさんあります。例えば、RDSを導入する場合は、RDS用のセキュリティグループが必要になります。
query1000

2021/10/03 11:50

なるほど、逆に言うと、インスタンス1つ、EC2だけの運用であれば、セキュリティグループは1つでもかまわないということですね。ありがとうございます。
guest

0

lang

1$ curl www.example.com # 自分のホスト名

インターネット経由でのアクセスが目的と理解してますが、パブリック IPv4 DNSでもアクセスできないのでしょうか?ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.comのようなホスト名です。

投稿2021/10/02 06:32

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

query1000

2021/10/02 06:41

ありがとうございます。 ```$ curl ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com``` のようにすると、 ```$ curl localhost``` 同様、ちゃんとHTMLが返ってきました! ただし、そのホスト名をブラウザーで開くと「ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.comからの応答時間が長すぎます」と言われます。 また、その下に書いている ``` Elastic IP addresses xxx.xxx.xxx.xxx [Public IP] ``` では、curlもブラウザーアクセスもタイムアウトになります。
jhashimoto

2021/10/02 06:54 編集

1: $ curl ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com→レスポンスOK 2: > そのホスト名をブラウザーで開くと「ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.comからの応答時間が長すぎます」と言われます。 1,2ともに同一PCから実行していると想定しています。であればPCからAWSへのアクセスはできているので、ブラウザの問題が疑われます。他のブラウザでアクセスするとどうなりますか?
query1000

2021/10/02 06:59 編集

ありがとうございます。 Chromeでできなかったので、Operaで試しましたが、ダメでした。
query1000

2021/10/02 07:00

補足です。curlコマンドは、EC2にSSHログインして行っていますので、同じPCではなくEC2内でのアクセスになっています。紛らわしくすみません。
jhashimoto

2021/10/02 07:06

了解しました。であれば、インターネットからアクセスできてないので、Reachability Analyzerを使ってみてはどうでしょうか。コメントだと画像貼れないので、回答の方に書きます。
guest

0

デフォルトのVPCを使用していますが、インターネットゲートウェイはすでに作られていて、アタッチされていました。

ルートテーブルにインターネットゲートウェイへのルートは、設定されていますか?

投稿2021/10/02 06:07

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

query1000

2021/10/02 06:16

ありがとうございます。私が設定したのではないのですが、すでに設定されていたようです。回答に画像を添付します。
jhashimoto

2021/10/02 06:24

ルートテーブルは、該当インスタンスのあるサブネットにアタッチされていますか?
query1000

2021/10/03 04:08

ありがとうございます。私が設定されたのではないのですが、VPC、サブネット、ルートテーブルの関係について、スクショを3枚添付しました。これでお答えになっているでしょうか。。
jhashimoto

2021/10/03 04:51

画像貼れないので、回答の方に書きました。
guest

0

自己解決

解決しました。
整理します。

問題:

  • AWSでEC2サーバーを立て、nginxをインストールした
  • インスタンスにIPアドレス0.0.0.0/0(任意の他人)からのHTTPアクセスを活かすセキュリティグループXを作った
  • EC2にSSHログインした状態で$ curl localhostと打つとnginxのサンプルページのHTMLが出てくる
  • しかし同じ状態で$ curl <EC2のグローバルIPアドレス>と打ってもタイムアウトする

原因と解決:

  • インスタンスにセキュリティグループXがアタッチされていなかった
  • デフォルトのセキュリティグループはアタッチされていて、それはSSHを通すので、SSHログインは出来た
  • デフォルトのセキュリティグループに加えて、セキュリティグループXをアタッチした。
  • $ curl <EC2のグローバルIPアドレス>と打つとnginxのサンプルページのHTMLが出てくるようになった
  • http://<EC2のグローバルIPアドレス>にブラウザーでアクセスするとnginxのサンプルページが表示された

jhashimoto様、皆様、ありがとうございました!!!

投稿2021/10/03 10:15

query1000

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問