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

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

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

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Amazon EC2

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2787閲覧

EC2インスタンスに接続できない

moonlight4_6_17

総合スコア12

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Amazon EC2

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/05/10 06:01

編集2021/05/10 08:46

やりたいこと

railsで作ったアプリを unicorn + nginx + mysql でAWSにデプロイしたい

起きている問題

telnetコマンドで80ポートに接続できない

telnetコマンドで80ポートに接続できたものの、EC2インスタンス上でcurlコマンドを使ってlocalhost/静的なページに接続しても
「ページが見つからない」となってしまう。(詳細ログは下記)

原因を探った流れ

EC2インスタンスのパブリックIPをコピペして開こうとしても開けず、以下の手順で原因を探った。

nslookupで名前解決できているか→ 出来てる
pingコマンドが通るか→ 通る
telnetコマンドで80ポートに接続できるか

tanaberyouni@tanaberyouninoMacBook-Air ~ % telnet 35.72.xxx.x(IPアドレス) 80 Trying 35.72.xxx.x... telnet: connect to address 35.72.xxx.x: Connection refused telnet: Unable to connect to remote host

となり、ファイアウォールの問題?と、思いセキュリティグループを確認しましたが、原因を見つけられず。。

nginxの再起動で接続できた。

tanaberyouni@tanaberyouninoMacBook-Air ~ % telnet 35.72.xxx.x 80 Trying 35.72.xxx.x... Connected to ec2-35-72-xxx-x.ap-northeast-1.compute.amazonaws.com. Escape character is '^]'. ^CConnection closed by foreign host.

EC2インスタンス上からcurlコマンドでlocalhostに接続

[ryoji@ip-10-0-0-225 tempo]$ curl http://localhost/ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Welcome to Amazon Linux 2</title> <style rel="stylesheet" type="text/css"> html { background-color: white; font-family: "DejaVu Sans", "Liberation Sans", sans-serif; margin: 10% 20%; } body { margin:0; padding:0; background: white; } a { color: #007eb9; } </style> </head> <body> <p>Thank you for using <a href="https://aws.amazon.com/amazon-linux-2/">Amazon Linux 2</a>.<p> <p>Now that you have it installed, find announcements and discussion in <a href="https://forums.aws.amazon.com/forum.jspa?forumID=228">the AWS Discussion Forums</a>. Also try <a href="https://aws.amazon.com/documentation/">AWS documentation</a>.</p> </body> </html>

同様に localhost/静的なページ に接続

[ryoji@ip-10-0-0-225 tempo]$ curl http://localhost/owners/new <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>The page is not found</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style type="text/css"> /*<![CDATA[*/ body { background-color: #fff; color: #000; font-size: 0.9em; font-family: sans-serif,helvetica; margin: 0; padding: 0; } :link { color: #c00; } :visited { color: #c00; } a:hover { color: #f50; } h1 { text-align: center; margin: 0; padding: 0.6em 2em 0.4em; background-color: #294172; color: #fff; font-weight: normal; font-size: 1.75em; border-bottom: 2px solid #000; } h1 strong { font-weight: bold; font-size: 1.5em; } h2 { text-align: center; background-color: #3C6EB4; font-size: 1.1em; font-weight: bold; color: #fff; margin: 0; padding: 0.5em; border-bottom: 2px solid #294172; } h3 { text-align: center; background-color: #ff0000; padding: 0.5em; color: #fff; } hr { display: none; } .content { padding: 1em 5em; } .alert { border: 2px solid #000; } img { border: 2px solid #fff; padding: 2px; margin: 2px; } a:hover img { border: 2px solid #294172; } .logos { margin: 1em; text-align: center; } /*]]>*/ </style> </head> <body> <h1><strong>nginx error!</strong></h1> <div class="content"> <h3>The page you are looking for is not found.</h3> <div class="alert"> <h2>Website Administrator</h2> <div class="content"> <p>Something has triggered missing webpage on your website. This is the default 404 error page for <strong>nginx</strong> that is distributed with Fedora. It is located <tt>/usr/share/nginx/html/404.html</tt></p> <p>You should customize this error page for your own site or edit the <tt>error_page</tt> directive in the <strong>nginx</strong> configuration file <tt>/etc/nginx/nginx.conf</tt>.</p> </div> </div> <div class="logos"> <a href="http://nginx.net/"><img src="/nginx-logo.png" alt="[ Powered by nginx ]" width="121" height="32" /></a> <a href="http://fedoraproject.org/"><img src="/poweredby.png" alt="[ Powered by Fedora ]" width="88" height="31" /></a> </div> </div> </body> </html>

となり、nginxエラー?

nginxのアクセスログをいったん見にいく

nginx/access.log

1127.0.0.1 - - [10/May/2021:08:27:24 +0000] "GET / HTTP/1.1" 200 732 "-" "curl/7.61.1" "-" 2127.0.0.1 - - [10/May/2021:08:27:44 +0000] "GET /owners/new HTTP/1.1" 404 3650 "-" "curl/7.61.1" "-"

nginxの設定

