There was a Ruby on Rails (Unicorn) app running on domain root. Client wanted to have a WordPress blog on domain.com/blog. I had an idea what I should do to get this working. But it was still a challenge for me since I was a total noob to Ruby on Rails. But after few hours of searching around and seeking experts on the subject, I come up with proper rewrite rules for getting WordPress work with Ruby on Rails on an Nginx server.
Setting WordPress in a subdirectory on Nginx server is relatively easy if you have a php site on domain root. Since RoR has nothing to do with php, I had to come up with some special rewrite rules that will let RoR to handle domain root and php (fastcgi) to handle /blog directory. First thing I did was installing latest version of php5 and other WordPress requirements on the server. So I added launchpad repo to apt-sources.
sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej/php5
Then updated the apt cache
sudo apt-get update
Finally installed php5 and some other modules,
sudo apt-get install php5-common php5-mysql php5-xmlrpc php5-cgi php5-curl php5-gd php5-cli php5-fpm php-apc php-pear php5-dev php5-imap php5-mcrypt
Ruby on Rails developer already had rewrite rules for his app. So I made a backup of Nginx domain specific config file before touching anything. It looked like this,
upstream unicorn {
  server unix:/tmp/unicorn.app.sock fail_timeout=0;
}
server {
        listen 80;
        server_name domain.com;
        root /home/user/appname/current/public;
        location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
        }
        try_files $uri/index.html $uri @unicorn;
             location @unicorn {
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_redirect off;
             proxy_pass http://unicorn;
             }
  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}All I had to do was to add new location block for blog and pass it to fastcgi. So first I created blog directory inside apps folder like this,
sudo mkdir /home/user/appname/blog
Then I setup WordPress there as I normally do. And then I should add a new location block to Nginx config file so requests get passed to fastcgi. New location block looked like below. Note that 2nd line, I deliberately did not include ‘blog’ in the root path so ‘blog’ becomes a part of resources. The other highlighted lines are for WordPress pretty links.
location /blog {
    root /home/user/appname;
    index index.php;
if (!-e $request_filename) {
        rewrite  ^(.*)$  /blog/index.php?q=$1  last;
      }
    location ~ .php(?|$) {
        include /etc/nginx/fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
} And the final site specific config file looked like this,
upstream unicorn {
    server unix:/tmp/unicorn.app.sock fail_timeout=0;
                 }
server {
    listen 80;
    server_name domain.com;
    root /home/user/appname/current/public;
        location /blog {
           root /home/user/appname;
           index index.php;
           if (!-e $request_filename) {
           rewrite  ^(.*)$  /blog/index.php?q=$1  last;
                                      }
                location ~ .php(?|$) {
                   include /etc/nginx/fastcgi_params;
                   fastcgi_index index.php;
                   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                   fastcgi_pass unix:/var/run/php5-fpm.sock;
                                      }
                        }
         location ^~ /assets/ {
         gzip_static on;
         expires max;
         add_header Cache-Control public;
                             }
             try_files $uri/index.html $uri @unicorn;
                location @unicorn {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://unicorn;
                                  }
   error_page 500 502 503 504 /500.html;
   client_max_body_size 4G;
   keepalive_timeout 10;
        } Even though, I had trouble figuring it out. I came up with this solution in the end. And it doesn’t look so tough when it’s working ;).
 
Hello,
any idea how to do this with phpmyadmin?
Process should be same. Just upload phpmyadmin instead of WordPress.
I am getting this error
2015/09/06 15:54:43 [error] 27140#0: *1 FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream, client: ***.***.*.***, server: localhost, request: “GET /blog HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “tweelerts.com”
The error message “primary script unknown” is always related to a wrongly set SCRIPT_FILENAME in the nginx fastcgi_param directive.
Check your configuration and see if there’s line similar to this,
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Thanks, this worked perfectly for me, I tried different tutorials but nothing worked really…