##language:zh #pragma section-numbers on ''' 继续研究尝试 ''' ::-- ZoomQuiet [<>] <> = apache+fastcgi = == 准备 == * 因为需要将 SVN 通过 HTTP 进行发布,所以 Lighttpd 无法进行转移到 apache22 {{{#确保以下模块安装成功 LoadModule dav_module libexec/apache22/mod_dav.so LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so ## cfg for Python LoadModule python_module libexec/apache22/mod_python.so LoadModule fastcgi_module libexec/apache22/mod_fastcgi.so }}} * 配置apache{{{ ServerName obp.zoomquiet.org DocumentRoot /path/to/web/site/root/htdocs Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all #Zoomq::070306 for SVN repos DAV svn SVNParentPath /usr/local/repos # our access control policy AuthzSVNAccessFile /usr/local/repos/matter/conf/authz.cfg # try anonymous access first, resort to real # authentication if necessary. Satisfy Any Require valid-user # how to authenticate a user AuthType Basic AuthName "zoomquiet.org repository" AuthUserFile /usr/local/repos/svn.htpasswd SVNIndexXSLT "/svnindex.xsl" }}} == 51boo方式 == * 参考 [[ObpLatform/2007-02-24|limodou的配置]] * 完成 `django.fsgi`{{{#!/usr/local/bin/python import sys, os sys.path = ['', '/usr/local/www/data/obp/trunk', '/usr/local/www/data/obp/trunk/openbookplatform'] + sys.path # Set the DJANGO_SETTINGS_MODULE environment variable. os.environ['DJANGO_SETTINGS_MODULE'] = "settings" from django.core.servers.fastcgi import runfastcgi runfastcgi(["method=threaded", "daemonize=false", "pidfile=pidfile"]) }}} * 配置apache {{{ ServerName obp.zoomquiet.org ... RewriteEngine On #RewriteBase / RewriteLogLevel 1 RewriteLog "/var/log/httpd/rewrite.log" Alias /openbookplatform "/usr/local/www/data/obp/trunk/openbookplatform" AddHandler fcgid-script .fcgi Options +FollowSymLinks +ExecCGI RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ django.fcgi/$1 [QSA,L] }}} === 结果 === 重启 apache 成功 * 但是 http://obp.zoomquiet.org/openbookplatform 访问 {{{ Forbidden You don't have permission to access /openbookplatform on this server. }}} * 直接运行`django.fcgi`{{{ ./django.fcgi WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI! WSGIServer: missing FastCGI param SERVER_NAME required by WSGI! WSGIServer: missing FastCGI param SERVER_PORT required by WSGI! WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI! Traceback (most recent call last): File "/usr/local/lib/python2.4/site-packages/flup-0.5-py2.4.egg/flup/server/fcgi_base.py", line 558, in run protocolStatus, appStatus = self.server.handler(self) File "/usr/local/lib/python2.4/site-packages/flup-0.5-py2.4.egg/flup/server/fcgi_base.py", line 1112, in handler result = self.application(environ, start_response) File "/usr/local/lib/python2.4/site-packages/django/core/handlers/wsgi.py", line 189, in __call__ response = self.get_response(request) File "/usr/local/lib/python2.4/site-packages/django/core/handlers/base.py", line 59, in get_response response = middleware_method(request) File "/usr/local/lib/python2.4/site-packages/django/middleware/common.py", line 41, in process_request if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]): IndexError: string index out of range Content-Type: text/html }}} * 怀疑是定制过 Djnago 的和 官方文档没有相类之处,先放下 == Django 方式 == * 参考: * [[http://www.djangoproject.com/documentation/fastcgi/|How to use Django with FastCGI]] * [[http://nicholasdsj.blogspot.com/2006/12/django-apache2-fastcgi.html|Django 学习笔记 - Apache2 + FastCGI]] -- `Nicholas @ Nirvana Studio` * 完成 `obp.fcgi` {{{#!/bin/bash # Replace these three settings. PROJDIR="/usr/local/www/data/obp/trunk/openbookplatform" PIDFILE="$PROJDIR/obp.pid" SOCKET="$PROJDIR/obp.sock" cd $PROJDIR if [ -f $PIDFILE ]; then kill `cat -- $PIDFILE` rm -f -- $PIDFILE fi exec /usr/bin/env - \ PYTHONPATH="../python:.." \ ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE }}} * 配置apache {{{ FastCGIExternalServer /usr/local/www/data/obp/trunk/openbookplatform/obp.fcgi -host 127.0.0.1:3033 ServerName obp.zoomquiet.org ... RewriteEngine On #RewriteBase / RewriteLogLevel 1 RewriteLog "/var/log/httpd/rewrite.log" RewriteRule ^/(media.*)$ /usr/local/www/data/obp/trunk/openbookplatform/media/$1 [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ /obp.fcgi/$1 [QSA,L] ... }}} === 结果 === 重启 apache 成功 * 但是 http://obp.zoomquiet.org/ 访问 {{{ Not Found The requested URL / was not found on this server. }}} == 继续试探 == * 尝试修订 `obp.fcgi`{{{#!/bin/sh # Replace these three settings. PROJDIR="/usr/local/www/data/obp/trunk/openbookplatform" PIDFILE="$PROJDIR/obp.pid" SOCKET="$PROJDIR/obp.sock" if [ -f $PIDFILE ]; then kill `cat -- $PIDFILE` rm -f -- $PIDFILE fi /usr/local/bin/python \ ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE }}} * 可以直接运行{{{$ sockstat ... zoomq python 51196 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock zoomq python 51196 4 stream -> ?? zoomq python 51195 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock zoomq python 51195 4 stream -> ?? zoomq python 51194 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock zoomq python 51194 4 stream -> ?? zoomq python 51193 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock zoomq python 51193 4 stream -> ?? zoomq python 51192 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock zoomq python 51192 4 stream -> ?? zoomq python 51191 3 stream /usr/local/www/data/obp/trunk/openbookplatform/obp.sock }}} * 成功!可以观察到{{{#sockstat USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS zoomq python 50875 3 stream /home/zoomq/obp.sock zoomq python 50875 4 stream -> ?? zoomq python 50874 3 stream /home/zoomq/obp.sock zoomq python 50874 4 stream -> ?? zoomq python 50873 3 stream /home/zoomq/obp.sock zoomq python 50873 4 stream -> ?? zoomq python 50872 3 stream /home/zoomq/obp.sock zoomq python 50872 4 stream -> ?? zoomq python 50871 3 stream /home/zoomq/obp.sock zoomq python 50871 4 stream -> ?? zoomq python 50870 3 stream /home/zoomq/obp.sock }}} * 修订apache{{{ FastCGIExternalServer /usr/local/www/data/obp/trunk/openbookplatform/obp.fcgi -socket /usr/local/www/data/obp/trunk/openbookplatform/obp.sock ServerName obp.zoomquiet.org DocumentRoot /usr/local/www/data/obp/trunk/openbookplatform ... }}} * 结果重启成功,访问 http://obp.zoomquiet.org/ {{{ Forbidden You don't have permission to access / on this server }}} * 观察 `rewrite.log`{{{ 61.135.152.194 - - [06/Mar/2007:22:47:18 +0800] [obp.zoomquiet.org/sid#8148ce8][rid#82e1050/initial] (1) go-ahead with /usr/local/www/data/obp/trunk/openbookplatform/obp.fcgi/ [OK] }}} 是成功的.... = lighttpd+fastcgi = 急了!!! * 设计使用 lighttpd 快速发布fastcgi 然后通过 apache 统一rewrite 发布好了 * `lighttpd.conf` {{{ ### zoomq::070306 for fascgi pub Django $HTTP["host"] == "obp.zoomquiet.org" { server.document-root = "/usr/local/www/data/obp/trunk/openbookplatform" fastcgi.server = ( "/obp.fcgi" => ( "main" => ( # Use host / port instead of socket for TCP fastcgi # "host" => "127.0.0.1", # "port" => 3033, "socket" => "/usr/local/www/data/obp/trunk/openbookplatform/obp.sock", "check-local" => "disable", ) ), ) alias.url = ( "/site_media/" => "/usr/local/www/data/obp/trunk/openbookplatform/media/", ) url.rewrite-once = ( "^(/site_media.*)$" => "$1", "^/favicon\.ico$" => "/site_media/favicon.ico", "^(/.*)$" => "/obp.fcgi$1", ) } }}} * 结果 ....{{{ 2007-03-07 11:05:33: (mod_fastcgi.c.1690) connect failed: Socket operation on non-socket 0 /usr/local/www/data/obp/trunk/openbookplatform/obp.sock 2007-03-07 11:05:44: (mod_fastcgi.c.2682) fcgi-server re-enabled: 0 /usr/local/www/data/obp/trunk/openbookplatform/obp.sock }}} == 稳定思绪 == * 专注Lighttpd: 1. 重新配置 `.fcgi` 使用 端口发布方式,比较容易在系统中观察到 1. 重新配置`lighttpd.conf` 配合 `.fcgi` * 所以{{{ ... obp.fcgi #!/bin/sh PROJDIR="/usr/local/www/data/obp/trunk/openbookplatform" PIDFILE="$PROJDIR/obp.pid" SOCKET="$PROJDIR/obp.sock" cd $PROJDIR if [ -f $PIDFILE ]; then kill `cat -- $PIDFILE` rm -f -- $PIDFILE fi /usr/local/bin/python \ ./manage.py runfcgi \ method=threaded host=127.0.0.1 port=3033 pidfile=$PIDFILE ... lighttpd.conf ### zoomq::070306 for fascgi pub Django $HTTP["host"] == "obp.zoomquiet.org" { server.document-root = "/usr/local/www/data/obp/trunk/openbookplatform" fastcgi.server = ( "/obp.fcgi" => ( "main" => ( # Use host / port instead of socket for TCP fastcgi "host" => "127.0.0.1", "port" => 3033, #"socket" => "/usr/local/www/data/obp/trunk/openbookplatform/obp.sock", "check-local" => "disable", ) ), ) alias.url = ( "/site_media/" => "/usr/local/www/data/obp/trunk/openbookplatform/media/", ) url.rewrite-once = ( "^(/site_media.*)$" => "$1", "^/favicon\.ico$" => "/site_media/favicon.ico", "^(/.*)$" => "/obp.fcgi$1", ) } }}} * 运行!哈哈哈!看来有戏!终于可以看到Django 了! {{attachment:snap_errorDB.png}} == apache 代理发布 == * 即然 Lighttpd 组织发布比较轻松,而且占用资源少,则,转向`由Lighttpd使用 fastcgi 发布Django 应用,而由 Apache 统一发布的思路` * Lighttpd 已经如上配置 发布成功 * Apache 仅仅要进行必要的URL重写: {{{ ... RewriteRule ^/trac/(.*)$ http://localhist:8001/trac/$1 [P,L] RewriteRule ^/platfrom/(.*)$ http://obp.zoomquiet.org:8002/$1 [P,L] ... }}} * 但是不论怎么折腾都是无法访问! * 想起来 `[P,L]` 的`P` 是 proxy 的意思,但是默认 apache 的编译参数中并没有 `mod_proxy` * 反复尝试终于试验出最全的必要模块编译参数: {{{$/usr/ports/www/apache22 $sudo make WITH_AUTH_MODULES=yes WITH_AUTHN_MODULES=yes \ WITH_CACHE_MODULES=yes WITH_DAV_MODULES=yes WITH_MISC_MODULES=yes \ WITH_CUSTOM_PROXY="proxy proxy_connect proxy_http proxy_balancer" \ install clean }}} * 然后追加模块加载{{{ ... LoadModule proxy_module libexec/apache22/mod_proxy.so LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so }}} * '''DONE!一切遂愿!''' == 总结 == * 主机配置时总是会出现意外,一但心乱了,则一切不可为矣! {{{ @预定好目标(同期发布SVN/Trac/Django)-->询问成功人士 -->51boo.com 模式-->率试不果-->重读文档,发现是虚拟主机情景模式! -->再度寻到主机配置成功人士-->照猫画虎... -->依然无果-->大胆假设运行模式,修订脚本,确保独立可运行 -->依然出错! -->怒了!放弃Apache,尝试Lighttpd -->清晰简单,立等可取... -->返过来解决apache 的多站代理发布技巧 DONE!<-- }}} * 三个阶段,两天,确定了自个儿的多 Django 应用服务综合发布模式... = 反馈 =