# log directory error_log /var/www/rails/tempo/log/nginx.error.log; access_log /var/www/rails/tempo/log/nginx.access.log; # max body size client_max_body_size 2G; upstream app_server { # for UNIX domain socket setups server unix:/var/www/rails/tempo/tmp/sockets/.unicorn.sock fail_timeout=0; } server { listen 80; server_name 35.72.137.3; # nginx so increasing this is generally safe... keepalive_timeout 5; # path for static files root /var/www/rails/tempo/public; # page cache loading try_files $uri/index.html $uri.html $uri @app; location @app { # HTTP headers proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } # Rails error pages error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/rails/tempo/public; } }

EC2インスタンスのセキュリティグループ

インバウンド
ポート範囲 プロトコル ソース セキュリティグループ
80 TCP 0.0.0.0/0 tempo_SecurityGroup
22 TCP 0.0.0.0/0 tempo_SecurityGroup
443 TCP 0.0.0.0/0 tempo_SecurityGroup
-1 ICMP 0.0.0.0/0 tempo_SecurityGroup

アウトバウンド
ポート範囲 プロトコル 送信先 セキュリティグループ
80 TCP 0.0.0.0/0 tempo_SecurityGroup
22 TCP 0.0.0.0/0 tempo_SecurityGroup
443 TCP 0.0.0.0/0 tempo_SecurityGroup
-1 ICMP 0.0.0.0/0 tempo_SecurityGroup

サブネットのACL

初期状態からいじった記憶はないのですが

インバウンド
ルール番号 タイプ プロトコル ポート範囲 送信元 許可/拒否
100 すべてのトラフィック すべて すべて 0.0.0.0/0 Allow

アウトバウンド
ルール番号 タイプ プロトコル ポート範囲 送信先 許可/拒否
100 すべてのトラフィック すべて すべて 0.0.0.0/0 Allow

unicornの確認

[ryoji@ip-10-0-0-225 ~]$ ps -ef | grep unicorn | grep -v grep ryoji 2562 1 19 02:53 ? 00:00:01 unicorn_rails master -c /var/www/rails/tempo/config/unicorn.conf.rb -D -E production ryoji 2569 2562 0 02:53 ? 00:00:00 unicorn_rails worker[0] -c /var/www/rails/tempo/config/unicorn.conf.rb -D -E production ryoji 2571 2562 0 02:53 ? 00:00:00 unicorn_rails worker[1] -c /var/www/rails/tempo/config/unicorn.

nginxの確認

[ryoji@ip-10-0-0-225 ~]$ ps ax | grep nginx 2526 ? Ss 0:00 nginx: master process /usr/sbin/nginx 3347 ? S 0:00 nginx: worker process 3348 ? S 0:00 nginx: worker process 3369 pts/0 S+ 0:00 grep --color=auto nginx

何が原因なのかよく分かりません。
お分かりになる方いらっしゃいましたら、ご教授ください。

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

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

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

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

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

tanat

2021/05/10 06:12

> telnetコマンドで80ポートに接続できるか →できない で実行した実際のコマンドと結果の追記をお願いします
moonlight4_6_17

2021/05/10 06:16

tanatさん コメントありがとうございます! tanaberyouni@tanaberyouninoMacBook-Air ~ % telnet 35.72.xxx.x(IPアドレス) 80 Trying 35.72.xxx.x... telnet: connect to address 35.72.xxx.x: Connection refused telnet: Unable to connect to remote host となります。。
tanat

2021/05/10 06:27

ご確認ありがとうございます。(質問は編集出来るので、質問に追記をお願いします。)
TaichiYanagiya

2021/05/10 06:34

EC2 インスタンスの OS はなんですか? OS 側でファイアーウォールが効いていませんでしょうか? あと、セキュリティグループのアウトバウンドはデフォルト全許可ですが、80, 22, 443 を設定しているのは何か意図があるのでしょうか?
yu_1985

2021/05/10 06:38

80番ポートの接続確認にtelnetを使う必要もあまりないと思うのでcurlあたりを使ったほうがよいのではないでしょうか。 また、そこの接続に問題があるということはnginxの設定周りでは?
moonlight4_6_17

2021/05/10 08:47

tanatさん すいません???? 質問の追記いたしました!
moonlight4_6_17

2021/05/10 08:49

TaichiYanagiyaさん コメントありがとうございます! OSはLinux 2です。 OS側のファイアーウォール、というのは自分では設定してないのですが、確認方法を調べて確認してみます! アウトバウンドについては作成当時、知識不足でデフォルトが全許可と知らなかったために、指定したものです。。今回のエラーとは特別関連ないかと、いったんそのままにしてしまっていました。。
yu_1985

2021/05/10 08:52

server_name 35.72.137.3; なのでlocalhostでアクセスしたら server_name 35.72.137.3;として設定した内容は適用されませんね。
moonlight4_6_17

2021/05/10 08:53

yu_1985さん コメントありがとうございます! なるほど! ネットワークエラーを調べること自体初めてなもので???? EC2インスタす上でcurl使って探ってみたところ、ページがちゃんと表示されなかったので、やはりnginxに原因があるのかなぁ、、と思います。 nginxの設定が正しいのか調べながら探ってみようと思います。
yu_1985

