Rails + Passenger + Nginx: "404 Not Found" for second app - ruby-on-rails

I'm trying to deploy a second app to Digital Ocean.
I successfully deployed the first app with this tutorial: https://www.phusionpassenger.com/library/walkthroughs/deploy/ruby/digital_ocean/integration_mode.html
I added a second app to the same place following the same tutorial. When I try to visit the second app, I get the message "404 Not Found" and the log says:
2021/08/09 11:39:43 [error] 43452#43452: *21 "/var/www/philosophische_insel/public/index.html" is not found (2: No such file or directory)
There is a troubleshooting-guide for this exact problem: https://www.phusionpassenger.com/docs/advanced_guides/troubleshooting/nginx/troubleshooting/node/
Here is what I tried so far:
To "Cause and solution #1"
I added "passenger_enabled on;":
#cat /etc/nginx/sites-enabled/philosophische_insel.conf
server {
listen 80;
server_name philosophische-insel.ch www.philosophische-insel.ch;
# Tell Nginx and Passenger where your app's 'public' directory is
root /var/www/philosopische_insel/public;
# Turn on Passenger
passenger_enabled on;
passenger_ruby /home/sandro/.rvm/gems/ruby-3.0.0/wrappers/ruby;
}
To "Cause and solution #2"
passenger_root is set to: /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
cat /etc/nginx/conf.d/mod-http-passenger.conf
### Begin automatically installed Phusion Passenger config snippet ###
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/passenger_free_ruby;
### End automatically installed Phusion Passenger config snippet ###
It is the same as the result of passenger-config --root
/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
To "Cause and solution #3"
I tried to find some errors but I was not successful.
When I reload nginx and check error.log, I get this:
[ N 2021-08-09 12:10:57.2432 44738/T1 age/Wat/WatchdogMain.cpp:1373 ]: Starting Passenger watchdog...
[ N 2021-08-09 12:10:57.2904 44741/T1 age/Cor/CoreMain.cpp:1340 ]: Starting Passenger core...
[ N 2021-08-09 12:10:57.2905 44741/T1 age/Cor/CoreMain.cpp:256 ]: Passenger core running in multi-application mode.
[ N 2021-08-09 12:10:57.3033 44741/T1 age/Cor/CoreMain.cpp:1015 ]: Passenger core online, PID 44741
[ N 2021-08-09 12:10:59.4811 44741/T5 age/Cor/SecurityUpdateChecker.h:519 ]: Security update check: no update found (next check in 24 hours)
2021/08/09 12:11:03 [error] 44756#44756: *1 "/var/www/philosopische_insel/public/index.html" is not found (2: No such file or directory), client: 87.245.104.21, server: philosophische-insel.ch, request: "GET / HTTP/1.1", host: "www.philosophische-insel.ch"
passenger-status only shows the first app
I don't know if it is important but passenger-status only shows the first app, not the second in Application groups:
----------- General information -----------
Max pool size : 6
App groups : 1
Processes : 1
Requests in top-level queue : 0
----------- Application groups -----------
/var/www/dialectica (production):
App root: /var/www/dialectica
Requests in queue: 0
* PID: 45528 Sessions: 0 Processed: 1 Uptime: 1m 57s
CPU: 0% Memory : 34M Last used: 1m 57s ago
Further Information
The first app works. However it has a different ruby version. Here is a comparison:
Ruby version:
First app:
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Second app:
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
Nginx-configuration
First app:
server {
listen 80;
server_name 159.65.120.231;
# Tell Nginx and Passenger where your app's 'public' directory is
root /var/www/dialectica/public;
# Turn on Passenger
passenger_enabled on;
passenger_ruby /home/sandro/.rvm/gems/ruby-2.6.3/wrappers/ruby;
}
Second app:
server {
listen 80;
server_name philosophische-insel.ch www.philosophische-insel.ch;
# Tell Nginx and Passenger where your app's 'public' directory is
root /var/www/philosopische_insel/public;
# Turn on Passenger
passenger_enabled on;
passenger_ruby /home/sandro/.rvm/gems/ruby-3.0.0/wrappers/ruby;
}
Any ideas?
At this point, I don't know how to proceed. Any ideas?

