2
0

Apache + Passenger + Docker + Docker-composeでRuby on Railsの環境を構築

Last updated at Posted at 2024-03-03

概要

DockerDocker Composeを使用して、Apacheサーバー上にPhusion Passengerを動作させ、Ruby on Railsを展開する環境を構築します。今のこのご時世にこの構成でRailsを動かす事はほぼないと思っておりますので、構築手順は、シンプルに記載します。

Apacheの概要

Apacheは、HTTPサーバーの一つであり、クライアントからのHTTPリクエストを受け取り、ウェブページやウェブコンテンツを提供する役割を果たす

Phusion Passengerの概要

ApacheNginx等のwebサーバーと連携して使用する。PassengerWeb Applicationを処理する為のApplicationサーバーとして機能し、webサーバー(ApacheNginx)と連携する事で、リクエストの受け入れ、アプリケーションの処理、レスポンスの送信を行う

前提条件

以下がインストールされている事が前提です。

  • 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.confdefault-ssl.conf、以外のconfファイルを有効にする
    (Apacheのデフォルト設定で、000-default.confdefault-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
    web2pumaを使用して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の設定

  • 不要であれば、web2pgadminの記述を消去して問題ないです
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の画面が表示されない
  • 表題の構成を立ち上げた際は、RailsAPIとして使用する以外、使用できないと考えて頂いて問題はない

筆者が作成したディレクトリ

参考資料

環境構築関連

apache関連

Phusion passenger関連

まとめ

今回は、表題の開発環境を作成しました。ApachePassengerについて詳しくなれたのでとても良い学びでした。また、新しい開発環境を作成する機会があれば記事にしたいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0