How-to install nginx

Since there is so much buzz around nginx, I wanted to give it a try on my small home server. The server is running a desktop edition of Ubuntu 10.04 (I keep it as backup machine in case my laptop breaks), so keep this in mind. The following bash script will download nginx version 1.1.12, its dependencies and install it. Also, a user nginx will be created.

# Start by creating an appropriate user
useradd -r nginx
mkdir /home/nginx
chown nginx:nginx /home/nginx/

# Retrieve nginx dependencies
cd /home/nginx
mkdir library
cd library
wget http://zlib.net/zlib-1.2.5.tar.gz
tar xfz zlib-1.2.5.tar.gz
rm zlib-1.2.5.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar xfz pcre-8.21.tar.gz
rm pcre-8.21.tar.gz
cd ..

# Installing nginx
wget http://nginx.org/download/nginx-1.1.12.tar.gz
tar xfz nginx-1.1.12.tar.gz
rm nginx-1.1.12.tar.gz
cd nginx-1.1.12
./configure --prefix=/home/nginx \
    --user=nginx \
    --group=nginx \
    --with-pcre=../library/pcre-8.21/ \
    --with-zlib=../library/zlib-1.2.5/
make
make install
cd ..
rm -rf nginx-1.1.12/
chown -R nginx:nginx *
sed -i 's/listen\s*80;/listen 8080;/g' conf/nginx.conf
export NGINX_HOME='/home/nginx/'
export NGINX_PID_FILE=$NGINX_HOME'logs/nginx.pid'

In case you encounter any problems, please refer to the short, but sufficient, official documentation. If it worked out for you, you can now use the following commands to start and stop the server as well as to reload the config.

# Start nginx (runs on port 8080)
su nginx -c $NGINX_HOME'sbin/nginx'

# Reload nginx config
kill -HUP $(cat $NGINX_PID_FILE)

# Stop nginx
kill -QUIT $(cat $NGINX_PID_FILE)

Check out the following blog if you need an init script for nginx.

Using Sass with Django

Sass is great as it adds some neat functionality to your stylesheets, e.g. nesting, mixins, variables and math. Since it is a command line tool you can execute it like

sass --watch input.scss:output.css

Having to type this command is tedious and creating a .sh or .bat script for this requires you to maintain two files.  My approach is to create a custom django-admin command watchsass for this. How this is generally done can be read on this page. The following listing shows the command which I’m using in a small project right now.

#/usr/bin/env python2.6
# Copyright 2011 Ben Ripkens
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

__authors__ = [
        '"Ben Ripkens" <bripkens.dev@gmail.com>',
]

from django.core.management.base import NoArgsCommand
import os
import time
import datetime

class Command(NoArgsCommand):
    """
    Watch for changes in the common.scss file and convert it to common.css
    using sass. Sass needs to be on the path.

http://sass-lang.com/

    """
    help = 'Convert scss to css'

    def handle_noargs(self, **options):
        scss = os.path.abspath("media/css/common.scss")
        css = os.path.abspath("media/css/common.css")

        command = "sass \"" + scss + "\":\"" + css + "\" --style compressed"

        print "Executing command '%s'" % command
        print "Sass watch parameter is not used due to some bug."

        last_update = os.stat(scss).st_mtime
        os.system(command)

        while True:
            if not last_update == os.stat(scss).st_mtime:
                os.system(command)
                last_update = os.stat(scss).st_mtime
                print "Updated stylesheet at %s" % datetime.datetime.now()
            time.sleep(0.5)

As you can see I’m not using the –watch flag. This is because its not working on my system.