先日Railsアプリをsslで通信したいと考えRailsでconfig.force_sslを設定してからなぜかアプリが表示されなくなったため、その時の対処法をまとめました。
アプリの状態
| アプリ名 | my-app | 
|---|---|
| server | EC2 | 
| web server | nginx | 
| application server | unicorn | 
| 解放ポート | 80, 443, 22 | 
まずはセキュリティグループを確認
いつものことかと思い
AWS→セキュリティグループ→対象のパブリックなセキュリティグループを確認
しかし特に異常は見つからず80番と443番はしっかり開いてました。
普通なら通信はできるはずなのですが…
ちなみにlocal環境からEC2インスタンスへssh通信はできているようです。
nginxが80ポートにlistenしているかを確認
続いてnginxの設定ファイルを確認し80ポートにlistenされているか。
$ssh USER@MY-ELASTIC-IP
$ cat /etc/nginx/conf.d/my-app.conf
upstream unicorn {
          server unix:/var/www/my-app/shared/tmp/sockets/unicorn.sock;
}
server {
  listen 80; <-----------
  server_name ELASTIC-IP;
  root /var/www/my-app/current/public;
  access_log /var/log/nginx/nginx_access.log;
  error_log  /var/log/nginx/nginx_error.log;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
ポート指定も問題ないようです。
コンソールからポートが開いているかチェック
$ netstat -tln
# 接続しているものでlisten済みのものを表示
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::3306                 :::*                    LISTEN
tcp6       0      0 :::111                  :::*                    LISTEN
確認してみると確かに接続を許していないようです。なぜ22ポートだけが開いているのかわかりません。
試しにこの状態でセキュリティグループをいじくっても結果は変わらず…
セキュリティグループの他にもネットワークインターフェースやネットワークACL、インターネットゲートウェイ、ルートテーブルなども確認してみたのですが結果は変わりませんでした、
結論 ngixnの不調でした
結局nginxを調べてみることに。
すると…
$ sudo nginx -s reload
----------------------------------------------------------------------
nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)
capistranoでデプロイした際は特に問題なくunicornは起動していたので見落としてしまっていましたがここに原因があったようです。
nginxpidファイルが消失してしまっていたため作り直します。
ngixn 再起動
$ sudo service nginx stop
$ sudo touch /run/nginx.pid     
$ nginx -t
$ sudo service ngixn start  
再び確認
$ sudo service ngix status
----------------------------------------------------------------------
Redirecting to /bin/systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-10-30 06:05:36 UTC; 3h 28min ago
  Process: 22103 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 22100 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 22099 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 22106 (nginx)
   CGroup: /system.slice/nginx.service
           ├─22106 nginx: master process /usr/sbin/nginx
           └─22111 nginx: worker process
Oct 30 06:05:36 ip-10-0-0-178.us-east-2.compute.internal systemd[1]: Starting The nginx HTTP and reverse proxy server...
Oct 30 06:05:36 *p-10-0-0-178.us-east-2.compute.internal nginx[22100]: nginx: the configuration file /etc/nginx/ngi...ok
Oct 30 06:05:36 ip-10-0-0-178.us-east-2.compute.internal nginx[22100]: nginx: configuration file /etc/nginx/nginx.c...ul
Oct 30 06:05:36 ip-10-0-0-178.us-east-2.compute.internal systemd[1]: Failed to read PID from file /run/nginx.pid: ...ent
Oct 30 06:05:36 ip-10-0-0-178.us-east-2.compute.internal systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.
その後
$ netstat -tlnt
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::3306                 :::*                    LISTEN
tcp6       0      0 :::111                  :::*                    LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
解決しました!
nginxが上手く機能していないとすると80ポートが閉じてしまうのは知らなかったですね…
原因はおそらくインスタンスの再起動
rails で config.force_ssl = trueを使用
↓
sslに必要な設定を行っていなかったため表示エラー
↓
その際EC2インスタンスを再起動したため上手くnginxが機能していなかったのだと思います。
config.force_sslエラーについてはこちらの記事にまとめました。
>>【config.force_ssl】を使用したらページが表示されなくなった
次回同じようなエラーに遭遇したらまずはnginxからポートが開いているかを確認してからawsコンソールを弄ろうと思います。

