LoginSignup
0
0

More than 3 years have passed since last update.

EC2上でRailsアプリをnginx + pumaで動作させる

Posted at

表題の通り、RailsアプリをEC2にデプロイするところまで何とか漕ぎつけたようなのでメモも兼ねて
書いてみた。といっても、参考にしたサイトを載せていくだけになりそう。はじめはこの記事を参考に
Railsチュートリアルのhello_appが動作することを確認後、自分のアプリを配置するという流れでやった。
一気にやろうとすると大変だからね、それでも四苦八苦したけど。

VPC ~ EC2インスタンス作成

Udemyの動画で予習後、上記Qiitaの記事と併用しながら作っていく。AWSを初めて勉強するにあたって
書籍よりまずは動画を見て大まかな内容を知りたいという方は、無料の教材もあったりするので試しに
観てみるのもいいかも。

  • VPC作成
  • サブネット: publicとprivateの作成、privateは今回使わなかったけど後々RDSに切り分けたい……
  • インターネットゲートウェイの作成
  • ルートテーブルの作成: publicのルートテーブルを作成(サブネットの関連付けとIGWとの紐づけを行う)
  • EC2インスタンスの作成: AMIはLinux2、インスタンスタイプやストレージは全て無料枠
  • セキュリティグループ: 上記インスタンス作成時に併せて出来たセキュリティグループにインバウンドルール(HTTP:任意の場所)を設定
  • ターミナルからssh -i <pemキーファイル名> ec2-user@<ElasticIPもしくは自動割り当てIP>でEC2へログイン
  • sudo yum update -yが完了すれば、最初のQiita記事のここくらいまでは進んだことになる。

EC2環境構築

作業を進めるとNode.jsのインストール時にepelが無いゾと言われ、何だろうと調べてたらこの記事がヒットした。
(多分AMIをLinuxではなくLinux2にしたのが原因?) コマンドだけで言うと
sudo amazon-linux-extras install epelの後に再度sudo yum install nodejs npm --enablerepo=epelを実行

そこからはgit cloneできるようになるまで順調に進んでいく。その次のwebサーバーやアプリケーションサーバー辺りから
人によってやることが変わってくると思う。自分は「nginx」 + 「puma」 + 「postgresql」で構築するので

・nginx

etc/nginx/conf.dにて
このサイトこの記事を参考にconfファイルを作成、現状こんな仕上がり。

/etc/nginx/conf.d/proto-status.conf
upstream puma {
    server unix:///var/www/rails/proto-status/tmp/sockets/puma.sock;
}

server {
    client_max_body_size 20M;
    listen       80;
    server_name  54.187.69.116;
    root /var/www/rails/proto-status/public;

    location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
    }

    location / {
        proxy_pass http://puma;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        proxy_connect_timeout 30;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/rails/proto-status/public;
    }
}

・puma

git cloneしたrailsアプリのディレクトリにてgem install bundlerでバンドラーを取得し、bundle install
自分はここでThe "libcurl" package isn't available.というエラーメッセージが出たのでこの記事
参考に、sudo yum -y install libcurl libcurl-develを行い、再度bundle install

DBにsqliteとpostgresの環境が必要だったので
sudo yum install sqlite-devel
sudo yum install postgresql-server postgresql-devel postgresql-contrib
をそれぞれ実行。

touch tmp/sockets/puma.sockの実行とconfig/puma.rbに以下を追記

# 最初の二行だけでも一応、動作する
app_dir = File.expand_path("../..", __FILE__)
bind "unix://#{app_dir}/tmp/sockets/puma.sock"

pidfile "#{app_dir}/tmp/pids/puma.pid"
state_path "#{app_dir}/tmp/pids/puma.state"
stdout_redirect "#{app_dir}/log/puma.stdout.log", "#{app_dir}/log/puma.stderr.log", true

プリコンパイルされていないのでrake assets:precompile RAILS_ENV=productionを実行

railsコマンドが使えなかったので、このサイトのようにbundle exec pumaとしても
よかったがgem update --systemでとりあえず解決


・postgresql

このサイトを参考に設定していく。万が一、サイトがなくなったら困るので簡単に箇条書き

  1. sudo service postgresql initdbで初期化
  2. sudo service postgresql startで起動(restartにすれば再起動)
  3. service postgresql statusで状態確認
# EC2インスタンス起動に合わせて、PostgreSQLも起動するよう設定
$ sudo chkconfig postgresql on 

# 設定確認
$ systemctl list-unit-files -t service | grep postgres
postgresql.service                            enabled

エンコードの変更
sudo -u postgres psqlでpostgresqlにログイン
\lコマンドを打つとEncodingの欄がSQL_ASCIIになっているのでUTF-8に対応するよう設定

postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
# DROP DATABASE template1;
# CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF-8' LC_CTYPE = 'ja_JP.UTF-8';
# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

認証関連(参考サイト
postgresのユーザーやパスワードの設定が間違っていないのに、rake db:create RAILS_ENV=production
などで認証エラーが出るときは/var/lib/pgsql/data/pg_hba.confのpeerをmd5に変える必要がある。

/var/lib/pgsql/data/pg_hba.conf
# TYPE  DATABASE  USER  ADDRESS   METHOD
#local   all       all             peer

その他

これは結構役に立つんじゃないかなと思う。
【rails】本番環境でもエラー文を表示させる


最後に今までの参考サイト一覧を載せようかなと思ったけど、逆に見辛そうだったからやめました。
AWS関連をもう少しいじったら、次はDocker、そしてCircleCIか。先は長いなー:sweat_smile:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0