Search code examples
node.jsnginxserver-side-renderingpassengerdev-to-production

Nginx config with both SSR Client and API server


I'm facing a problem with an Nginx sites-available config file. I'm trying to set up a client that uses Server Side Rendering (SSR) with Nodejs, and a RestfulAPI that uses Ruby on Rails. What I want is to have my default path location "/" that goes to the Nodejs server, and I also want to have all the calls to my server (my API) to the path location "/api".

Here is my config file :

listen 80;
server_name didsomeonesayfrankerz.com;

passenger_friendly_error_pages on;
passenger_enabled on;
passenger_app_group_name didsomeonesayfrankerz;
passenger_min_instances 15;
passenger_max_request_queue_size 200;
passenger_app_env production;
client_max_body_size 10M;

# API server
location /api {
  passenger_app_type ruby;
  passenger_ruby /home/ost/.rvm/gems/ruby-3.0.0/wrappers/ruby;
  root /home/ost/didsomeonesayfrankerz/server/public;
}

# SSR
location / {
  root /home/ost/didsomeonesayfrankerz/client/dist/ssr;
  passenger_app_type node;
  passenger_nodejs /home/ost/.nvm/v18.16.0;
  passenger_startup_file /home/ost/didsomeonesayfrankerz/client/dist/ssr/index.js;
}

charset utf-8;

location ~ /\.(?!well-known).* {
  deny all;
}

My problem is pretty simple : every calls I make to the server ("/api") are catched by the Node Server (SSR). I tried using "location ^~ /api" but didn't work.

Any help or suggestions are appreciated!


Solution

  • Turns out I finally found the issue : the passenger_app_group_name. Simply comment it and everything works fine. It is also possible to put the passenger_app_group_name inside each location spots.

    listen 80;
    server_name didsomeonesayfrankerz.com;
    
    passenger_friendly_error_pages on;
    passenger_enabled on;
    # passenger_app_group_name didsomeonesayfrankerz;
    passenger_min_instances 15;
    passenger_max_request_queue_size 200;
    passenger_app_env production;
    client_max_body_size 10M;
    
    # API server
    location /api {
      passenger_app_type ruby;
      passenger_ruby /home/ost/.rvm/gems/ruby-3.0.0/wrappers/ruby;
      root /home/ost/didsomeonesayfrankerz/server/public;
      passenger_app_group_name didsomeonesayfrankerzAPI;
    }
    
    # SSR
    location / {
      root /home/ost/didsomeonesayfrankerz/client/dist/ssr;
      passenger_app_type node;
      passenger_nodejs /home/ost/.nvm/v18.16.0;
      passenger_startup_file /home/ost/didsomeonesayfrankerz/client/dist/ssr/index.js;
      passenger_app_group_name didsomeonesayfrankerzSSR;
    }
    
    charset utf-8;
    
    location ~ /\.(?!well-known).* {
      deny all;
    }