linux下nginx+python+fastcgi部署總結(django版)
注意:雖然本文成功的搭建了django運行fastcgi的執行個體,但是在實際運行中發現了很多問題,比如程式執行異常,進程在每次請求之後退出之類的。可能是我機器的問題,也可能是程式本身bug,大家如果用來搭建外網環境,請務必多多測試。
一.編譯nginx
在網上買了一本《實戰nginx-取代Apache的高效能伺服器》,寫的比較淺,主要是些配置方面的東西,不過卻正是目前我所需要的。由於需要支援https和rewrite,所以除了nginx的源碼之外,又下載了 openssl-0.9.8r.tar.gz 和 pcre-8.12.tar.gz,把他們和nginx-1.0.4.tar.gz放到同一個目錄。
為了方便編譯,筆者寫了一個指令碼,代碼如下:
#!/bin/bash
#=============================================================================
#指令碼所在絕對目錄
abs_path(){
local path=$1
local basename=$( basename $path )
local dirname=$( dirname $path )
cd $dirname
if [ -h $basename ]; then
path=$( readlink $basename )
abs_path $path
else
pwd
fi
}
#=============================================================================
#依賴的目錄
src_base_dir=$( abs_path $0 )
src_openssl_dir=$src_base_dir'/openssl-0.9.8r'
src_pcre_dir=$src_base_dir'/pcre-8.12'
src_nginx_dir=$src_base_dir'/nginx-1.0.4'
#=============================================================================
#目標的目錄
dest_base_dir=$src_base_dir'/release'
dest_nginx_dir=$dest_base_dir'/nginx'
#=============================================================================
#把所有的tar.gz解壓
find . -name "*.tar.gz" | xargs -IX tar zxvf X
#=============================================================================
#編譯nginx
cd $src_nginx_dir
chmod u+x ./configure
./configure --with-http_stub_status_module --with-http_ssl_module --with-openssl=$src_openssl_dir --with-pcre=$src_pcre_dir --prefix=$dest_nginx_dir
make && make install
編譯完成後,我們就需要來配置nginx了
二.配置nginx
在server配置項下增加
location / {
#fastcgi_pass 127.0.0.1:9001;
fastcgi_pass unix: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;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
}
location /admin_media/ {
alias /usr/local/lib/python2.7/site-packages/django/contrib/admin/media/;
break;
}
location /site_media/ {
alias /home/dantezhu/htdocs/ngx_django/media/;
break;
}
這裡的3個location配置分別解決了,與python進程通訊、django後台管理端樣式存放、網站樣式存放的問題。對照著apache的配置來看,就很容易明白了
WSGIPythonEggs /tmp
<VirtualHost *>
ServerName fuload.qq.com
WSGIScriptAlias / /home/dantezhu/htdocs/fuload/conf/setting.wsgi
<Directory />
Options FollowSymLinks
AllowOverride
Order allow,deny
Allow from all
</Directory>
<Directory "/home/dantezhu/htdocs/fuload/mysite">
Order Deny,Allow
Deny from all
</Directory>
Alias /admin_media "/usr/local/lib/python2.7/site-packages/django/contrib/admin/media"
<Directory "/usr/local/lib/python2.7/site-packages/django/contrib/admin/media">
Order allow,deny
Options Indexes
Allow from all
IndexOptions FancyIndexing
</Directory>
#AliasMatch /site_media/(.*.(css|gif|png|jpg|jpeg)) /home/dantezhu/htdocs/fuload/media/$1
Alias /site_media /home/dantezhu/htdocs/fuload/media/
<Directory "/home/dantezhu/htdocs/fuload/media/">
Order allow,deny
Options Indexes
Allow from all
IndexOptions FancyIndexing
</Directory>
</VirtualHost>
三.安裝fastcgi依賴
需要到 http://trac.saddi.com/flup下載安裝,之後fastcgi才能夠正常啟動。
四.啟動django
建立django project的過程我們就不說了,只列出啟動/停止的命令:
啟動:
#python manage.py runfcgi daemonize=true pidfile=`pwd`/django.pid host=127.0.0.1 port=9001 maxrequests=1 &
python manage.py runfcgi daemonize=true pidfile=`pwd`/django.pid socket=/home/dantezhu/nginx/sbin/django.sock maxrequests=1 &
停止:
kill -9 `cat django.pid`
五.啟動nginx
啟動:
./nginx -p /home/dantezhu/nginx/
停止:
kill -QUIT `cat ../logs/nginx.pid`
重新載入配置:
./nginx -t -c `pwd`/../conf/nginx.conf kill -HUP `cat ../logs/nginx.pid`
./nginx -t -c `pwd`/../conf/nginx.conf
kill -HUP `cat ../logs/nginx.pid`
成功顯示了django的後台介面:
linux下nginx+python+fastcgi部署總結(web.py版)
其實web.py上的官方網站已經說的比較清楚了,原文如下: http://webpy.org/cookbook/fastcgi-nginx
這裡主要講一下一些原文沒有照顧到的地方。
一.安裝依賴
spawn-cgi
flup
二.配置nginx
在server配置項下增加
location / {
#這兩種方法都可以,只不過spawn-cgi啟動的方法不同
#fastcgi_pass 127.0.0.1:9002;
fastcgi_pass unix:webpy.sock;
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_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
三.一個簡單的index.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
class hello:
def GET(self):
return 'Hello, world!'
if __name__ == "__main__":
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
app.run()
並執行:
chmod +x index.py
四.啟動web.py
啟動:
#spawn-fcgi -P `pwd`/webpy.pid -f /home/dantezhu/htdocs/ngx_web/index.py -a 127.0.0.1 -p 9002 &
spawn-fcgi -P `pwd`/webpy.pid -f /home/dantezhu/htdocs/ngx_web/index.py -s /home/dantezhu/nginx/sbin/webpy.sock &
停止:
kill -9 `cat webpy.pid`
五.啟動nginx
與上一篇文章一樣,這裡不再贅述。
六.加入到rc.local中,自動啟動
/home/dantezhu/nginx/sbin/start.sh
sudo -u dantezhu /home/dantezhu/htdocs/ngx_django/mysite/start.sh
sudo -u dantezhu /home/dantezhu/htdocs/ngx_web/start.sh
OK,就是這樣啦~