Assuming both apps are working fine, I have three recommendations:
Keep your root statements and add passenger_app_root with your real apps root path instead their public path
In your first app config, you are saying something like: " redirect every request looking for 159.65.120.231:80 to dialecta path", but the problem is that your DNS also resolves philosophische-insel.ch to 159.65.120.231:80. So you will never be able to reach your second app. Try using a different port or different domain (or subdomains) in each of your app's config
Remember to always check your Nginx config with sudo nginx -t and, if
config's fine, restart Nginx with sudo service nginx reload
So the following could be one config for your server:
server {
## Any of the followings should work
## Option 1: use a subdomain for this, remember that your DNS must be
## redirecting subdomains to this IP
listen 80;
server_name dialecta.philosophische-insel.ch www.dialecta.philosophische-insel.ch;
## Option 2: use a different domain. Also needs DNS config
# listen 80;
# server_name dialecta.ch www.dialecta.ch;
## Option 3: use a different port ##
# listen 81;
# server_name 159.65.120.231;
passenger_enabled on;
passenger_app_root /var/www/dialectica;
passenger_ruby /home/sandro/.rvm/gems/ruby-2.6.3/wrappers/ruby;
root /var/www/dialectica/public;
}
server {
listen 80;
server_name philosophische-insel.ch www.philosophische-insel.ch;
passenger_enabled on;
passenger_app_root /var/www/philosopische_insel;
passenger_ruby /home/sandro/.rvm/gems/ruby-3.0.0/wrappers/ruby;
root /var/www/philosopische_insel/public;
}
If you keep getting error, please post the output of sudo nginx -t.

Related

ActionCable Rails 5 (Passenger) - failed: Error during WebSocket handshake: Unexpected response code: 404

