Delete server header from response - ruby-on-rails

Env :- Rails 3.2 , Ruby-2.1.1p76
Server: nginx/1.8.0 + Phusion Passenger 4.0.59
X-Powered-By: Phusion Passenger 4.0.59
I want to remove these 2 headers from response. I know I can edit my nginx config and set server_tokens to off but is there any way I can handle this in codebase?

For that, There is a module named headers more. You need to compile it as dynamic/static module with Nginx.
Then you can add/remove/modify headers via following syntax in your server blocks:
Add/Edit Header:
more_set_headers "Server: Your_prefered_name";
Delete Header:
more_clear_headers "Server";

I use this two options in nginx config-file:
passenger_show_version_in_header off;
server_tokens off;
This isn't remove server-strings from headers, but at least don't show versions:
Server: nginx + Phusion Passenger
X-Powered-By: Phusion Passenger

Related

Rails + Passenger + Nginx: "404 Not Found" for second app

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.

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

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/;
}

nginx rewrite rules with Passenger

I'm trying to migrate to nginx from Apache using Passenger in both instances to host a Rails app. The app takes a request, which is for an image- if the image exists at /system/logos/$requestedimage then it should get served, or it should be allowed to hit the Rails app to generate it if needed (where it is then cached to /system/logos).
In Apache I used the following:
RewriteCond %{DOCUMENT_ROOT}/system/logos/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1
This worked fine. The assets. subdomain is another subdomain but with the same root, just Passenger disabled, specifically set up for hosting static files (expires-wise).
In nginx I am using the following:
server {
listen 80;
passenger_enabled on;
server_name clg.eve-metrics.com www.clg.eve-metrics.com;
root /opt/www/clg/current/public;
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml text/css application/javascript;
gzip_disable msie6;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
if (-f $document_root/system/logos$request_filename) {
rewrite ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 break;
}
}
This doesn't work so well. At all, in fact. It never redirects to the cached path and it never hits the Rails app. It's like nginx is assuming it's a static asset so not passing it on to Passenger. Is there a way to stop this behaviour so it hits the app?
My rails application is running on nginx and passenger. I have moved my rails cache directory from the default /public to /public/system/cache/. To make it work, I had to insert this into my vhost config file:
if (-f $document_root/system/cache/$uri/index.html) {
rewrite (.*) /system/cache/$1/index.html break;
}
if (-f $document_root/system/cache/$uri.html) {
rewrite (.*) /system/cache/$1.html break;
}
I remember that I too tried to make it work with $request_filename, but didn't get it to work. Try with $uri instead and see if it works :-)
James, please try this configuration file
https://gist.github.com/711913
and pay attention on this location config:
location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {
access_log off;
expires max;
add_header Cache-Control public;
}
passenger won't let Rails to manage your assets files if you have right permissions (user run nginx should has permissions to access to file directly)

Resources