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)