今天有位同事让我把一个系统的Apache + Django站点换成nginx + Django站点,刚好由于我的这个站点用的虚拟主机,由于内存比较小,所以之前自己刚好搭个,顺手翻出旧的记录,整理一下,在这里做一份保存

在Debian上的nginx安装相当容易,这里不废话,只是版本比较低,是0.6x的,如果需要最新版本,就自己编译吧,主要是用fastcgi跑django project,要安装flup,可以apt-get install python-flup搞定,至于如何使用fastcgi跑django project,请参考此页面

这里引用一部份:

Running a threaded server on a TCP port:

./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Running a preforked server on a Unix domain socket:

./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid

Run without daemonizing (backgrounding) the process (good for debugging):

./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock maxrequests=1

接下来就是nginx的配置了,Debian的配置文件有自己的一套规则,这里我们需要修改/etc/nginx/sites-available/default这个文件,当然可以另起一个,比如/etc/nginx/sites-available/mysite

主要是配置server段,其中的location /节,这里我的配置文件如下:

server {

listen 80;

server_name localhost;

#这里我关闭了access_log

#access_log /var/log/nginx/localhost.access.log;

location / {

#下面这句如果你是使用tcp socket的话,请换成

# fastcgi_pass host:port;

# 其中host/port是在使用fastcgi运行django时指定的

# 在高负载时使用unix socket效率会比tcp socket好

fastcgi_pass unix:/home/www-data/logs/pyeye.socket;

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_param REMOTE_ADDR $remote_addr;

fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param SERVER_PORT $server_port;

fastcgi_param SERVER_NAME $server_name;

fastcgi_intercept_errors off;

}

#下面是两个静态文件目录的配置,这根据需要自行变更

location ^~/media {

alias /home/www-data/htdocs/pyeye/media;

}

location ^~/adminmedia {

alias /home/www-data/lib/django/contrib/admin/media;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /var/www/nginx-default;

}

配置文件修改好后,记得到/etc/nginx/sites-enabled目录建立一个到此配置文件的软链接

之后就可以使用/etc/init.d/nginx restart了

补充:

有时候我发现使用/etc/init.d/nginx并不能很好的控制nginx,所以还是使用kill <signal> nginx-pid来控制好一点,比如我执行ps auxww | grep nginx有如下内容:

tiredboy  1059  0.0  0.0   4524   728 pts/0    S+   22:15   0:00 grep nginx
root     30113  0.0  0.0   4416   612 ?        Ss   11:53   0:00 nginx: master process /usr/sbin/nginx
www-data 30114  0.0  0.0   5008  1564 ?        S    11:53   0:00 nginx: worker process

这个时候找到nginx:master process这一行,pid是30113,我希望nginx能重新加载配置,则只需要执行

kill -HUP 30113

就可以了