DEV Community

K Dhanesh
K Dhanesh

Posted on

Wordpress along with Rails app with Apache2 and Passenger

Wordpress along with Rails app with Apache2 and Passenger

Intro

This document helps to run Wordpress blog along with Rails app in a same server and make it available / accessible via Rails App. In this example we want to run a Rails app that accsesible via domain name www.dhanesh-example.com and also want to run a Wordpress instance that accessible via /blog.

  1. user access the www.dhanesh-example.com or any paths (except /blog /api), it will refer to the Rails app
  2. user access the www.dhanesh-eample.com/blog or any paths inside /blog path scope it will refer to wordpress.

Steps

  • New or Running Rails project path /var/www/html/rails_app
  • Install passenger gem
  • Install apache2 and passenger module
  • Create virtual host for Rails app
  • Download, Extract, and rename the wordpress folder to blog
  • Move the blog folder to /var/www/html/blog and configure our wordpress instance
  • Create MySQL database for our wordpress instance
  • set WP_HOME and WP_SITEURL wordpress config to http://www.dhanesh-example.com/blog
  • Add gem 'rails-reverse-proxy' to your Gemfile and run bundle install, Commit the Gemfile and Gemfile.lock
  • Create controller to handle reverse proxy from Rails to wordpress
  • Create new route that will point access to /blog path to our reverse proxy controller.

ADDITIONAL DETAILS

Configure Rails, Passenger, Apache2

Install passenger gem and continue with installing apache2 passenger module by run passenger-install-apache2-module. Follow any instructions from the installation guide until all requirements met.

Note: don't forget the important part from the installation guide that will ask you to load passenger module in your apache2 configuration file /etc/apache2/apache2.conf

Create new virtual host by creating new config file in /etc/apache2/sites-available/dhanesh-example.conf folder. Use this configuration for the virtual host:

<VirtualHost *:80>
    ServerName dhanesh-example.com
    ServerAlias www.dhanesh-example.com
    ServerAdmin dhanesh@example.com
    DocumentRoot /var/www/html/rails_app/current/public
    RailsEnv production
    ErrorLog /var/log/apache2/app-name/error.log
    CustomLog /var/log/apache2/app-name/production.log combined
    <Directory "/var/www/html/rails_app/current/public">
        Options FollowSymLinks
        Require all granted
    </Directory>
</VirtualHost>
Enter fullscreen mode Exit fullscreen mode

Wordpress Configuration

Update the wp-config.php set WP_HOME and WP_SITEURL to http://www.dhanesh-example.com/blog.

define('WP_SITEURL', 'http://dhanesh-example.com/blog');
define('WP_HOME',    'http://dhanesh-example.com/blog');
define('FS_METHOD', 'direct');
Enter fullscreen mode Exit fullscreen mode

Configuring Reverse proxy from Rails to Wordpress

Install rails-reverse-proxy gem

Create a controller that will handle reverse proxy from Rails to wordpress. In my example, the controller name is WordpressController with the following codes:

# app/controllers/wordpress_controller.rb
class WordpressController < ApplicationController
  include ReverseProxy::Controller
  def index
    reverse_proxy "http://dhanesh-example.com:80" do |config|
      config.on_missing do |code, response|
        redirect_to root_url   and return
      end
    end
  end
  end
Enter fullscreen mode Exit fullscreen mode

You could change the http://dhanesh-example.com:80 part with any host and any port where your wordpress instance running.

Next, you need to add new route to config/route.rb that will point any request to /blog path in our Rails app to our reverse proxy controller (WordpressController). Here is my config/routes.rb:

Rails.application.routes.draw do
  match 'blog' => 'wordpress#index', via: [:get, :post, :put, :patch, :delete]
  match 'blog/*path' => 'wordpress#index', via: [:get, :post, :put, :patch, :delete]

  get 'home/index'
  root to: 'home#index'
end
Enter fullscreen mode Exit fullscreen mode

When there is request to /blog path, our Rails app will point it to apache server and looking for a folder with name blog, that's why we need to rename our wordpress folder into blog.

Configure virtual host for wordpress

Edit the previously created config file in dhanesh-example.conf folder. Add the following configurations to the virtual host:

    Alias /blog /var/www/html/blog
    <Directory /var/www/html/blog>
        Allow From all
        Options +Indexes
        AllowOverride all
    </Directory>

    <Location /blog>
      PassengerEnabled off
    </Location>
Enter fullscreen mode Exit fullscreen mode

Restart the Apache server again.

Test

dhanesh-example.com it will display rails page and try to access dhanesh-example.com/blog it will point to the wordpress blog

Example Vhost Entry

<IfModule mod_ssl.c>
<VirtualHost *:443>
    RailsEnv production
    ServerName dhanesh-example.com
    #ServerAlias www.dhanesh-example.com
    DocumentRoot "/var/www/html/rails_app/current/public"
    PassengerRuby /home/dhanesh/.rvm/gems/ruby-2.6.3/wrappers/ruby
    #DocumentRoot "/var/www/html"
    ErrorLog "/var/log/apache2/example.com/error.log"
    CustomLog "/var/log/apache2/example.com/access.log" common
    <Directory "/var/www/html/rails_app/current/public">
    #<Directory "/var/www/html">
        Options All
        #DirectoryIndex maintenance.html
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    Alias /blog /var/www/html/blog
    <Directory /var/www/html/blog>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /var/www/html/blog/wp-content>
        Options FollowSymLinks
        Order allow,deny
        Allow from all
    </Directory>
    <Location /blog>
        PassengerEnabled off
    </Location>
    #RewriteEngine on
    #RewriteRule index\.html index.php [NC,R]
    # Remove the www
    #RewriteCond %{HTTP_HOST} ^www.URL$ [NC]
    #RewriteRule ^(.*)$ http://URL/ [R=301,L]
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/dhanesh-example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/dhanesh-example.com/privkey.pem
</VirtualHost>
</IfModule>
Enter fullscreen mode Exit fullscreen mode

Thank you

Top comments (0)