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.
- user access the www.dhanesh-example.com or any paths (except /blog /api), it will refer to the Rails app
- 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>
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');
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
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
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>
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>
Top comments (0)