Rubyアプリを本番環境で安定して運用するためには、ApacheなどのWebサーバーと連携させる仕組みが必要です。
その役割を果たすのがアプリケーションサーバーです。
本記事では、ApacheとPumaを使ってRubyアプリケーションの本番環境を構築する方法を解説します。
Pumaはアプリケーションサーバーとして独立して動作し、Apacheとリバースプロキシで連携することで、構成の柔軟性や運用の安定性を高めることができます。
また、記事の後半では、Redmineを使った動作確認も行いますので、構築した環境のテストまでを一通り体験することができます。
前提条件
本記事では、以下の環境が構築済みであることを前提としています。
- Apacheがインストール済みで、HTTPでアクセス可能な状態であること
- Ruby環境(rbenv+ruby-buildなど)を構築済みであること
- RedmineがPumaで起動できること
Apacheのインストールがまだの方は、以下の記事も参考にしてください。
Ruby環境の構築がまだの方は、以下の記事も参考にしてください。
また、動作確認用にRedmineを使う場合は、以下の記事を参考にしてください。
Pumaをインストールしてアプリを起動できるようにする
PumaはRailsのアプリケーションサーバーとして定番の1つです。Redmineのようなアプリでも動作しますし、他のRailsアプリでも同様に使えます。ここではPumaをGemに追加し、インストールからアプリの起動までを行います。
手順
念のためにRuby環境の確認
まずは、Ruby環境が正しく有効になっていることを確認します。
which ruby
ruby -v
両方の出力が ~/.rbenv/versions/...
配下になっていればOKです。
念のため、bundler
コマンドも確認しておきましょう。
bundle -v
もしbundle
が見つからない場合は、以下でインストールできます。その後に再びbundle -v
で確認してください。
gem install bundler
Pumaをインストール
まずはGemfile
にPumaを追記します。
gem 'puma'
bundle install
を実行しましょう。
bundle install
Pumaの起動確認
以下のコマンドで起動テストしてみましょう。
bundle exec puma -e production -b tcp://0.0.0.0:3000
ブラウザで http://サーバーのIP:3000
にアクセスできればOKです。
もし、アクセスできない場合は、以下の確認をしてみてください。
- ファイアウォール設定
ufw
などでポート3000が開いているか?sudo ufw allow 3000/tcp
- ネットワークインタフェース
0.0.0.0:3000
が本当にListen状態になっているか? →ss -tuln | grep 3000
- サーバー機側でcurl試行
Pumaは動いているか?curl http://127.0.0.1:3000
Pumaをsystemdサービスとして常駐させる
Redmineを本番運用するためには、手動で起動するのではなく、OS起動時に自動で起動する構成が必要です。
ここでは、Pumaをsystemdのサービスとして登録し、常駐化します。
Pumaをsystemdでサービス化
OS起動時にPumaが自動起動するための設定をます。
sudo nano /etc/systemd/system/puma.service
以下を記述します。
[Unit]
Description=Puma HTTP Server for Redmine
After=network.target
[Service]
Type=simple
User=LoginUser
WorkingDirectory=/var/www/redmine
Environment=RAILS_ENV=production
Environment=PATH=/home/LoginUser/.rbenv/shims:/home/LoginUser/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
ExecStart=/home/adminsub/.rbenv/bin/rbenv exec bundle exec puma -e production -b tcp://0.0.0.0:9292
Restart=always
[Install]
WantedBy=multi-user.target
サービス起動と永続化
サービス起動が自動で実行されるようにします。これにより、サーバーを起動した際に自動的にPumaが起動します。
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable puma
sudo systemctl start puma
sudo systemctl status puma
以下の出力があれば成功です。
Listening on http://0.0.0.0:9292
ポート:9292でListenして待機している状態です。
ApacheでRedmineをリバースプロキシで公開する
起動したPumaは、Apacheからリバースプロキシを使用して公開します。
Apacheで必要なモジュールの有効化(リバースプロキシ)
Apacheのリバースプロキシ機能を有効化します。
sudo a2enmod proxy proxy_http headers
sudo systemctl restart apache2
Apache仮想ホスト設定ファイルの作成
/etc/apache2/sites-available
に、Redmineのホスト設定ファイルを作成します。
sudo nano /etc/apache2/sites-available/redmine.conf
以下の内容を記述します。
<VirtualHost *:80>
ServerName redmine.local
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9292/
ProxyPassReverse / http://127.0.0.1:9292/
RequestHeader set X-Forwarded-Proto http
RequestHeader set X-Forwarded-Ssl on
</VirtualHost>
ServerName redmine.local
: http://redmine.local でアクセスすることを設定ProxyPass / http://127.0.0.1:9292/
: http://127.0.0.1:9292/ は、起動したPumaにリバースプロキシするための設定ProxyPassReverse / http://127.0.0.1:9292/
: Pumaからのリターンされたデータを受け取るための設定
設定を有効化してApache再起動
作成した、redmine.confを有効化して再起動します。
sudo a2ensite redmine.conf
sudo systemctl reload apache2
動作確認(ブラウザからアクセス)
ブラウザで以下のURLにアクセスして、Railsアプリ(今回はRedmine)が表示されれば設定は完了です。
アプリが表示されない場合は、以下を確認してみてください。
- Apacheが起動しているか:
sudo systemctl status apache2
- エラーログの確認:
/var/log/apache2/error.log
- 名前解決できるか(ブラウザを使う機器が、redmine.localを認識できているか)
※ Windowsであれば、Hostsを書き換えることで認識できるようになります - ブラウザのキャッシュクリア
まとめ
今回は、Redmineを本番運用するための構成として、Puma+Apacheの組み合わせで構築を行いました。
Pumaは単体で起動確認を行ったうえで、systemd
によるサービス化を行い、再起動後も自動で起動できるように設定。さらにApacheからリバースプロキシでPumaに接続し、ブラウザからは通常のWebサイトとしてRedmineを公開できるようにしました。
途中、systemd
サービスが再起動後にうまく動かない、Apacheの構文エラーなどいくつかの課題に直面しましたが、それぞれ原因を調査しながら解決していくことで、無事に安定した本番環境を構築することができました。
コメント