概要
Docker
とDocker Compose
を使用して、Apache
サーバー上にPhusion Passenger
を動作させ、Ruby on Rails
を展開する環境を構築します。今のこのご時世にこの構成でRails
を動かす事はほぼないと思っておりますので、構築手順は、シンプルに記載します。
Apacheの概要
Apache
は、HTTP
サーバーの一つであり、クライアントからのHTTP
リクエストを受け取り、ウェブページやウェブコンテンツを提供する役割を果たす
Phusion Passengerの概要
Apache
やNginx
等のweb
サーバーと連携して使用する。Passenger
はWeb Application
を処理する為のApplication
サーバーとして機能し、web
サーバー(Apache
やNginx
)と連携する事で、リクエストの受け入れ、アプリケーションの処理、レスポンスの送信を行う
前提条件
以下がインストールされている事が前提です。
- Docker Desktop
- Visual Studio Code
ディレクトリー構成
.
├── apache/
│ ├── conf-available/
│ │ └── fqdn.conf
│ ├── mods-available/
│ │ └── passenger.conf
│ ├── mods-available/
│ │ └── passenger.load
│ ├── .htaccess
│ ├── ports.conf
│ └── virtual_host_enabler.sh
├── backend/
│ ├── conf/
│ │ ├── .env
│ │ └── database.yml
│ ├── web1/
│ │ ├── # その他Railsの設定ファイル
│ │ ├── InitDockerfile ← 新規のRailsを立ち上げる為に使用した
│ │ └── Dockerfile
│ └── web2/
│ └── # その他Railsの設定ファイル/
│ └── Dockerfile
├── db/
│ ├── conf/
│ │ └── .env
│ └── postgres_volume ← 自動生成
└── docker-compose.yml
構築ファイル
Apacheの設定
- 任意で指定したドメインからアクセスできるように設定
/conf-available/fqdn.conf
ServerName 任意のドメイン名
# 入力例
127.0.0.1 web1.localhost.com
/sites-available/web1.conf
<VirtualHost *:3000>
ServerAdmin webmaster@localhost
DocumentRoot /backend/web1/public
<Directory "/backend/web1/public">
AllowOverride all
Require all granted
Options MultiViews
RailsEnv development
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
ports.conf
Listen 3000
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
-
sites-available
にある000-default.conf
とdefault-ssl.conf
、以外のconfファイル
を有効にする
(Apacheのデフォルト設定で、000-default.conf
とdefault-ssl.conf
は無視される)
virtual_host_enabler.sh
#!/bin/sh
default_name="000-default"
default_ssl_name="default-ssl"
dir_path="/etc/apache2/sites-available"
dirs=`find $dir_path -type f -name *.conf`
for dir in $dirs;
do
filename=`basename $dir .conf`
if [ $filename = $default_name ]; then
continue
elif [ $filename = $default_ssl_name ]; then
continue
else
a2ensite $filename
fi
done
Passengerの設定
/mods-available/passenger.conf
<IfModule mod_passenger.c>
PassengerRoot /usr/local/bundle/gems/passenger-バージョン
PassengerDefaultRuby /usr/local/bin/ruby
PassengerInstanceRegistryDir /tmp
PassengerUserSwitching off
PassengerDefaultUser root
PassengerDisableSecurityUpdateCheck on
PassengerSpawnMethod smart
PassengerFriendlyErrorPages on
PassengerPoolIdleTime 0
</IfModule>
# バージョンは、インストールしたpassengerのバージョンを記載する
# 基本的には、最新のpassengerをインストールする事を推奨する
/mods-available/passenger.load
LoadModule passenger_module /usr/local/bundle/gems/passenger-バージョン/buildout/apache2/mod_passenger.so
# バージョンは、インストールしたpassengerのバージョンを記載する
# 基本的には、最新のpassengerをインストールする事を推奨する
.htaccess
# リダイレクトのテスト
Redirect /jp/ https://www.google.com/
# シンボリックリンク(ショートカットとも呼ばれます)を追跡することを許可する
Options +FollowSymLinks
<IfModule mod_rewrite.c>
# CORS設定
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Credentials "true"
</IfModule>
</IfModule>
# Access-Control-Allow-Origin : すべてのオリジンからのリクエストを許可する
# Access-Control-Allow-Credentials : リクエストの資格情報(クッキー、HTTP認証、クライアントSSL証明書など)を送信する際、そのレスポンスがフロントエンドのJavaScriptコードに公開されるかどうかを制御する
# オリジンとは
# https://www.example.com:443は一つのオリジン
# httpsはプロトコル、www.example.comはホスト、443はポート
Dockerfileの設定
-
/backend/web1
に記載してあるDockerfile
ARG RUBY_VERSION=3.3.0
FROM ruby:${RUBY_VERSION}-slim-bookworm
# タイムゾーン設定
ENV LANG=C.UTF-8 \
TZ=Asia/Tokyo
RUN mkdir -p /backend/web1
WORKDIR /backend/web1
# パッケージインストール
RUN apt-get update && apt-get install -y \
git \
vim \
curl \
build-essential \
nodejs \
libpq-dev \
apache2 \
apache2-dev \
ruby-dev \
libcurl4-openssl-dev \
libpcre3-dev \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*
# apacheをセットアップする為に必要なファイル
COPY ./apache/sites-available /etc/apache2/sites-available
COPY ./apache/ports.conf /etc/apache2/ports.conf
COPY ./apache/conf-available/fqdn.conf /etc/apache2/conf-available/fqdn.conf
COPY ./apache/mods-available/passenger.conf /etc/apache2/mods-available/passenger.conf
COPY ./apache/mods-available/passenger.load /etc/apache2/mods-available/passenger.load
COPY ./apache/virtual_host_enabler.sh /backend
# railsのセットアップ
COPY ./backend/web1/Gemfile /backend/web1/Gemfile
COPY ./backend/web1/Gemfile.lock /backend/web1/Gemfile.lock
COPY ./backend/web1 /backend/web1
# .htaccessのファイルをコピー
COPY ./apache/.htaccess /backend/web1/public/.htaccess
# passengerとapache関連
RUN gem install passenger
RUN passenger-install-apache2-module
# railsのセットアップ
RUN bundle install
# .htaccessを有効化
RUN a2enmod rewrite
# .htaccessに記述したheader要素の有効化
RUN a2enmod headers
# passenger.loadファイルを有効化
RUN a2enmod passenger
# proxyモジュールを有効化
RUN a2enmod proxy_http
# fqdnモジュールを有効化
RUN a2enconf fqdn
RUN a2dissite 000-default \
&& sh /backend/virtual_host_enabler.sh
# apacheリスタート
RUN service apache2 restart
CMD ["apachectl", "-D", "FOREGROUND"]
-
/backend/web2
に記載してあるDockerfile
※web2
はpuma
を使用してRails
を起動させています
ARG RUBY_VERSION=3.3.0
FROM ruby:${RUBY_VERSION}-slim-bookworm
ENV LANG=ja_JP.UTF-8 \
TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y \
build-essential \
curl \
git \
nodejs \
vim \
libpq-dev \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*
WORKDIR /web2
COPY Gemfile /web2/Gemfile
COPY Gemfile.lock /web2/Gemfile.lock
RUN bundle install
docker-compose.ymlの設定
- 不要であれば、
web2
、pgadmin
の記述を消去して問題ないです
docker-compose.yml
version: "3.9"
services:
db:
container_name: pgsql
image: postgres:latest
env_file: ./db/conf/.env
volumes:
- ./db/postgres_volume:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
web1:
container_name: web1
build:
context: ./
dockerfile: ./backend/web1/Dockerfile
env_file: ./backend/conf/.env
ports:
- 3000:3000
volumes:
- ./backend/web1:/web1
- ./backend/conf/database.yml:/backend/web1/config/database.yml
- ./apache/.htaccess:/backend/web1/public/.htaccess
depends_on:
- db
tty: true
stdin_open: true
web2:
container_name: web2
build: ./backend/web2
env_file: ./backend/conf/.env
ports:
- 3001:3001
volumes:
- ./backend/web2:/web2
- ./backend/conf/database.yml:/web2/config/database.yml
depends_on:
- db
tty: true
stdin_open: true
command: >
bash -c "
rm -f rm -f tmp/pids/server.pid &&
rails db:migrate &&
bundle exec rails s -p 3001 -b '0.0.0.0'
"
pgadmin:
container_name: pgadmin
image: dpage/pgadmin4
restart: always
env_file:
- ./pgadmin/conf/.env
volumes:
- ./pgadmin/pgadmin_volume:/var/lib/pgadmin
depends_on:
- db
ports:
- 8081:80
volumes:
db_volume: {}
pgadmin_volume: {}
/etc/hostsの設定
vim /etc/hosts
# 下記はvimでの表示画面
127.0.0.1 fqdn.confで設定したドメイン名
# 入力例
127.0.0.1 web1.localhost.com
index.htmlの設置
-
public/
の配下にindex.html
を設置する
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>Welcome Index.html page</h1>
</body>
</html>
動作
- ブラウザー or CLIからHTMLファイルの内容が表示されたら完了
# CLI等のターミナル
curl http://web1.localhost.com:3000/index.html
# ブラウザー
http://web1.localhost.com:3000/index.html
補足
-
Apache
+Passenger
を正常に接続してもRailsは起動しない。もう少し具体的に述べると環境構築完了時に表示されるWelcome Rails
の画面が表示されない - 表題の構成を立ち上げた際は、
Rails
をAPI
として使用する以外、使用できないと考えて頂いて問題はない
筆者が作成したディレクトリ
参考資料
環境構築関連
- Docker Rails + Reactの本番環境構築(ubuntu + Apache + rails + React + MySQL)
- Ruby on Railsアプリが動くApache Passenger Postgresql環境をdockerでつくる
- Rails+Passenger+Debian
apache関連
- dockerで構築したapacheでHeader関係の関数が使えない件の対応
- Docker で Apache .htaccess の挙動を確認してみる
- .htaccess 効いてるか 確認する方法
- dockerで構築したapacheでHeader関係の関数が使えない件の対応
- htaccessがどうしても効かないときの対処法】Apacheのデフォルト設定をチェック!
- UbuntuにてApacheのモジュールを有効化する
Phusion passenger関連
- [Phusion passenger公式]Configuration reference
- Phusion passenger Security check update holding connection
- PassengerDisableSecurityUpdateCheck
- Phusion Passenger: permission denied で ruby を実行できない問題
- PassengerDefaultUser
- Passenger ユーザースイッチングを利用できる要件
- Passenger はどのユーザーアカウントで動くのか?
まとめ
今回は、表題の開発環境を作成しました。Apache
、Passenger
について詳しくなれたのでとても良い学びでした。また、新しい開発環境を作成する機会があれば記事にしたいと思います。