ApacheサーバをリバースプロキシにしてRailsアプリと連携させる
はじめに
無事にEC2(Rails)とRDS(PostgreSQL)でアプリケーションをAWSにデプロイできました。
作業記録の記事はこちら。
railsアプリをEC2とRDS(PostgreSQL)でデプロイする
本記事ではEC2インスタンスでApacheサーバーを用意し、railsアプリと連携させる事をゴールとしています。
作業概要
- リバースプロキシ用のEC2インスタンスを作成
- 「Apache HTTP Server」と「mod_proxy」をインストール
- mod_proxy を使ってリバースプロキシ設定
1.インスタンスの起動とパッケージのインストール
Apacheサーバー(EC2)を以下の構成で起動
- 名前:web_server
- OSイメージ:AmazonLinux
- AMI:AmazozLinux2023 AMI 64ビット(x86)
- インスタンスタイプ:t2.micro
- キーペア:新規に作成
- ネットワーク(アプリケーションと同じvpc)
- サブネット:public1-ap-northeast-1a
- パブリックIPの自動割り当て:有効化(インターネットから接続可能にする)
- セキュリティグループ
- セキュリティグループ名:apache_security_group
- インバウンドグループ(構築中は自PCからの接続のみ許可する)
- タイプ:すべてのトラフィック
- ソース:マイIP
- ストレージ:30GB(gp3)
インスタンス起動後、Apacheをインストールし起動する。
% sudo dnf install httpd -y
% sudo systemctl start httpd
% sudo systemctl enable httpd
続いてmod_proxy_htmlをインストール。
mod_proxy_htmlはApache2.4より新しくApache標準のモジュール。リバースプロキシとしてApacheを構築する際にproxy先サーバーからの応答コンテンツのURLを変換するために使用するもの。
% sudo dnf install mod_proxy_html -y
2.mod_proxy_htmlの設定
railsアプリにapacheサーバーから接続を行うため、「/etc/httpd/conf.d」にrails.confという設定ファイルを作成する。
※Apacheは/etc/httpd/conf.d配下の「.conf拡張子」ファイルを設定ファイルとして認識してくれる。
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://<ApacheサーバーのIPアドレス>:3000/
ProxyPassReverse / http://<ApacheサーバーのIPアドレス>:3000/
ErrorLog /var/log/httpd/rails_error.log
CustomLog /var/log/httpd/rails_access.log combined
</VirtualHost>
3.railsアプリの起動
railsアプリを起動する。
% RAILS_ENV=production bundle exec rails s -b 0.0.0.0
=> Booting Puma
=> Rails 8.0.2 application starting in production
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.6.0 ("Return to Forever")
* Ruby version: ruby 3.4.4 (2025-05-14 revision a38531fd3f) +PRISM [x86_64-linux]
* Min threads: 3
* Max threads: 3
* Environment: production
* PID: 13608
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
4.Apacheサーバーにアクセス(リバースプロキシ)
ブラウザで<apacheサーバーのIPアドレス>/tasksにアクセスする。
(※railsアプリのEC2インスタンスのセキュリティグループはテストのため一時的に全解放してあります)
無事にApaceサーバー経由で表示された。
さいごに
リバースプロキシを使用してアプリに接続する事ができました。しかし、現在Apacheサーバーとrailsサーバーともにパブリックサブネットに配置してあります。その為、セキュリティの観点からはrailsサーバーはプライベートサブネットに配置する必要があります。また、適切なセキュリティグループも設定してあげる必要があります。
次回の記事でその作業を記載していこうと思います。
Discussion