What is localhost and where is it defined? - ruby-on-rails

I just changed from thin to puma at the recommendation of Heroku. When I start my rails app using the puma server it responds:
=> Booting Puma
=> Rails 4.2.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Puma 2.11.3 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:3000
However if I go to http://0.0.0.0:3000 in the browser, which was my old localhost with the thin server, it does not respond. However, if I open http://localhost:3000, then it works. It appears that the definition of localhost has changed.
So, what is localhost? In particular, what sort of object is it, how is it defined, how do I see the actual ip address, and why does puma change it?

If you're trying to get Rails to bind to a different ip, the way to do that is with the -b option. To bind it to 0.0.0.0 instead of the Rails-default localhost you'd want to run something along the lines of rails s -b 0.0.0.0
Note: To be explicit, it may not be a bad idea to throw the -p 3000 option in there too (sets the port), even though that default is not likely to change. More info on the available options can be found by running rails s -h as well.

Localhost is the IPv4 loopback IP address 127.0.0.1. It is used instead of the hostname of a computer. Localhost can sometimes mean this computer.
For example, directing a web browser installed on a system running an HTTP server to http://localhost will display the home page of the local website.
Here's an interesting Wikipedia article
https://en.wikipedia.org/wiki/Localhost

Related

Multiple concurrent rails servers with binding

I have a rails staging server available to my LAN as follows:
rails server --binding=0.0.0.0 -p 3000
I would now like to open up a second, concurrent rails server to my LAN as follows:
rails server --binding=0.0.0.0 -p 3001
Unfortunatly, I am getting this error message:
...
=> Booting Puma
=> Rails 5.1.1 application starting in development on http://0.0.0.0:3001
=> Run `rails server -h` for more startup options
A server is already running. ...
The error only exists if I use --binding=0.0.0.0 on both servers, which is necessary if I want it to be accessible to my LAN.
How can I open up multiple rails servers on the same machine to the LAN, not just localhost?
EDIT:
After trying Vasfed's solution, e.g.
rails server --binding=0.0.0.0 -p 3000 --pid=tmp/pids/server0.pid
rails server --binding=0.0.0.0 -p 3001 --pid=tmp/pids/server1.pid
the problem persists, but this time I have more information. It seems related to a port 9292 being opened...
=> Booting Puma
=> Rails 5.1.1 application starting in development on http://0.0.0.0:3001
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:9292
Exiting
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:269:in `initialize': Only one usage of each socket address (protocol/network address/port) is normally permitted. - bind(2) for "0.0.0.0" port 9292 (Errno::EADDRINUSE)
Rails checks if a pid file is already present. To run two copies of single app, you should alter pids too:
rails server --binding=0.0.0.0 -p 3000 --pid=tmp/pids/server1.pid
rails server --binding=0.0.0.0 -p 3001 --pid=tmp/pids/server2.pid

can not access local rails server

I build up a rails app in mac OS and try to use other device (in same private lan) to connect to this local service. However my device can not access to this url => "http://192.168.1.107:3000"
My console is below:
chris$ rails server --binding=192.168.1.107
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://192.168.1.107:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
It works fine in local machine both "http://localhost:3000" and "http://192.168.1.107:3000" but other device still can not access "http://192.168.1.107:3000"
Any suggestion for that? thanks a lot!
Try this:
rails server -b 0.0.0.0 -p 3000
If firewall blocks 3000 try this:
rails server -b 0.0.0.0 -p 80
Now access [your-computer-ip]:80
You could also use a service like https://localtunnel.me/ (if you are not on the same local domain)

When starting rails server "Uncaught exception: no acceptor (port is in use or requires root privileges)"

I Updated the output to make it more readable. Still getting this error.
Noob question. Has anyone else seen this error? This error seems to be spreading. It now happens for port 3000 and 3001. If I change the code and debug settings to 3002 then I can continue debugging.
--------------------------------------------------------------
-------------------------------------------------------------
$: rails s -p 3000
=> Booting Thin
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Thin web server (v1.6.4 codename Gob Bluth)
Maximum connections set to 1024
Listening on 0.0.0.0:3000, CTRL+C to stop
Exiting
/home/xxx/.rvm/gems/ruby-1.9.3-p551#ats/gems/eventmachine-1.0.8/lib/eventmachine.rb:534:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
run
ps ax | grep rails
this will return the process number of the rails server currently running
then you can do
kill -9 *process_numer*
this answer assumes that you accidentally quit rails server by pressing Ctrl+Z instead of Ctrl+C which did no dispose of the process properly and is now tying up the port.
This error occurs when some process is already using that port.
Usually this happens when rails server is already started (for example - for other project, and you forgot to stop it)
Use ps ax | grep rails | grep -v grep and lsof -n -i4TCP:3000 | grep LISTEN to find rails servers and processes using port 3000

Rails app can't connect to private_pub on Vagrant

I have a rails app that uses private_pub. Somehow I can't get my app to connect to private_pub.
Is there a way to bind private_pub to 0.0.0.0?
Run rails server
vagrant#vagrant:/vagrant$ rails s -b 0.0.0.0
=> Booting Thin
=> Rails 4.2.2 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on 0.0.0.0:3000, CTRL+C to stop
Start private_pub
vagrant#vagrant:/vagrant$ rackup private_pub.ru -s thin -E production
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on localhost:9292, CTRL+C to stop
Chrome console log
http://localhost:9292/faye/faye.js net::ERR_EMPTY_RESPONSE
Yes, there is a way, it's documented feature. From docs:
server: The URL to use for the Faye server such as http://localhost:9292/faye.
so you can configure your config/private_pub.yml for the environment you need like this:
development:
server: "http://0.0.0.0:9292/faye"
secret_token: "secret"
Then start a server with:
thin -C config/private_pub.yml -p 9292 start
Using rack adapter
Thin web server (v1.6.4 codename Gob Bluth)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop
I actually don't know why it doesn't catch the port number(I opened the issue in github), so I specified it explicitly.
Second option is to set a host for rackup command(since in this way it doesn't properly handle the address):
rackup private_pub.ru -s thin -E production -o 0.0.0.0
Thin web server (v1.6.4 codename Gob Bluth)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to sto
You can also specify explicitly both the address and the port for thin(as well as for rackup) and omit config file at all(probably not a good idea since there are secret_token and signature_expiration options in config file which should be set):
thin -a 0.0.0.0 -p 9292 start
Using rack adapter
Thin web server (v1.6.4 codename Gob Bluth)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop

Production mode is not running on port 80 (Rails)

I don't understand why it's not running on port 80 instead of port 3000 when I run the command RAILS_ENV=production rails s on the same line. I want it to run in production mode but it's not running on the correct port. Anyone know why? I'm trying to use Rubber but I haven't ran any commands for it only just changed some of the files like it says in this tutorial.
root#ip-000-00-00-000:/home/ubuntu/Git/# RAILS_ENV=production rails s
=> Booting Thin
=> Rails 3.2.11 application starting in production on \http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
\>> Thin web server (v1.5.1 codename Straight Razor)
\>> Maximum connections set to 1024
\>> Listening on 0.0.0.0:3000, CTRL+C to stop
^C>> Stopping ...
Exiting
webrick runs on port 3000 by default(even in production mode). Pass the port number explicitly if you want to run on a different port.

Resources