Django flup lighttpd 环境下使用 FastCGI 和 WSGI

2019年11月06日 阅读数:45
这篇文章主要向大家介绍Django flup lighttpd 环境下使用 FastCGI 和 WSGI,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

基本的架构以下:python

  • Django 使用 flup 提供一个 WSGI 接口的服务
  • lighttpd 使用 FastCGI 来访问 flup 提供的 WSGI 接口,而后在 http 层面为访问者服务
  • http-lighttpd-FastCGI-WSGI-flup-Django

须要安装的程序有:数据库

  • python, django
  • flup 一个 WSGI的实现
  • lighttpd

目录部署结构django

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/home
....+/yourWebName
........+yourWebName.pid
........+yourWebName.sock
........+/yourDjangoName
............+settingsYourWebName.py #适用于正式部署的网站的配置文件,通常状况下是先 import settings.py 而后在根据网站实际部署状况修改其中的配置。如数据库环境等等
............+yourWebName.fcgi
........+/lighttpd
............+11-simple-vhost-yourWebName.conf
........+/scripts
............+StartFastCGI.sh
............+RestartFastCGI.sh
 
其中:
yourWebName 是给网站定义的名称
yourDjangoName 是 Django 项目的名称
/home/yourWebName 是将网站项目的根目录,与之相关的都放在这个目录下面
/home/yourWebName/yourDjangoName 是网站所用到的 Django 系统的项目根目录

lighttpd 配置文件 /etc/lighttpd/conf-enabled/11-simple-vhost-yourWebName.confbash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$HTTP["host"] == "www.yourWebName.com" {
     server.document-root = "/home/yourWebName/yourDjangoName/"
     fastcgi.server = (
         "/yourWebName.fcgi" => (
             "main" => (
                 "socket" => "/home/yourWebName/yourWebName.sock",
                 "check-local" => "disable",
             )
         ),
     )
 
     alias.url = (
         "/media" => "/home/user/django/contrib/admin/media",
         "/static" => "/home/yourWebName/yourDjangoName/static",
     )
 
     url.rewrite-once = (
         "^(/media.*)$" => "$1",
         "^(/static.*)$" => "$1",
         "^/favicon\.ico$" => "/static/favicon.ico",
         "^(/.*)$" => "/yourWebName.fcgi$1",
     )
 
     accesslog.filename = "/var/log/lighttpd/www.yourWebName.com.access.log"
}

Django FastCGI 配置文件 yourWebName.fcgi架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
import sys, os
 
# Add a custom Python path.
#sys.path.insert(0, "/home/user/python")
 
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
 
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ[ 'DJANGO_SETTINGS_MODULE' ] = "yourDjangoName.settingsYourWebName"
 
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method = "threaded" , daemonize = "false" )

启动 Django 服务脚本 StartFastCGI.shsocket

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
 
# Replace these four settings.
PROJDIR= "/home/yourWebName"
DJANDIR= "/yourWebName/yourDjangoName"
PIDFILE= "$PROJDIR/yourWebName.pid"
SOCKET= "$PROJDIR/yourWebName.sock"
 
# start program
cd $DJANDIR
python manage.py runfcgi method=threaded socket=$SOCKET pidfile=$PIDFILE --settings=yourDjangoName.settingsYourWebName
chmod 777 $SOCKET

重启 Django 服务的脚本 RestartFastCGI.sh网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
 
# Replace these three settings.
PROJDIR= "/yourWebName"
PIDFILE= "$PROJDIR/yourWebName.pid"
SOCKET= "$PROJDIR/yourWebName.sock"
 
# kill program and remove pidfile #杀死旧的进程
cd $PROJDIR
if [ -f $PIDFILE ]; then
     kill ` cat -- $PIDFILE`
     rm -f -- $PIDFILE
fi
 
# upgrade program #更新代码
cd $PROJDIR
hg pull
hg update
 
# start program #重启 Django 服务
$PROJDIR /scripts/StartFastCGI .sh

settingsYourWebName.pyurl

1
2
#避免在 lighttp-fastcgi 环境下 {% url %} 被加上 yourWebName.fcgi 的 url 前缀
FORCE_SCRIPT_NAME = ''

注:spa

  • 若是只是修改了网站的代码,只须要重启 Django 服务便可
  • 当 lighttpd 相关的配置文件发生了变化才须要重启 lighttpd