Installing Passenger + Nginx on a Linux/Unix production server
for Python apps + generic installation through source tarball

This page describes the installation of Passenger through the following operating system or installation method: generic installation through source tarball. 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: download and extract tarball

Download the latest Passenger source tarball.

Download tarball

Extract the tarball to some place permanent. Replace X.X.X with the Passenger version, and /somewhere-permanent with the actual directory path that you want to extract to. /opt is usually a good directory.

$ tar -xzvf passenger-X.X.X.tar.gz -C /somewhere-permanent

Step 2: install Ruby

Passenger supports multiple languages and its core is written in C++, but its installer and administration tools are written in Ruby, so you must install Ruby.

Even though Ruby is required, Ruby will normally not be loaded during normal operation unless you deploy a Ruby web application on Passenger. Passenger's dependency on Ruby is very minimal. See Lightweight Ruby dependency for details.

Debian, Ubuntu
sudo apt-get update
sudo apt-get install -y ruby rake
Red Hat, CentOS, Fedora, ScientificLinux, Amazon Linux Enable EPEL, then run as root:
yum install -y ruby rubygem-rake
Arch Linux
sudo pacman -S ruby
macOS No action needed. Ruby is installed by default.
Other operating systems Install Ruby from the Ruby website.

Step 3 (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 4: add Passenger to PATH

Add the Passenger bin directory to your PATH, so that your shell can locate the Passenger commands.

Open your shell's system-wide startup file. If you're using bash, this is usually /etc/bashrc or /etc/bash.bashrc. Inside that file, add this to the end:

PATH=/somewhere-permanent/passenger-X.X.X/bin:$PATH
export PATH

Again, replace X.X.X with the Passenger version, and /somewhere-permanent with the actual directory path.

When you're done, restart all your shells so that your new PATH takes effect.

Make sure your bashrc is actually included by your bash profile, which might not be the case if you created the user with useradd instead of adduser for example.

Step 5: run the Passenger Nginx module installer

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

$ passenger-install-nginx-module

Step 6: validate installation

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

$ sudo 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 sudo passenger-memory-stats. You should see Nginx processes as well as Passenger processes. For example:

$ sudo 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

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 Python application on the production server!

Continue: Deploy app »