"Apache is like Microsoft Word, it has a million options but you only need six. Nginx does those six things, and it does five of them 50 times faster than Apache." - Chris Lea
Nginx is a lightweight alternative to Apache. It does less things, but still covers 90% of the most common use cases.
When we run PHP with Apache, a typical setup is to use the PHP5 Module. This means PHP is essentially loaded and available on every request, even for static files and images! That creates some overhead for each web request.
Nginx, on the other hand, deals primarily with static files, prefering to hand-off other requests to another process. This way, Nginx doesn't have to load in PHP or know about Python or Ruby in order to handle a web request.
How, then, does Nginx hand-off a request to a dynamic application? As mentioned, it passes the request off to another process instead of handling the request itself. With PHP, for example, we would install PHP5-FPM alongside Nginx. Nginx would then hande-off any PHP request to PHP5-FPM to process and respond to. In fact, we can install any type of CGI/FastCGI process, or even another http server, to handle a request. These would then process the request and return the result for Nginx to ultimately return to a client (usually a web browser). This lets us use PHP, Python, Ruby and other languages to handle dynamic web requests.
Nginx, then, can be used as a frontman for your application. Rather than handling the request, it dispatches dynamic requests off to a process and returns the result. This gives you the ability to unburden the loading of static assets (html, images, js, css) from your web application and even lets you install Nginx on a separate server.
Futhermore, and similar to NodeJS, Nginx is evented and runs asynchronously. This helps Nginx work with (relatively) very low memory usage, ultimately also helping your server serve more requests.
Let's see how this works with a few languages.
Install Nginx
This is different per flavor of Linux you use. In general, their installation docs are good for the more popular flavors (Debign/Ubuntu and RedHat/CentOS).
For Ubuntu, which I continue to use for both ease and popularity (and thus good support/Googleablity) the install process looks like this:
# If you don't already have this:
# You may need to install python-software-properties on Ubuntu 12.04
sudo apt-get install -y software-properties-common
# Add repository of stable builds:
sudo add-apt-repository -y ppa:nginx/stable
# Update local repositories after adding nginx/stable
sudo apt-get update
# Install latest stable nginx
sudo apt-get install -y nginx
# Start nginx
sudo service nginx start
Configuring Nginx
Similar to Apache configuration, Nginx in Ubuntu uses the /etc/nginx/sites-available
and /etc/nginx/sites-enabled
directory convention. Configuration files in sites-available
can be enabled by sym-linking them to the sites-enabled
directory (and then reloaded Nginx's configuration).
These configuration files are analogous to Apache's Virtual Hosts. Let's create a basic configuration file to serve static site files. Create/edit /etc/nginx/sites-available/example.conf
:
server {
listen 80;
root /var/www;
index index.html index.htm;
# Will also reply to "localhost" results
server_name example.com;
# If root URI
location / {
try_files $uri $uri/;
}
}
This will instruct Nginx to listen on port 80 and pull files from the /var/www
directory for requests made to the example.com
domain. We also define the "index" documents to try (in order of precendence). Pretty simple!
This sets up Nginx to reply to the domain
example.com
. You may want to set it to something likeip-address.xip.io
so you can avoid editing your hosts file to makeexample.com
work. For example,192.168.33.10.xip.io
.
Here's another Nginx config file with some extra options you may want to explore and use as well.
Once you have a configuration setup, you can symlink it to Nginx's sites-enabled
directory and reload Nginx!
# Symlink available site to enabled site
$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.conf
# Reload Nginx config
$ sudo service nginx reload
Then you're site should be up and running! Be sure to check out the screencasts below for an example of this setup and some extra tricks.
Resources
Here's how to use Nginx with our favorite languages.
- With PHP, or see the screencasts below!
- With NodeJS
- With Python - Gunicorn docs
- With Ruby on Rails, or Rails with Capistrano and finally nginx+unicorn - Unicorn docs