30歳未経験からエンジニアに転職ブログ

30歳未経験からウェブエンジニアへの転職を目指して個人アプリ作成中です。

自動デプロイしてもアプリが表示されない問題の解決

今回直面した問題

Capistranoで自動デプロイして、一応最後まで通ったが、ブラウザにアプリが表示されない 「We're sorry, but something went wrong.」 と表示されてしまう。

仮説(問題の原因の推測)

unicornのプロセスが2つあるのが問題? masterが2つ出てるのはまずい? これはどういう現象?

naota    20613  0.0  2.0 184500 20552 ?        Sl   04:31   0:00 unicorn master (old) -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20616  6.9 11.1 478752 111876 ?       Sl   04:31   0:01 unicorn worker[0] -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20641  1.4  1.9 182480 19936 ?        Sl   04:31   0:00 unicorn master -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20656  7.3 11.0 478472 110800 ?       Sl   04:31   0:01 unicorn worker[0] -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20713  0.0  0.0 119432   928 pts/3    S+   04:31   0:00 grep --color=auto unicorn

試したこと

これらをしてからEC2を再起動

結果

結果的にはunicornのプロセスは1つになったが、どれが影響してそうなったのかわからない。 おそらくEC2の再起動だったと思うのだが、どの変更が再起動によって反映されたのかはわからないままだ。 ただ、ここまでの操作だけではアプリが表示されないままだった。

本当のエラー原因はNginxの設定ミスにあった

log/nginx.error.logを見てみると以下のようなエラー文が出ていた。

2020/10/11 19:53:14 [error] 17522#0: *48 open() "/usr/share/nginx/html/goform/webLogin" failed (2: No such file or directory), client: 213.202.223.223, server: _, request: "POST /goform/webLogin HTTP/1.1", host: "176.34.34.208:80", referrer: "http://176.34.34.208:80/login_inter.asp"

/etc/nginx/conf.d/pfc-master.confの設定にミスがあった。

upstream app_server {
  # sharedの中を参照するよう変更(/shared/tmp/sockets/unicorn.sock;)
  server unix:/var/www/rails/pfc-master/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name pfcmaster.work;

  # currentの中を参照するよう変更(/current/public;)
  root /var/www/rails/pfc-master/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    # currentの中を参照するよう変更(/current/public;)
    root /var/www/rails/pfc-master/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

#location @app { →1つ上にある@unicornと一致してないからダメだった
  location @unicorn {
    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;
  }

  error_page 500 502 503 504 /500.html;

}

これでElasticIPでは表示できるようになった。 あとはドメイン名で表示できるようにする。

ドメイン名で表示できるようにする設定

config/deploy/production.rb /etc/nginx/conf.d/pfc-master.conf

これら2つのサーバー名の部分をElastic IPからドメイン名に変更して、これでドメイン名でアプリを表示できるようになった。

2つの疑問が残る

✅手動でのデプロイと自動デプロイはどこを変更したのか?→これはあとでQiita記事書きたい。

unicornのoldプロセスが残ってしまう問題はどうして解決できたのか? 下の3つのどれかが原因と思ったが、どれでもなかった。 config/unicorn/production.rb config/unicorn.rb lib/capistrano/tasks/unicorn.rb

ec2を再起動したから?