Phusion Passenger is a free web server and application server with support for Ruby, Python and Node.js. It is designed to integrate into the Apache HTTP Server or the nginx web server, but also has a mode for running standalone without an external web server.
Phusion Passenger supports Unix-like operating systems, and is available as a gem package, as a tarball, or as native Linux packages.
Passenger and “rails server”
The Ruby on Rails framework provides a built-in server tool, which can be accessed with the ‘rails server‘ command. The “rails server” is not an application server by itself, but just a small wrapper that launches your application in an application server. This is why people do not use “rails server” in production. They use an application server such as Passenger directly.
Passenger is an open source web application server. It handles HTTP requests, manages processes and resources, and enables administration, monitoring and problem diagnosis.
Passenger is very easy to use, makes deploying in production much easier and is scalable.
How Passenger fits in the stack
When you deploy your web app to production, there are all sorts of components involved. You may have heard of Unicorn, Puma, Nginx, Apache, and Capistrano. Passenger replaces some components while collaborating with other components.
In a typical production stack, Nginx or Apache is used as the web server, Passenger as application server, and Capistrano as release automation tool. Passenger integrates with Nginx or Apache and manages the application and its resources.
Passenger protects your web apps from various malicious attacks like slow client attacks, common HTTP parser exploits, and privilege escalations.
A tool is only as good as its users are able to wield it. Passenger comes with world-class documentation to allow you to fully leverage its features.
Passenger was built with high performance and efficiency in mind. With Passenger’s zero-copy architecture, turbocaching and support for multiple concurrency models, you can count on Passenger to get the most out of your hardware.
Passenger auto-manages your apps’ processes, restarting them and itself if they ever crash. Passenger also keeps resource hogging apps in check, giving your web app maximum uptime.
Passenger was battle-tested with some of the most demanding web apps for over a decade. This makes it one of the toughest app servers to date, currently powering over 650,000 web apps.
Deploy your Ruby, Node.js, Meteor and/or Python apps from one Passenger instance in seconds. You need not fiddle around with multiple app servers and proxies anymore.
Passenger prints its own logs not only to the terminal but also to a log file. During startup, Passenger tells you what log file it used. This is typically log/passenger.XXXX.log.
There are also the application logs, such as log/development.log and log/production.log. These logs are completely separate from Passenger’s own logs. If you use Rails, then Passenger will also print your application logs to the terminal, but it will not print them into Passenger’s log file.
Nginx and Apache
Nginx and Apache are web servers that enables HTTP transaction handling and serve static files. However, they are not Ruby application servers and cannot run Ruby applications directly. That is why Nginx and Apache are used in combination with an application server, such as Passenger.
Application servers make it possible for Ruby apps to speak HTTP. Ruby apps (and frameworks like Rails) can’t do that by themselves. On the other hand, application servers typically aren’t as good as Nginx and Apache at handling HTTP requests. Nginx and Apache are better at handling HTTP concurrency management, I/O security, connection timeouts, etc. It is due to this reason that application servers are used in combination with Nginx or Apache in production environments.