django+gunicorn+nginx 配置
折腾了好久 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.