概要
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について詳しくなれたのでとても良い学びでした。また、新しい開発環境を作成する機会があれば記事にしたいと思います。