2021/05/10 09:04

まず、ServerNameの設定がどのように影響するのかを調べてみてください。 https://tengine.taobao.org/nginx_docs/ja/docs/http/request_processing.html server_name 35.72.137.3;で設定している以上、そのブロックの設定は35.72.137.3でアクセスしないと適用されません。 つまり、localhostを対象にリクエストを送った場合はunicornにリクエストを転送する設定が適用されないので404になるでしょう。 なのでインターネット経由での通信になることを承知で35.72.137.3でアクセスする(もしかしたら内部的にはインターネットに出ないで通信してるかもしれませんけど)か、server_nameの設定を追加・変更する、もしくは削除して全てのホストに対してその記載の設定を適用するかしてから確認してください。
guest

回答2

0

ベストアンサー

telnetで外部からのTCPポートのListenを確認、もしくは手動でHTTPリクエストを送信しようとしているという前提で回答します。

ざっと見る限り、確認が足りておらず、問題の切り分けが出来ていない様に思います。
以下の点を確認してみて下さい。

ポートがLitenされているか確認

  • EC2上でnetstat等で80番ポートがListenされているか確認する

Listenされていなければ、nginxの設定や起動状態に問題があるので確認する

ローカル内(EC2内)で接続が可能か確認

  • EC2上でcurl http://localhost/適当な静的ファイル等でnginxが正しく動いている確認する
  • EC2上でcurl http://localhost/でunicornからレスポンスが返ってくる確認する

これらが成功しないようであれば、EC2の設定の問題なので、まずはローカル(EC2)からの接続が出来るように各設定を見直す

リモートからパケットが届いているか確認

  • EC2上でtcpdump等でパケットをキャプチャした状態で外部からアクセスして、パケットが到達し、レスポンスを返そうとしているかを確認

パケットが到達していない場合はAWSのネットワーク関連の設定の問題である可能性が高いので、セキュリティグループやN-ACLの設定が正しいか確認して見直す

リモートからのパケットがnginxにたどり着いているかの確認

  • EC2上でnginxのログを確認し、処理が開始されているかの確認

OSまでパケットがたどり着いているのにnginxのログに残らない様であれば、nginxのポートやvirtualhostの設定の問題である可能性が高い
firewalld等で遮断している可能性もあるので、その辺りも確認する

nginxでフォワードされたパケットがunicornにたどり着いているかの確認

  • EC2上でunicornのログを確認し、処理が開始されているか確認

nginxまで届いているがnicornまで届いて無いようであれば、nginxの設定の問題か、unicornのListenポートの問題である可能性が高い

投稿2021/05/10 06:51

tanat

総合スコア18727

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

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

moonlight4_6_17

2021/05/10 08:57

tanatさん ご丁寧にありがとうございます! nginxを再起動したところtelnetで80ポートへの接続はできました! ただ、curlコマンドで静的ページへ接続しようとしたところ、nginxエラーで「ページが見つかりません」となってしまいました。 nginxなどの設定ミス、、、?でしょうか。 とりあえずnginx周りから探ってみようと思います!
tanat

2021/05/10 09:20

> nginxなどの設定ミス、、、?でしょうか。 nginxが404を返しているのであれば、何らかの設定ミスだと思います。 全てのパスへのリクエストをunicornに転送していて、unicornの管理するところに静的ファイルを置かないといけないとか?は有りがちだと思います。 それはそれで最終的な形としては正しい場合も多いのですが、まずはunicornとの接続は行わずに、nginx単体で動作確認をする方が切り分けは楽なのかなとも思います。
moonlight4_6_17

2021/05/15 07:53

tanatさん エンジニアの方に一緒に見てもらい、 nginx単体で動作確認→nginxの設定のsocketの場所を修正→nginxまでは疎通したことが分かりました。 まだ、デプロイはできていないので、アプリの問題なのかunicornの設定ミス、またはunicornと連携ができていないかを探っていこうと思います。 ご丁寧なアドバイスありがとうございました!
guest

0

下記、telnetコマンドってだけでシェルログインしようとしての話かと勘違いしての回答ですので、
一旦取り消します。

telnetコマンドで80ポートに接続できるか →できない

公開鍵を使ったSSH接続じゃないと接続できないのでは?
それとも、設定変更して、素のtelnetだけで接続できるようにしてあるのですか?

投稿2021/05/10 06:05

編集2021/05/10 06:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moonlight4_6_17

2021/05/10 06:19

m6uさん コメントありがとうございます! 自分の知識不足ですいません!セキュリティグループで HTTP に対してアクセス許可していれば telnet で80番ポートに対しては接続できると思っていたのですが、違うんでしょうか、、???? 特別設定変更などはしておりません。
yu_1985

2021/05/10 06:25

80番ポートでSSHは関係ないのではないでしょうか…。
退会済みユーザー

退会済みユーザー

2021/05/10 06:27

あぁ、telnetって言葉だけで反応しちゃった感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問