3. pumaで起動してipアドレス指定でhttp通信ができるようにする

## ゴール
http://{IPアドレス}でrailsの画面が表示できるようにする

## 関連する記事
[1. webページをデプロイするために、EC2インスタンスを起動する](https://qiita.com/shimekake-hanaka/items/1062fffe33a966002feb)
[2. Ruby on Railsの環境構築をする](https://qiita.com/shimekake-hanaka/items/fd7e6839bd2db8e8c877)
[3. pumaで起動してipアドレス指定でhttp通信ができるようにする](https://qiita.com/shimekake-hanaka/items/e3715ef81d98bb3a2b4b)
[4. https://{サブドメイン}でrailsを表示できるようにする](https://qiita.com/shimekake-hanaka/items/bf34dc0b553784b48c19)

### pumaで起動する設定
#### puma.rbの編集
プロジェクトのソースの`config/puma.rb`を以下のように編集する。
※pidやログの出力場所が存在しなければ、手動で作成する。
```/var/www/project_app/project_name/config/puma.rb
# スレッド数の設定（環境に合わせて変更）
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

# ワーカー数（CPUコア数に応じて増やす）
workers ENV.fetch("WEB_CONCURRENCY") { 2 }

# バインド設定
bind "tcp://127.0.0.1:3000"

# pidfileの保存場所
pidfile "/var/www/project_app/shared/tmp/pids/puma.pid"
state_path "/var/www/project_app/shared/tmp/pids/puma.state"

# stdout / stderr のログ出力
stdout_redirect "/var/www/project_app/shared/log/puma.stdout.log", "/var/www/project_app/shared/log/puma.stderr.log", true

# fork する場合の設定（workerモード時）
preload_app!

# アプリのディレクトリ
directory "/var/www/project_app/project_name"

# Pumaを終了したら、ワーカーも終了する
on_worker_boot do
  # まずbundle install --without development testを実行
  system('cd /var/www/project_app/project_name && bundle install --without development test')

  # ActiveRecordの接続を確立
  ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end
```
#### puma.serviceの編集
`/etc/systemd/system/puma.service`に以下を追加する
※ずっとpumaの起動が`devlopment`になってしまっていたが、ExecStartのオプションンに`-e production`を追加したらできた！
※puma.serviceを変更したら`restart`の前に`sudo system deamon-reload`する。
```/etc/systemd/system/puma.service
[Unit]
Description=Puma Web Server
After=network.target

[Service]
Type=simple
User=ec2-user
WorkingDirectory=/var/www/ocha_app_dir/ocha_app
ExecStart=/home/ec2-user/.rbenv/shims/bundle exec puma -e production -C /var/www/project_app/project_name/config/puma.rb
Restart=always
Environment="{環境変数名}={値}"
# ↑ここに必要な環境変数を設定する。（今回はrender.comで設定していた変数をそのままコピペした）

[Install]
WantedBy=multi-user.target
```
### nginxの設定
#### conf.dの編集
rails_app.confを作成する
```
$ sudo nano /etc/nginx/conf.d/rails_app.conf
```
rails_app.confに以下を記述する
```/etc/nginx/conf.d/rails_app.conf
server {
    listen 80;
    server_name {パブリックIPアドレス};

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

### 環境変数の設定
前に使用していたサーバーで設定している環境変数をそのまま、`/etc/environment`に記述する。
```
# environmentの反映
$ source /etc/environment
# 反映されているか確認
$ echo $環境変数名
```
### エラーの対処

#### エラー①
application.css がアセットパイプライン（Sprockets）または app/assets/builds に存在しない
```
Sprockets::Rails::Helper::AssetNotFound (The asset "application.css" is not present in the asset pipeline.
```
対処法
```
# assets:precompile する
$ RAILS_ENV=production bundle exec rails assets:precompile
# pumaの再起動
$ bundle exec puma -C config/puma.rb
```

#### エラー②
productionのdatabase.yamlが間違っていた
※以前はlocalhostでdb接続していたが、今回は外部通信になるため、設定を以下に変更
```/var/www/project_app/project_name/config/database.yaml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
```

### 起動手順

#### pumaの起動
```
# pumaがすでに起動している場合、killしてから
$ pkill -f puma
$ bundle exec puma -C config/puma.rb
# ターミナル変えて
$ sudo systemctl restart puma
$ sudo systemctl status puma
```

#### nginxの起動
```
# nginxをインストール
$ sudo yum install nginx -y
# nginxの再起動
$ sudo systemctl restart nginx
$ sudo systemctl status nginx
```

#### pumaの起動確認
```
$ ps aux | grep puma
ec2-user  250294  0.1 14.4 960732 61820 pts/0    Sl+  08:29   0:02 puma 6.6.0 (tcp://0.0.0.0:3000) [ocha_app]
ec2-user  250313  0.2 27.6 1658856 118488 pts/0  Sl+  08:29   0:05 puma: cluster worker 0: 250294 [ocha_app]
ec2-user  250318  0.2 27.3 1648488 117140 pts/0  Sl+  08:29   0:05 puma: cluster worker 1: 250294 [ocha_app]
ec2-user  255792  0.0  0.3 222096  1452 pts/1    S+   09:09   0:00 grep --color=auto puma
```