how to setup pinax with nginx

Tonight I spent sometime getting PinaxDjango swiss army knife – to work on nginx via fastcgi on my Ubuntu 9.10 box. Here is a step by step guide.

First of course we need to install nginx, pretty easy with Ubuntu:

sudo apt-get install nginx

Create a new file called <appname> in /etc/nginx/sites-available/ like the following:

upstream djangoserv {
    server 127.0.0.1:8801;
}

server {
    listen   80;
    server_name  alkemic;

    access_log  /var/log/nginx/appname.access.log;

    location ^~ /site_media/  {
       alias /home/nick/dev/projects/pinax07/appname/site_media/;
       autoindex on;
    }
    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc \
        |xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)   {
        #access_log   off;
        expires      30d;
    }

    location / {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:8801;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param SERVER_NAME $server_name;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_PROTOCOL $server_protocol;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_pass_header Authorization;
        fastcgi_intercept_errors off;
    }
}

Link it to sites-enabled so that we know it’s going to be started up (meanwhile you want to remove the default one):

sudo ln -s /etc/nginx/sites-available/appname /etc/nginx/sites-enabled/

Startup nginx with:

sudo /etc/init.d/nginx start

Activate your pinax installation (change the path to where you have installed your Pinax virtual environment):

source /home/nick/dev/projects/pinax07/bin/activate

Install flup (required to have manage.py run as fastcgi) in your virtual env:

pip install flup

Symlink all the static assets into the site_media folder:

css -> /home/nick/dev/projects/pinax07/appname/media/css/
img -> /home/nick/dev/projects/pinax07/appname/media/img
js -> /home/nick/dev/projects/pinax07/appname/media/js
pinax -> ../../lib/python2.6/site-packages/pinax/media/default/pinax/
snd -> /home/nick/dev/projects/pinax07/appname/media/snd
swf -> /home/nick/dev/projects/pinax07/appname/media/swf

Launch the python fastcgi process:

 python ./manage.py runfcgi method=threaded host=127.0.0.1 port=8801

Or:

python ./manage.py runfcgi method=prefork host=127.0.0.1 port=8801

Note that you might need to move your development environment to use a proper db like MySQL because otherwise the app will have problems finding your sqlite db file.

You should have now your app running on the blazing fast nginx.

8 Responses to “how to setup pinax with nginx”
  1. Pedro Assuncao 7 October 2009 at 6:09 am #

    This means you basically ditch apache to serve anything, right? Is nginx more efficient (or at least as much as apache) in terms of serving stuff?

  2. nick 7 October 2009 at 8:41 am #

    There are tons of possible setups. Some involve still using Apache and mod_wsgi to serve Django requests. Some don’t. I wanted to try a full setup without Apache so that’s what the configuration is about. You’re free to experiment :D Here is a step by step guide keeping Apache around.

  3. John Spounias 4 July 2010 at 6:00 pm #

    What is the memory usage you are getting for the entire stack? I wonder if nginx serves the static media directly or does it get parsed by fastcgi first, and if so could you configure nginx to directly serve the static media. Anything that cuts pinax heavy memory demand on any kind of host is awesome.

  4. John Spounias 4 July 2010 at 6:02 pm #

    Oh and one last thing, I personally, would not call MySQL “proper db”. I would go with PostgreSQL :D

  5. MechanisM 29 September 2010 at 11:40 am #

    “python ./manage.py runfcgi method=threaded host=127.0.0.1 port=8801″
    HOW TO STOP IT?
    I’ve changed config at settings.py but process still running..

  6. MechanisM 30 September 2010 at 8:30 pm #

    “python ./manage.py runfcgi method=threaded host=127.0.0.1 port=8801

    Or:

    python ./manage.py runfcgi method=prefork host=127.0.0.1 port=8801″

    I can start this process via ssh..but when I close ssh client process ends.. how to strat it from server side?

  7. MechanisM 27 October 2010 at 4:24 pm #

    One more issue:
    Pinax need to know if its running under proxy:
    add BEHIND_PROXY = True in settings.py

    and nginx must send real addres of client:
    fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for;

Trackbacks/Pingbacks

  1. Tweets that mention how to setup pinax with nginx — be present now -- Topsy.com - 31 October 2009

    [...] This post was mentioned on Twitter by robataka, robataka. robataka said: Gnolia Link how to setup pinax with nginx — be present now: Saved By: robataka | View Detail.. http://bit.ly/12HtwY [...]

Leave a Reply