The Nginx proxy server is an excellent addtion to the external face of any web-service. You can off-load some rewrite rules, route traffic to different back-ends and sanatise all requests before they hit the back-end.

Installation

Using either apt-get or emerge

~ # apt-get install nginx

On Gentoo there are loads of configurable modules, enable the ones you need - or all of them if you'd like. I find that these are the most useful: "http http-cache ipv6 pcre ssl" and then also add the NGINX_MODULES_HTTP to your liking. Lots to chose from here, get at least "browser charset fastcgi geo gzip proxy referer rewrite" Others you may be interested in are: "geo geoip memcached realip upload_progress"

~ # emerge -av nginx
[ebuild  N     ] dev-libs/geoip-1.6.0-r1  USE="-city ipv6 -static-libs"
[ebuild  N     ] www-servers/nginx-1.2.1  USE="-aio -debug http http-cache ipv6 -libatomic pcre -pcre-jit (-selinux) ssl -vim-syntax"
   NGINX_MODULES_HTTP="access -addition -ajp auth_basic -auth_pam -auth_request autoindex browser -cache_purge charset -dav -dav_ext -degradation -echo empty_gif fancyindex fastcgi -flv geo geoip -gunzip gzip gzip_static headers_more -image_filter limit_conn limit_req lua map memcached metrics -mogilefs mp4 -naxsi perl proxy -push_stream -random_index realip referer rewrite scgi -secure_link -security -slowfs_cache spdy split_clients ssi -sticky -stub_status -sub upload_progress -upstream_check upstream_ip_hash userid uwsgi -xslt"
   NGINX_MODULES_MAIL="-imap pop3 smtp" 702 kB

One of the first things is to isolate the user & group that Nginx runs as, we have a dedicated account for this purpose.

~ # useradd --comment 'Nginx' --shell /bin/false --home /dev/null nginx

Nginx Basics

Now lets make Nginx proxy request to our back-end Apache servers, that is - for our non-static assets. Take a look in the /etc/nginx/nginx.conf file.

We listen on the external interface, port 80 & 443 (for SSL

# Logging is for chumps :p
error_log /dev/null crit;
user nginx;
worker_processes 8;

http {
    server {
        listen       80;
        server_name  edoceo.com;

        include "rewrite.conf"

        location / {
            proxy_pass   http://127.0.0.1:80;
        }
    }
}
http {
    server {
        listen       443;
        server_name  edoceo.com;
        ssl                 on;
        ssl_certificate     /etc/ssl/server.crt;
        ssl_certificate_key /etc/ssl/server.key;

        include "rewrite.conf"

        location / {
            proxy_pass   http://127.0.0.1:80;
        }
    }
}

Adjust as necessary for your environment.

Nginx SSL Configurations

Various SSL Configuration of nginx, show certificate chains if necessary and cipher specifications.

server {
	listen       443 default_server ssl;
	server_name  edoceo.com;

	# Enable the SSL Engine (< 0.7.14)
	ssl on;
	# The certificate or file.
	ssl_certificate     /etc/ssl/server.crt;
	# A noDES key for the CRT
	ssl_certificate_key /etc/ssl/server.key;
}

You may need to create the certificate chain, in which case you cat the certificates together.

cat server.crt ca-intermediate.crt > bundle.pem
	ssl_certificate     /etc/ssl/bundle.pem;

Nginx Example Rules

Here's a few examples of tricks we do with Nginx

Serve Static Files Locally

This shows three external paths to access the CSS, and dedicated paths for the other resources.

location /c {
    root      /var/www/css;
    autoindex off;
}
location /css {
    root      /var/www/css;
    autoindex off;
}
location /d7/css {
    root      /var/www/css;
    autoindex off;
}

location /i {
    root      /var/www/images;
    autoindex off;
}
location /j {
    root      /var/www/javascript;
    autoindex off;
}

Force SSL

location ~* /admin {
    rewrite (.*) https://$host$1 permanent;
}
location ~* /user {
    rewrite (.*) https://$host$1 permanent;
}

Nginx Deployment Picture

Here's a pretty picture of how we typically deploy Nginx.

See Also