Installing Passenger + Nginx on an AWS production server
for Ruby apps + generic installation through RubyGems (with RVM)

This page describes the installation of Passenger through the following operating system or installation method: generic installation through RubyGems (with RVM). Not the configuration you are looking for? Go back to the operating system / installation method selection menu.

On this page, we will install Passenger. After installing Passenger we can begin with deploying the app.

Table of contents

  • Loading...

Before you begin: a note about Nginx

Before you begin, you should know that installing Passenger in its Nginx integration mode involves extending Nginx with code from Passenger. However, Nginx does not support loadable modules. This means that in order to install Passenger's Nginx integration mode, it is necessary to recompile Nginx from source. And that is exactly what we will do in this installation guide.

The fact that Nginx needs to be recompiled, has some implications:

  • Many users installed Nginx using their operating system's package manager (yum, apt-get, etc). This Nginx is usually located in /usr/sbin/nginx, with configuration file /etc/nginx/nginx.conf. However, if you install Nginx from source, then you will end up with another Nginx installation (that has Passenger enabled) that is located somewhere else. This other Nginx installation does not look for its /etc/nginx/nginx.conf, but somewhere else.

    Some people get confused by having two Nginx installations and end up editing the wrong config file. To avoid confusion, this guide will recommend you to uninstall the OS-installed Nginx before proceeding.

  • Init scripts, e.g. /etc/init.d/nginx and service nginx restart, are not provided by the default Nginx source code. Init scripts are actually extensions provided by the operating system's Nginx package. If you install Nginx from source, then you can't use init scripts to control Nginx anymore. Instead, you will use more generic operating system primitives to control Nginx, such as PID files and signals. Don't worry, this installation guide will teach you.

If you do not like having to recompile Nginx then there are several alternatives you can choose:

  1. Use the Phusion Passenger APT repository (for Debian, Ubuntu) or the YUM repository (RPMs for Red Hat, CentOS) to install Passenger and Nginx. Through our APT/YUM repository, we provide a Passenger-enabled Nginx package that uses the same structure as the Nginx package provided by the OS. This means that you will be able to use the service script, your config files are at places where you expect them, etc.
  2. Consider using Passenger Standalone in a reverse proxy configuration to Nginx. Passenger Standalone + reverse proxy is fully supported and supports the same features as Passenger's Nginx integration mode.

If you understand this and choose to use Passenger with its Nginx integration mode, then read on. :-)

Installation

Step 1: install gem

Install the Passenger gem with:

$ gem install passenger --no-rdoc --no-ri

The --no-rdoc --no-ri argument isn't really necessary, but it makes installation faster by skipping generation of API documentation.

Did gem install abort with a "permission denied" error? Then re-run it with rvmsudo.

Since you are using RVM, don't use sudo! Always use rvmsudo instead when executing Ruby-related commands! Learn more about rvmsudo at the RVM website.

Step 2 (optional): uninstall the OS-installed Nginx

As explained earlier in the introductory notes, you are about to install a new Nginx installation from source. If you already installed Nginx before, using the operating system's package manager, then we recommend that you uninstall that in order to avoid possible confusion caused by having multiple parallel Nginx installations. Of course, you don't have to remove the OS-installed version as long as you know what you're doing.

Here are some examples of how you can uninstall the OS-installed version:

Debian, Ubuntu
sudo apt-get purge nginx nginx-full nginx-light nginx-naxsi nginx-common
sudo rm -rf /etc/nginx
Red Hat, CentOS, Fedora, Scientific Linux, Amazon Linux
sudo yum remove nginx
sudo rm -rf /etc/nginx

Step 3: run the Passenger Nginx module installer

Run the Passenger Nginx module installer and follow the on-screen instructions:

$ passenger-install-nginx-module

Step 4: validate installation

After installation, please validate the install by running rvmsudo passenger-config validate-install. For example:

$ rvmsudo passenger-config validate-install
 * Checking whether this Phusion Passenger install is in PATH... ✓
 * Checking whether there are no other Phusion Passenger installations... ✓