I am trying to deploy ActionCable and Rails 5 To Production server (DigitalOcean). I have followed all steps mention in the Gorails video here: https://gorails.com/episodes/deploy-actioncable-and-rails-5
The app was deployed using Phusion Passenger + Nginx + Capistrano.
And when I tried to checked my site on production, I got this error on the browser's console:
WebSocket connection to 'ws://139.59.175.34/cable' failed: Error during WebSocket handshake: Unexpected response code: 404
These are my settings:
/etc/nginx/sites-enabled/default
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name my_server_domain;
passenger_enabled on;
rails_env production;
root /home/deploy/my_app_domain/current/public;
# ActionCabel config (disable this if u r not using it)
location /cable {
passenger_app_group_name actioncable_websocket;
passenger_force_max_concurrent_requests_per_process 0;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
production.rb
config.action_cable.url = "/cable"
config.action_cable.allowed_request_origins = ["http://139.59.175.34"]
cable.js
(function() {
this.App || (this.App = {});
App.cable = ActionCable.createConsumer("/cable");
}).call(this);
I have tried to change the ActionCable config on config/production.rb to:
config.action_cable.url = [/ws:\/\/*/, /wss:\/\/*/]
config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]
but still no luck.
I have also looked into the production.log on the server and this is the error that was recorded:
WebSocket error occurred: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0
UPDATE:
Below is firewall setting on the server:
Finally I found the answer to my problem. It turns out that I do not have redis installed on my production server. So I just need to install redis and now everything works great!
To check whether you have redis installed on the server or not, use this command:
redis-cli
If the redis console appear, then you're all set. If an error/warning comes out, you can follow these steps to install and run redis:
sudo apt install redis-server
redis-server
Hope it helps!
Your configuration looks correct.
This issue can happens if you have a firewall running.
Check with your iptables configuration (linux) if something is blocking it (I don't have a specific line of code to give to you though).
If you're on Windows, check that there are no "antivirus" or "firewall" intercepting / blocking the bits. I heard that Node32 is a very good candidate to block websockets.
Update: Can you also try to connect using wss://139.59.175.34/cable instead of ws://139.59.175.34/cable ? (Be sure your NGinx is proxying with SSL). https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/

rails looking into public folder for all URLs in production mode

My rails app isn't working all of a sudden in production mode as every URL is looking into public folder rather than invoking controller actions, resulting errors like
2016/11/16 11:48:23 [error] 25138#0: *9 open() "/var/www/html/looted/public/admin/products" failed (2: No such file or directory), client: 125.99.106.246, server: www.looted.com, request: "GET /admin/products HTTP/1.1", host: "www.looted.com"
When I run it in development, everything works fine. Am running passenger on nginx server with below configuration
server {
listen 80;
server_name looted.com www.looted.com;
root /var/www/html/looted/public;
passenger_enabled on;
client_max_body_size 250M;
passenger_app_env production;
}
I am using Rails 4.2.4, ruby 2.2.1p85, passenger-5.0.29
Can anybody point me the direction to check what's wrong?
Thanks in advance

Nginx shows public directory content instead of executing Rails App

I am trying to execute my Rails Application on Nginx and Passenger but it shows the public directory content instead of executing the application.
server {
server_name 104.236.218.36;
listen 80 default_server;
root /var/www/noise/public;
passenger_enabled on;
rails_spawn_method smart;
rails_env production;
autoindex on;
}
If i remove autoindex on; i am getting the following error.
2015/02/02 06:16:06 [error] 13528#0: *3 directory index of "/var/www/noise/public/" is forbidden, client: 122.178.204.27, server: 104.236.218.36, request: "GET / HTTP/1.1", ho$
The config you show works ok for me, but maybe you have something else set wrong outside the system scope.
You could also specify the Rails app directory try adding:
passenger_app_root /var/www/noise;

Hide Headers in Passenger/Nginx Server

I am trying to hide this headers for the production server but without success :
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.7
X-Runtime: 0.021429
Server: nginx/1.0.0 + Phusion Passenger 3.0.7 (mod_rails/mod_rack)
Using :
- Rails 3.0.9
- Passenger 3.0.7
- Nginx 1.0.0
Any ideas ?
To remove nginx Server: header you could use server_tokens off directive.
For other headers try using Headers More nginx module:
more_set_headers 'Server: anon'; # replace the default 'nginx + Passenger'
more_set_headers 'X-Powered-By'; # clear header entirely
It possible to hide passenger headers, but require specific configuration. Something like this should work:
External world faced part:
upstream x {
server your-server:8040;
}
server {
server_name your-domain;
# ...
location / {
# ...
proxy_hide_header X-Powered-By;
proxy_hide_header X-Runtime;
proxy_pass http://x;
}
}
Passenger powered site:
server {
server_name local-site;
listen 8040 default_server;
location / {
passenger_enabled on;
# regular site configuration
}
}
local-site can be on same nginx with your-domain part, but this, probably, slight slow down request handling.

Nginx doesn't recognize my Rails 3 application

I have set up nginx + REE + passenger on my Linode VPS, which has been running great for past six month, both for Rails 2.3.x and Sinatra applications.
However this week I tried to add Rails 3 application to the stack, and I keep on getting 404 Not Found. Logs show that nginx doesn't recognize Rails application and is trying to serve it as static.
2010/11/29 23:44:44 [error] 12464#0: *29 "/var/app/modelky/public/index.html"
is not found (2: No such file or directory), client: 90.177.23.122, server:
reedink.com, request: "GET / HTTP/1.1", host: "reedink.com"
2010/11/29 23:44:44 [error] 12464#0: *30 open() "/var/app/modelky/public/favicon.ico"
failed (2: No such file or directory), client: 90.177.23.122,
server: reedink.com, request: "GET /favicon.ico HTTP/1.1", host: "reedink.com"
However, I'm using the same configuration as I use for all my other Rails 2.3.5 and Sinatra applications that works without any problems
server {
listen 80;
server_name www.reedink.com;
rewrite ^(.*) http://reedink.com$1 permanent;
}
server {
listen 80;
server_name reedink.com;
root /var/app/modelky/public;
passenger_enabled on;
}
From what I understand, Rails 3 should be rack compatible, so from the server's point of view, it's no different than any Sinatra application right?
I just built out a rail 3 box on linode this weekend. I started w/ this stackscript
http://www.linode.com/stackscripts/view/?StackScriptID=1288
and then went from there.
here's a copy of my server conf from the nginx.conf
server {
listen 80;
server_name localhost;
root /home/deploy/foo.bar.com/current/public;
passenger_enabled on;
}
i'd also try adding a static index.html file, get nginx working properly and then try and bootstrap the rails app.
Looks like your request is not hitting Rails. I would try to:
put a static index.html in /var/app/modelky/public to see if it shows up
check if the Rails app is in the given path and restart nginx
prestart Passenger on that server and see how it reacts
To prestart Passenger:
http {
server {
listen 80;
server_name www.reedink.com;
rewrite ^(.*) http://reedink.com$1 permanent;
}
server {
listen 80;
server_name reedink.com;
root /var/app/modelky/public;
passenger_enabled on;
}
passenger_pre_start http://reedink.com/;
}

Resources