Django FastCGI

このfastcgiをスクリプトを使って管理する必要があります。

ポートの構成を確認せずに新しいサイトを追加する柔軟性が必要な場合は、ソケットの解決が優れていると思われます。

以下のようにサイトが構成されていると仮定します:

sites/
    site1/
        manage.py
        settings.py
        __init__.py
        app1/
        app2/
        media/
    site2/
        ...

そして、RUNFILES_PATH フォルダの中に(上のリンクの中のスクリプトのように) pid(およびソケット)ファイルを置きます。

NGINX 設定

この設定をnginx.confファイル(あるいは、"include"命令を使いたい場合はsites-{available/enabled}/ conf file)に置きます。NGINXのubuntuリポジトリバージョン(/etc/init.d/NGINX stop|start|restartを提供します)を使って、Ubuntu Karmicからデフォルトの設定を使ってすぐに動作することができました。

# inside a http section
# replace the several paths and names
server {
    listen   80;
    server_name  {server name};

    access_log  {path to log file};

    location /media {
        root   {path to sites}/siteYY/;
        # I use a symbolic link called "admin" in the media/ folder
        # (pointing to /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media/ in my case)
        # as suggested in http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#serving-the-admin-files
        # so that nginx serves the django admin media files with the parameter
        # ADMIN_MEDIA_PREFIX set to '/media/admin/' in settings.py
    }

    location / {
        fastcgi_pass unix:RUNFILES_PATH/siteYY.socket;
        # for a TCP host/port:
        # fastcgi_pass   {hostname}:{port};

        # necessary parameter
        fastcgi_param PATH_INFO $fastcgi_script_name;

        # to deal with POST requests
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;

        # http://stackoverflow.com/questions/605173/how-to-nginx-virtual-servers-fcgi-for-django uses many other parameters,
        # some may be necessary in some situations
    }
}

同じサイトのデバッグとprodバージョンを同時に提供する

通常の settings.pyと同じフォルダ内で (DEBUG をFalseに設定して)、以下のsettings_debug.py ファイルを作成します:

DEBUG = True

別のソケットあるいはポートで、追加パラメータ settings=siteYY.settings_debug を使用して、siteYYフォルダから別の“manage.py runfcgi” を起動し、別のvirtualhostを作成することができます (Server ブロックの例を見てください)。

Django through Spawning

必要条件

SpawningPasteDeployが必要でしょう。easy_installを使ってそれらの両方をインストールすることができます。

サイトが以下のように構成される場合は:

sites/
    site1/
        manage.py
        settings.py
        __init__.py
        app1/
        app2/
        media/
    site2/
        ...

"sites"フォルダから:

$ sudo spawn --factory=spawning.django_factory.config_factory siteYY.settings --port={PORT NUMBER}

NGINX 設定

spawnで定義されたポートへのプロキシとして設定します。

location ディレクティブは以下の通りです (残りの部分は manage.py runfcgi Djangoセクションと同じです):

location / {
    proxy_pass http://0.0.0.0:{PORT NUMBER};
    # http://127.0.0.1:{PORT NUMBER} or http://localhost:{PORT NUMBER} should work as well, choose the one you prefer
    proxy_redirect default;

    # various possible options
    # proxy_set_header X-Forwarded-Host $server_name;
    # proxy_set_header X-Real-IP $remote_addr;
    # proxy_set_header X-Forwarded-For $remote_addr;
}

RHEL4 での Django + FastCGI + NGINX

NGINXのインストール

$ wget http://altruistic.lbl.gov/mirrors/centos/4.4/os/i386/CentOS/RPMS/pcre-4.5-3.2.RHEL4.i386.rpm
$ wget http://altruistic.lbl.gov/mirrors/centos/4.4/os/i386/CentOS/RPMS/pcre-devel-4.5-3.2.RHEL4.i386.rpm
$ sudo rpm -Uvh pcre-4.5-3.2.RHEL4.i386.rpm pcre-devel-4.5-3.2.RHEL4.i386.rpm
$ wget http://sysoev.ru/nginx/nginx-0.5.17.tar.gz
$ tar xvzf nginx-0.5.17.tar.gz
$ cd nginx-0.5.17
$ ./configure --sbin-path=/usr/local/bin/nginx  --pid-path=/usr/local/nginx/nginx.pid  \
  --conf-path=/usr/local/nginx/nginx.conf  --with-http_ssl_module --with-cc-opt="-I /usr/include/pcre"
$ make
$ sudo make install

NGINX 設定

この例はあまりにも複雑で整理される必要があります。

# search and replace this: {project_location}

pid {project_location}/log/nginx.pid;
worker_processes  2;
error_log {project_location}/log/error_log;

events {
  worker_connections  1024;
  use epoll;
}

http {
  # default nginx location
  include        /usr/local/nginx/mime.types;
  default_type    application/octet-stream;
  log_format main
      '$remote_addr - $remote_user [$time_local] '
      '"$request" $status $bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '"$gzip_ratio"';

  client_header_timeout  3m;
  client_body_timeout    3m;
  send_timeout           3m;
  connection_pool_size        256;
  client_header_buffer_size    1k;
  large_client_header_buffers    4 2k;
  request_pool_size        4k;
  output_buffers   4 32k;
  postpone_output  1460;
  sendfile        on;
  tcp_nopush             on;
  keepalive_timeout      75 20;
  tcp_nodelay            on;

  client_max_body_size       10m;
  client_body_buffer_size    256k;
  proxy_connect_timeout      90;
  proxy_send_timeout         90;
  proxy_read_timeout         90;
  client_body_temp_path      {project_location}/log/client_body_temp;
  proxy_temp_path            {project_location}/log/proxy_temp;
  fastcgi_temp_path            {project_location}/log/fastcgi_temp;

  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 32k;
  gzip_types       text/plain text/html application/x-javascript text/xml text/css;

  ignore_invalid_headers    on;

  server {
    listen 8000;
    server_name localhost;
    index index.html;
    root   {project_location}/public;
    # static resources

    location ~* ^.+\.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
    {
      expires 30d;
      break;
    }

    location / {
      # host and port to fastcgi server
      fastcgi_pass unix:{project_location}/log/django.sock;
      fastcgi_param PATH_INFO $fastcgi_script_name;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass_header Authorization;
      fastcgi_intercept_errors off;
    }

    location /403.html {
      root   /usr/local/nginx;
      access_log   off;
    }

    location /401.html {
      root   /usr/local/nginx;
      access_log   off;
    }

    location /404.html {
      root   /usr/local/nginx;
      access_log   off;
    }

    location = /_.gif {
      empty_gif;
      access_log   off;
    }

    access_log    {project_location}/log/localhost.access_log main;
    error_log    {project_location}/log/localhost.error_log;
  }
}

django fastcgi

start

cd {project_location}
python ./manage.py runfcgi --settings={project}.settings_production maxchildren=10 \
maxspare=5 minspare=2 method=prefork socket={project_location}/log/django.sock pidfile={project_location}/log/django.pid

stop

kill -9 `cat {project_location}/log/django.pid`

NGINX frontend

start

nginx -c {project_location}/conf/nginx.conf

stop

kill -WINCH `cat {project_location}/log/nginx.pid` && kill -9 `cat {project_location}/log/nginx.pid`
inserted by FC2 system