All checks should pass. If any of the checks do not pass, please follow the suggestions on screen.

Finally, check whether Nginx has started the Passenger core processes. Run rvmsudo passenger-memory-stats. You should see Nginx processes as well as Passenger processes. For example:

$ rvmsudo passenger-memory-stats
Version: 5.0.8
Date   : 2015-05-28 08:46:20 +0200
...

---------- Nginx processes ----------
PID    PPID   VMSize   Private  Name
-------------------------------------
12443  4814   60.8 MB  0.2 MB   nginx: master process /usr/sbin/nginx
12538  12443  64.9 MB  5.0 MB   nginx: worker process
### Processes: 3
### Total private dirty RSS: 5.56 MB

----- Passenger processes ------
PID    VMSize    Private   Name
--------------------------------
12517  83.2 MB   0.6 MB    PassengerAgent watchdog
12520  266.0 MB  3.4 MB    PassengerAgent server
12531  149.5 MB  1.4 MB    PassengerAgent logger
...

If you do not see any Nginx processes or Passenger processes, then you probably have some kind of installation problem or configuration problem. Please refer to the troubleshooting guide.

Using Nginx

As explained earlier in the introductory notes, you can't use an init script like /etc/init.d/nginx or service nginx restart. This section teaches you how to control and how to work with the Nginx you installed.

Remember that at some point, passenger-install-nginx-module asked you where to install Nginx to, and asked you for a "prefix", right? The prefix is the directory in which this new Nginx is installed. By default, the installer picks the directory /opt/nginx. In this section we will assume that you installed to the default prefix directory. If you specified a different prefix, simply substitute /opt/nginx with the actual directory.

File locations

Nginx's configuration files are then located in /opt/nginx/conf. Its log files are located in /opt/nginx/logs.

Starting Nginx

You can start Nginx by running:

$ sudo /opt/nginx/sbin/nginx

Shutting down Nginx

You can shut down Nginx by killing its PID with the kill command. To find out what Nginx's PID is, use the ps command. For example:

$ ps auxw | grep nginx
root     25817  0.0  0.1  43248  1172 ?        S    Jan01   0:00 nginx: master process /opt/nginx/sbin/nginx
www-data 25818  0.0  0.3  44240  3484 ?        S    Jan01   0:02 nginx: worker process

Here we see that the Nginx master process has PID 25817 (you can ignore the worker process), so we run:

$ sudo kill 25817

Having to perform two steps is a bit cumbersome. Luckily, there is an easier way to do this. By default, Nginx creates a PID file in /opt/nginx/logs/nginx.pid. This PID file contains Nginx's current PID. So we can use a single command to shutdown Nginx:

$ sudo kill $(cat /opt/nginx/logs/nginx.pid)

Restarting Nginx

Restarting Nginx is the same as shutting down Nginx, and starting it again. For example:

$ sudo kill $(cat /opt/nginx/logs/nginx.pid)
$ sudo /opt/nginx/sbin/nginx

FAQ

I have multiple Ruby versions or gemsets. Does it matter which one I use to install Passenger with?

Not really. Passenger doesn't care which Ruby you used to install it; it can still serve Ruby apps with any Ruby version, as long as you tell Passenger which Ruby interpreter you want to use.

You tell Passenger which Ruby interpreter to use for a specific app, by using the passenger_ruby directive. This can be customized on a per-application basis.

Please also read How having multiple Ruby interpreters affects Passenger. In particular, read the RVM-related caveats.

How do I install Nginx with additional modules?

You can install Passenger as a normal Nginx module.

The installer is interactive. How do I install in an automated, non-interactive manner?

Please refer to Non-interactive, automatic, headless installs or upgrades.

Some of the dependent libraries are installed in non-standard locations. How do I allow the compiler to find them?

Please refer to Customizing the compilation process.

How do I pass additional flags to the compiler?

Please refer to Customizing the compilation process.

Next step

Now that you have installed Passenger, you are ready to deploy your Ruby application on the production server!

Continue: Deploy app »