そもそもApacheとは
Apacheとは、HTTPレスポンスを返すウェブサーバーの1つです。
AWSのEC2を作成しただけでは、IPアドレスにアクセスしても何も表示されません。
EC2にApacheを入れることで、HTTPリクエストに対してHTTPレスポンスを返せるようになります。
Apacheの設定手順
ステップ0がすでに済んでいる方は、ステップ1から始めてください。
ステップ0:VPCの作成、EC2の作成、Railsアプリの作成
ステップ1:Apacheのインストールおよび初期設定
ステップ2:ブラウザでApacheのページを表示する
ステップ3:ブラウザで自分のアプリを表示する
ステップ0
Apacheの設定の前に、4つの準備が必要です。
ここでは、VPCやEC2の説明は割愛します。
VPCの作成
以下を行ってください。
EC2の作成
Railsアプリの作成
ローカル上の任意のディレクトリで、rails new [アプリ名]
を実行します。
EC2インスタンスにSSHログイン
EC2インスタンス作成時にダウンロードしたpemファイル(拡張子が.pem
のファイル)が必要です。
ssh -i [pemファイルのパス] ec2-user@パブリックIPアドレス
ステップ1:Apacheのインストールおよび初期設定
EC2にApacheを入れる
EC2にログインしたら、Apacheをインストールしましょう。
httpd
がApacheのことです。d
は「デーモン」の略で、バックグラウンドで動くプロセスのことを言います。
Apacheの初期バージョンはhttpd
と呼ばれており、その名残で以下のコマンドになっています。
-y
オプションをつけると質問にいちいちyes
と回答しなくて済みます。
sudo yum install -y httpd
Apacheを起動する
一般ユーザーではApacheを起動できません。
Apacheを起動するにはsudo
をつけて特権ユーザーで実行する必要があります。
sudo systemctl start httpd
Apacheが起動しているかは、以下で確認できます。 緑でactive (running)と表示されれば起動できています。
sudo systemctl status httpd
EC2を起動したらApacheも起動する設定にする
EC2に入って毎回Apacheを起動するのは面倒なので、EC2を起動したらApacheも自動で起動する設定をしておくと便利です。
sudo systemctl enable httpd
この設定が有効になっているか以下で確認できます。
enabled
と表示されればOKです。
sudo systemctl is-enabled httpd
ステップ2:ブラウザでApacheのページを表示する
いまの状態で、検索バーにパブリックIPアドレスを入力してもApacheのページは表示されません。
なぜならEC2がHTTPのリクエストを許可していないからです。
EC2がHTTPリクエストを受け入れるには、EC2のセキュリティグループを編集します。
インバウンドルールでは、外部からEC2へアクセス可能な通信を指定できます。
現状インバウンドルールでSSHしか許可していないので、HTTPを追加すればOKです。
具体的には、以下のとおりです。
- 「インバウンドルールの編集」→「ルールを追加」→タイプ「HTTP」を選択→ソース「Anywhere-IPv4」
- 「インバウンドルールの編集」→「ルールを追加」→タイプ「HTTP」を選択→ソース「Anywhere-IPv6」
最後に「ルールを保存」
これでApacheのページが表示されるはずです。
検索窓にパブリックIPアドレスを打ち込んで、「It works!」と表示されればOKです。
ステップ3:ブラウザでRailsアプリを表示する
ローカル上で作成したRailsアプリをGitHubに上げてください。
EC2にgitをインストールします。
sudo yum install -y git
git clone https://github.com/naota7118/apache-app.git
HTTPレスポンスでRailsのページを返すように、Apacheの設定ファイルを編集していきます。
EC2の/etc/httpd/conf
ディレクトリにhttpd.conf
ファイルがあります。
その中で、ポート番号80で受け付けているのがわかります。
Listen 80
やろうとしていること
インターネットからEC2にHTTPリクエストがあったとき、ポート番号80で受け入れます(さきほどセキュリティグループで許可したからです)。
その通信はEC2内部のApacheが待ち受けています。
現状Apacheのデフォルトのページをレスポンスで返しているのを、Railsのページを返すようにしたいです。
どうすればいいでしょうか?
ローカルのRailsアプリを起動すると、Listening on http://127.0.0.1:3000
と表示されます。
これは127.0.0.1
は自分のパソコンのIPアドレスで、3000
はポート番号です。
つまり、Railsアプリは自分のパソコンの3000番窓口で待ち受けています。
通信がApacheまできたら、自分のパソコンの3000番窓口につなげれば、Railsアプリがレスポンスを返します。
Apacheへのリクエストを別のサーバーに行くようにするにはどうすればいいでしょうか?
ここで用いるのが、リバースプロキシです。
リバースプロキシとは
「プロキシ」とは「代理」という意味です。
今回、返したいのはRailsアプリで、RailsにはPumaというWebサーバーが入っていますが、PumaだけではApacheにきたリクエストをRailsに受け渡すことはできません。
そこで、クライアント(HTTPリクエストを送る側)とRails(レスポンスを返すサーバー)の間にリバースプロキシをかませます。
Apacheがリバースプロキシとして機能するよう、/etc/httpd/conf/httpd.conf
に追加設定を書きます。
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so ProxyRequests Off ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/
ここに出てくるLoadModule
やProxyRequests
のことを「ディレクティブ」と言います。
「ディレクティブ」は、指示のことです。
1つ1つのディレクティブがApacheに対して「〇〇してね」と指示を出しています。
Apacheをリバースプロキシ化する
mod_proxy
とmod_proxy_http
という2つのモジュールを用います。
LoadModule
ディレクトリで、mod_proxy
を読み込んでいます。
LoadModule proxy_module modules/mod_proxy.so
/etc/httpd/modules
ディレクトリにApacheのモジュールがあります。
LoadModule
ディレクティブは、LoadModule [モジュール名] [モジュールのパス]
でモジュールを読み込みます。
ProxyRequests Off
ProxyRequests
は、フォワードプロキシ設定のON/OFFを決めます。
今回はリバースプロキシ化するのでOFFにします。
いよいよリクエストを転送する部分です。
ProxyPass / http://127.0.0.1:3000/
ProxyPass
ディレクトリは、ProxyPass [Apacheのパス] [ローカルサーバーのパス]
と指定することで、Apacheに来たリクエストをローカルサーバーに転送します。
これによって、クライアントからIPアドレス宛にHTTPリクエストが送られたら、Apacheを経由してRailsサーバーがレスポンスとして返されるようになります。
EC2上でRailsサーバーを動かすには、以下の準備が必要です。
rbenvのインストール
rbenvはRubyのバージョン管理ツールです。
Rubyのバージョンを指定してインストールしたいときやバージョンを新しくしたいときに使います。
git clone https://github.com/rbenv/rbenv.git ~/.rbenv ~/.rbenv/bin/rbenv init source ~/.bash_profile
ruby-buildのインストール
ruby-buildは、Unixシステム上でRubyをソースからインストールするためのコマンドラインツールです。
rbenvのプラグインとして使うこともできますし、スタンドアロンとして使うこともできます。
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
ライブラリのインストール
Rubyは様々なライブラリを使っているので、ライブラリを先にインストールしておかないと、Rubyをインストールするときに「〇〇のライブラリがありません」とエラーが出ます。
逐一追加するのも面倒なので、さきにインストールしておきましょう。
sudo dnf group install -y "Development Tools" sudo yum install -y ruby-devel openssl-devel libyaml-devel libffi-devel
空き容量の確保
No space left on device
というエラーが出たら、デバイス上の空き容量不足でRubyのインストールが完了していません。
/usr/bin/ar: unable to copy file 'libruby-static.a'; reason: No space left on device make: *** [Makefile:318: libruby-static.a] Error 1
Rubyのインストール
容量不足を解消するために、一時ディレクトリを作成したうえでインストールします。
環境変数TMPDIR
を定義すると、一時ディレクトリが作られます。
このディレクトリはインストールプロセス中のみ使われます。
Rubyのインストール先は~/.rbenv/versions/3.3.0
で、一時ディレクトリではありません。
TMPDIR="${PWD}/tmp" rbenv install -v 3.3.0
rubyインストールでtmpの容量不足 #Ruby - Qiita
Railsアプリの起動
EC2内でRailsアプリのディレクトリに移動して、bundle install
を実行します。
その後、rbenv rehash
で、gemのコマンドが使えるようになり、rails s
で起動できるようになります。
bundle install rbenv rehash
http://パブリックIPアドレス
でアクセスすると、Railsのロゴが表示されれば完了です。