折腾了好久 apache+wsgi 不知道为什么一直在 memory leak

在失去了改源码的激情中, 只能通过换服务的方式解决了.

借鉴 instagram 的典型架构使用

django + gunicorn + nginx 跑 app server 来支撑

安装 django 这里就不多说了....

gunicorn 安装其实也非常简单

懒的去折腾些什么了. 所以,直接用 apt-get 安装

aptitude install gunicorn

配置 gunicorn+django 的启动脚本

#!/bin/bash
set -e 
LOGFILE=/tmp/guni.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3  # cpu core nums * 2 + 1
USER=nobody
GROUP=nogroup
WORKER=gevent # install python gevent
ADDRESS=127.0.0.1:8000
cd /path/to/project/
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn_django -w $NUM_WORKERS --bind=$ADDRESS \
  -k $WORKER --daemon \
  --user=$USER --group=$GROUP --log-level=error \
  --log-file=$LOGFILE 2>>$LOGFILE

这样 gunicorn 就安装完成了.

接下来, 整合nginx. 同样,安装也不说了.

user nobody nogroup;
worker_processes  8;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
    accept_mutex on;
    use epoll;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  5;

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

    upstream app_server_djangoapp {
        server 127.0.0.1:8000 fail_timeout=5;
    }

    server {
        listen       80;
        server_name  _;

        root /path/to/project;

        location /static/ {
        if ($query_string) {
        expires max;
#       log_not_found off;
             }
         }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server_djangoapp;
            break;
        }
    }

        #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   html;
        }
    }
}

先介绍到这里, 继续 debug.

参考文档: