Ruby on RailsアプリとWordPressを共存させる(Apache+Passenger)

弊社でやっているhitorino.meというWebサービスは、お店検索部分がRuby on Rails、ブログ部分がWordPressで構築しています。

URL的には、

http://hitorino.me ・・・ お店検索
http://hitorino.me/blog ・・・ ブログ

となっていて、http://hitorino.meの中でRailsとWordPressが共存しなければならない状態です。
サーバスタックとしては、Apache+Passengerという典型的かつ古典的?な構造。

Passengerの基本動作

Passengerは特定のパス配下へのアクセスをRails等に流すという動作をします。

WordPressをどこにインストールするかによって、2つの方法があります。

WordPressをサブディレクトリにインストールする場合

オーソドックスなのは、この方法でしょう。http://hitorino.me/blogへのアクセスをWordPressに流したいのだから、最初から、WordPressをサブディレクトリにインストールすれば良い。(実際には、あるディレクトリにインストールしたWordPressに対して、/blogをエイリアスにする。)

その上で、http://hitorino.me/blogへのアクセスをPHP側で処理させるようにPassengerを設定します。

<VirtualHost *:80>
    DocumentRoot /srv/hitorino.me/public
    ServerName hitorino.me
    PassengerEnabled On

    Alias /blog /srv/hitorino.me-blog
    <Directory /srv/hitorino.me-blog>
        PassengerEnabled Off
        AllowOverride All
    </Directory>
</VirtualHost>

このように、hitorino.meドメインをバーチャルホストで設定して、DocumentRootを/srv/hitorino.me(Railsアプリのディレクトリ)の/publicにする。さらに、PassengerEnabled Onとすることで、PassengerはRailsに処理を流すようになります。

一方、hitorino.me/blogは、/srv/hitorino.me-blog(WordPressをインストールしたディレクトリ)へのエイリアスとして設定して、/srv/hitorino.me-blogへのアクセスはPassengerEnabled Offということで、そのままApacheに処理させるというわけです。

PassengerHighPerformanceをOnにしない

この方法で注意すべきなのは、/etc/httpd/conf.d/passenger.confなどで、PassengerHighPerformanceオプションを設定しないことです。このオプションをOnにすると、PassengerEnabledの設定が効かなくなるらしく、/blogへのアクセスでもPassengerに処理が流れ、Railsがエラーを返すというパターンにハマります。

WordPressをWebルートディレクトリにインストールする場合

なかなかないパターンだとは思うのですが、WordPressをhttp://hitorino.me直下にインストールする場合です。

その上で、WordPressで作ったサイトの表示設定で、フロントページを固定ページにして、投稿ページ(ブログの記事一覧のページ)を別に設定し、さらにパーマリンク設定でパスの先頭に/blogを付けるように設定すると、これはこれで意味が出てくるのです。(あぁ、この説明で状況が分かってもらえるのだろうか・・・。まぁ、こんな頓狂な設定をする人なら、頓狂な説明でも分かってもらえるかもしれない。)

で、http://hitorino.meへのアクセスはRailsに流すけど、http://hitorino.me/blogへのアクセスはWordPressに流したい。(WordPress側のhttp://hitorino.me直下の固定ページは決して表示されない。)

ちょっと厄介ですが、これも実現可能です。
VirtualHostの設定は下記のようになります。

<VirtualHost *:80>
    DocumentRoot /srv/hitorino.me/public
    ServerName hitorino.me
    PassengerEnabled On

    <Directory /srv/hitorino.me/public>
        PassengerEnabled On
        AllowOverride All
        Options -MultiViews
    </Directory>

    Alias /blog /srv/wp
    Alias /contact /srv/wp
    Alias /wp-admin /srv/wp/wp-admin
    Alias /wp-content /srv/wp/wp-content
    Alias /wp-includes /srv/wp/wp-includes
    <Directory /srv/wp>
        PassengerEnabled Off
        AllowOverride All
    </Directory>
</VirtualHost>

その上で、パーマリンクとして設定しておいた/blogへのアクセスをはじめとして、http://hitorino.me直下のURLを設定したい固定ページ、WordPressの管理ページ等を片っ端からWordPressをインストールしたディレクトリ(上記例では/srv/wp)のエイリアスとして指定し、そのディレクトリへのアクセスではPassengerをOffとしてApacheに処理させるようにします。

まだ、これだけでは足りません。WordPressのインストールディレクトリ直下に置いてあるファイルへのアクセスがRailsに流れてしまうのです。
そこで、/srv/hitorino.me/public(Railsアプリの/publicディレクトリ)に、WordPress側へのシンボリックリンクを置きます。

index.php -> /srv/wp/index.php
wp-activate.php -> /srv/wp/wp-activate.php
wp-blog-header.php -> /srv/wp/wp-blog-header.php
wp-comments-post.php -> /srv/wp/wp-comments-post.php
wp-cron.php -> /srv/wp/wp-cron.php
wp-links-opml.php -> /srv/wp/wp-links-opml.php
wp-load.php -> /srv/wp/wp-load.php
wp-login.php -> /srv/wp/wp-login.php
wp-mail.php -> /srv/wp/wp-mail.php
wp-settings.php -> /srv/wp/wp-settings.php
wp-signup.php -> /srv/wp/wp-signup.php
wp-trackback.php -> /srv/wp/wp-trackback.php
xmlrpc.php -> /srv/wp/xmlrpc.php

これで、一通り動くようになります。

まとめ

Webサービスを作るときに、アプリはRailsで作ることは多いでしょう。
さらにブログもやりたいとなると、餅は餅屋ということでWordPressを使いたいと思います。
良くあるのは、ブログの方はサブドメインを切って、そちらでやるというパターンなのですが、よりWebサービス全体としての一体感を高めるためにサブディレクトリでやりたいということもあると思うのです。(SEO的な効果もあるかもしれませんし。)

そういう場合に、結構柔軟に設定出来ることが分かっていただけたのではないかと思います。是非、お試しください。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。2018年、株式会社ビビンコを北九州市に創業。IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。