To Install Nginx

sudo apt-get install nginx

Setting up Virtual Hosts

Nginx, like Apache, supports name-based virtual hosting, where the sites are hosted according to their (sub)domain name.

Setting up a Standard Virtual Host

The default nginx config works well for a standard Virtual Host.

Lets take a look.

server {
     
            #replace <your_ip_here> with your ip address.
            #Otherwise, to listen on all interfaces on port 80 with IPv4,
            #remove '<your_ip_here>:'
            listen   <your_ip_here>:80; ## listen for ipv4; this line is default and implied
            #listen   [::]:80 default ipv6only=on; ## listen for ipv6.
     
            #location of your files, replace /srv with the location of the files that you want to serve
            root /srv;
            #The index files. If you want, you can add others such as index.php, index.cgi, .etc .etc
            index index.html index.htm;
     
            # The name of your domain (virtual hosts). Change 'localhost' to the domain that you are hosting
            server_name localhost;
     
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to a 404 error
                    try_files $uri $uri/ =404;
                    # uncomment the line below to enable directory indexes
                    # NOT recommended unless you know what you're doing.
                    #autoindex on;
            }
     
            #error_page 404 /404.html;
     
            # redirect server error pages to the static page /50x.html
            #
            #error_page 500 502 503 504 /50x.html;
            #location = /50x.html {
            #       root /usr/share/nginx/www;
            #}
     
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #       fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            #
            #        # With php5-cgi alone:
            #       fastcgi_pass 127.0.0.1:9000;
                    # With php5-fpm:
            #       fastcgi_pass unix:/var/run/php5-fpm.sock;
            #       fastcgi_index index.php;
            #        include fastcgi_params;
            #}
     
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            location ~ /\.ht {
                    deny all;
            }
    }

Following the commented instructions above; setting the ip address, the default directory, and your domain, you can create your own virtual host.

Afterwords, simply save the file in

/etc/nginx/sites-enabled

and reload the nginx configuration with

sudo service nginx reload

Setting up a Virtual Host with SSL

The default SSL Virtual Host looks something like the below.

# HTTPS server
#
server {
        #If you want to listen to a particular ip address, use the format
        # listen <ipaddresshere>:443 
        #instead.
        listen 443 ssl;
        #Set the domain that you are serving.
        server_name localhost;

        root html;
        #set the files you want to use as an index if necessary.
        index index.html index.htm;

        #Change ssl_certificate and ssl_certificate_key to point towards your SSL Certificate and your SSL key, respectively.
        ssl_certificate cert.pem;
        ssl_certificate_key cert.key;

        ssl_session_timeout 5m;

        # Starting in Ubuntu 15.04 and later, the ssl_protocols and ssl_prefer_server_ciphers commands
        # are unnecessary, if you are using the default-shipped configuration file for the nginx
        # process (/etc/ngnix/nginx.conf)
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
                try_files $uri $uri/ =404;
        }
}

Simply change the domain name, the path leading to the ssl certificate/key, and place it into /etc/nginx/sites-enabled. Be sure to read the commented instructions as well, if they apply to you.

Setting up a passthrough Virtual Host

Passthrough virtual hosts can be useful for serving other web applications that do not reside on port 80.

The virtual host is simple, but extremely configurable.

server {
   #change to
   # listen ip_address:80
   # if you want to listen on a specific ip address
   listen 80;
   #change the server_name to the domain you are virtualhosting.
   server_name localhost;

   location / {
       proxy_pass  http://passthrough-url;
   }
}

Edit the passthrough-url, and save in /etc/nginx/sites-enabled.

Setting up Nginx Backends

Nginx with PHP

Nginx uses a fastcgi backend to communicate with fastcgi servers. Therefore, we install the php5 FPM server for nginx to pass php files onto.

sudo apt-get install php5-fpm

The default nginx configuration that comes with Ubuntu already contains the configuration for php-fpm. Simply remove the comments on the php block so that

            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #       fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            #
            #        # With php5-cgi alone:
            #       fastcgi_pass 127.0.0.1:9000;
                    # With php5-fpm:
            #       fastcgi_pass unix:/var/run/php5-fpm.sock;
            #       fastcgi_index index.php;
            #        include fastcgi_params;
            #}

looks like

            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            #
            #        # With php5-cgi alone:
            #       fastcgi_pass 127.0.0.1:9000;
                    # With php5-fpm:
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
            }

Afterwords, reload the nginx configuration

sudo service nginx reload

Nginx Operations

Just like Apache, nginx has a set of operations. These can be set in the main server block, or any of the location blocks (explained below)

Some common options:

  1. allow allows a set of ip addresses with  allow list_of_ip_addresses_seperated_by_commas;  , and  allow all;  allows all ip addresses. All locations are set to  allow all;  by default.

  2. deny denies a set of ip addresses with  deny list_of_ip_addresses_seperated_by_commas;  , and  deny all;  denies all ip addresses. Deny can be used in conjunction with allow to allow only certain ip addresses. i.e.

    allow 192.168.1.1;
    deny all;
    That would only allow the ip 192.168.1.1 to access the location. This can be done in cidr notation as well.
  3. autoindex controls whether a directory is indexed or not. By default, this is set to off. It can be turned on with  autoindex on; 

  4. access_log and error_log allow for logging server access and errors, respectively. The access_log can be set using

    log_format gzip '$remote_addr - $remote_user [$time_local]  '
                    '"$request" $status $bytes_sent '
                    '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    access_log /path/to/log/file gzip buffer=32k; 

    The error_log can be set using

    error_log /path/to/log/file [notice | warn | error | crit | alert |emerg];

Nginx (last edited 2015-02-13 15:21:06 by teward)