学vue可以做pc网站,菏泽网架公司,WordPress微博qq登录插件,网站效果用什么软件做The Django Book#xff1a;第21章 支配Django 贯串此书我们谈到了一些促进Django开发的目标#xff0c;便于运用#xff0c;对程序员生手亲善#xff0c;抽象反复的任务--这些都促进了Django的 开发人员 尽管这样#xff0c;因为它起初是一个内部的#xff0c;闭流的项目… The Django Book第21章 支配Django 贯串此书我们谈到了一些促进Django开发的目标便于运用对程序员生手亲善抽象反复的任务--这些都促进了Django的 开发人员 尽管这样因为它起初是一个内部的闭流的项目一直有除此以外一个非常重要的目标:Django应当简单调度而且应当使得用 有限的资源服务宏大的流量可行 这个目标的动机在你查看Django的背景时就很显然了:在堪萨斯的一份小小的的家庭保有的报纸很难担子一流的服务器硬件 之所以Django最初的开发人员关怀从有限的资源抽出绝佳的性能确确实实Django的开发人员作为他们自各儿系统的管理员几年时 间了--没急需专诚治理的足够的硬件--即或他们的站点一天处置千儿八百万的点击 Django成为开源项目后因为不同的缘故至于性能的关切和使开发变轻便就变得非常重要:有癖好的开发者念施用Django的 个人关于他们找出月月只要开销$十即可筹建小到中型流量的站点感到非常高兴 但是能够对付小的性能只是顺利的一半Django也亟需拔高性能来满足贵族司和企业这边Django采取了通常在LAMP相仿的 web堆栈的哲学它正常号称不分享任何东西 LAMP? 首字母缩写LAMP最初用于描述一些用以驱动好多网站的时兴的开源软件: Linux(操作系统) Apache(web服务器) MySQL(数据库) PHP(编程语言) 但是其余时分这个首字母缩写更多的示意这些部类的开源软件堆栈的哲学而不是非一般的堆栈之所以应Django运用Python而且 数据库不可知时经过LAMP堆栈证实的该哲学渗漏了Django的调度心思 有点(多数很滑稽)至于创建相仿的首字母缩写来描述Django的技术堆栈的尝试你的撰稿人们喜爱PAID(PostgreSQLApache Internet和Django)也许LAPD(LinuxApachePostgreSQL和Django) 不分享任何东西 作为它的核心不分享任何东西的哲学只是对整个软件堆栈松耦合的施用这个架设唤起了对现阶段什么是主流架设的直接 响应:包装语言的独自的web应用服务器数据库web服务器--甚或一部分操作系统--到一个独自的处置(比如Java) 当到了急需伸缩性的每每这可能是个重要的问题几乎不能在多个不同的物理机器上分隔独自的处理工作之所以独自的程 序亟需有力的服务器当然这些服务器价值上万甚或几十万美金这让高性能的网站与缺少现款的个人和小公司无缘 尽管这样LAMP社区注意到如其你把web堆栈的每个一部分分解成独自的组件你可以轻巧的以便宜的服务器开始而且跟着你 渐渐生长来简略的增添更便宜的服务器如其你的$三,000的数据库服务器不能处置负荷你简略的购置第二个(也许第三个 可能第四个)直到它可以如若你亟需更多储存能力你可以平添一台NFS服务器 但是为了让它工作web程序务必终止假想同一服务器将处置每个请求--或许甚或一个独自请求的每个一部分在高伸缩性的 LAMP(以及Django)调度中多达一打车服务器或许与一个独自的页面相关!这点的反响是泛滥的但是本质上为这几点: 一状态不能在本土储存换言之在多个请求间可得到的任何数据务必储存在某类别型的持久化储存中悉数据库或集中 缓存 二软件不能假定资源是本土的比如web平台不能假想数据库运作于同一服务器它务须能够联接远路数据库服务器 三堆栈的每部分务必很简略腾挪或许复制:如若Apache鉴于某种原因不能为给定的支配工作你应当可以以最小的忙胡搅 用除此以外的服务器轮换它 也许在硬件级别:如其web服务器出故障了你应当可以以最小的停产期用此外一个物理匣子轮换它记住整个哲学基于 在便宜的必需品硬件上支配故障是预期的 你或者想到Django或多或少透明的处置这个--Django没哪一部分违拗了这些准则--但是理解该哲学至于到了追求伸缩性时 会有相助 但是它工作吗? 该哲学或者至于在纸上(或许在你的银屏上)看上去良好但是它真的工作吗? 好了让我们见见一个不完整的一些基于该架设进行它们的业务的公司的列表你或许认得一些名字: Amazon BLogger Craigslist Facebook Google LiveJournal Slashdot Wikipedia Yahoo YouTube 为了从应Harry赶超Sally...解释闻名的场景:我们将拥有他们有的货色! 个人嗜好的注意 在我们进去细节预先一个高速的周边 开源因为所谓的宗教战事而闻名:好多(数目字的)墨汁洒在对于文本编辑器(emacs vs. vi)操作系统(Linux vs. Windows v s. MacOS)数据库发动机(MySQL vs. PostgreSQL)以及--当然--编程语言的争议上 我们尝试远离这些战事我们没足够的时间 尽管这样当到了支配Django时有一些抉择而且我们常常谋求我们的偏爱既是述说这些偏好接近于这些战事中煽惑一个 保留条款同样风险我们一般都避免了但是鉴于完整性的缘故我们将在这里述说它们我们取舍: Linux--明确的为Ubuntu--作为我们的操作系统 Apache和mod_python作为web服务器 PostgreSQL作为数据库服务器 当然我们可以指出好多作出其余取舍并工作的良好的Django用户 怎的同Apache和mod_python应用Django Apache和mod_python当前是在产品服务器上应用Django的最强健的装设 mod_python是在Apache中嵌入Python的Apache插件它当服务器运行时载入Python代码到内存储器中代码在一个Apache处置的 周期一直驻留在内存储器中这带到比其余服务器安置更好的性能 Django亟需Apache二.x和mod_python三.x而且你应当运用Apache的prefork MPM而不是worker MPM 注意 配备Apache超出了此书的内容之所以我们将简略的谈到急需的细节幸运的是如若你急需学习更多对于Apache的常识有 大量的资源可以失去内中我们喜爱的一些为: 免费的在线apache文档 Peter Wainwrite(Apress)的Pro Apache Ben Laurie和Peter Laurie(OReilly)的Apache:The Definitive Guide 根本配备 为了用mod_python配备Django第一确认你装配了Apache并激活了mod_python模块这一般寓意在你的Apache配备里有1 个LoadModule指示这正常看上去像这么: Java代码 一.LoadModule python_module /usr/lib/apache二/modules/mod_python.so LoadModule python_module /usr/lib/apache二/modules/mod_python.so其后编者你的Apache配备并平添下边的货色: Java代码 1. 2. SetHandler python-program 3. PythonHandler django.core.handlers.modpython 4. SetEnv DJANGO_SETTINGS_MODULE mysite.settings 5. PythonDebug On 6. SetHandler python-programPythonHandler django.core.handlers.modpythonSetEnv DJANGO_SETTINGS_MODULE mysite.settingsPythonDebug On确以为你的站点运用适合的DJANGO_SETTINGS_MODULE来轮换mysite.settings 这告诉Apache:透过应用Django的mod_python handler来为任何在/停的URL施用mod_python它传送DJANGO_SETTINGS_M ODULE的值来让mod_python晓得运用哪个settings 注意我们施用Location指示而不是Directory指示后者用以指出你的文件系统的位置而Location指出一个网站的URL结 构的位置Directory在这里将没有意义 并且如若你手动改动了你的PYTHONPATH来置放你的Django项目你将亟需告诉mod_python: PythonPath [/path/to/project] sys.path 你也可认为了性能而增添比如PythonAutoReload Off等指示参照mod_python documentation 来失去完整的选项列表 注意你应该在产品服务器中设立PythonDebug Off如若你护持PythonDebug On应mod_python出现问题时你的用户将看到丑恶 陋的(而且直露的)Python堆栈信息 重启ApacheDjango将服务你的站点(也许你将该指示放在VirtualHost块里则时虚拟主机)的任何请求 注意 如其你在一个头目录调度Django--即比/更深的地方--Django不会批改你的URL形式的URL前缀这么如若你的Apache 这么配备: Java代码 1. 2. SetHandler python-program 3. PythonHandler django.core.handlers.modpython 4. SetEnv DJANGO_SETTINGS_MODULE mysite.settings 5. PythonDebug On 6. SetHandler python-programPythonHandler django.core.handlers.modpythonSetEnv DJANGO_SETTINGS_MODULE mysite.settingsPythonDebug On则你全部的URL形式将急需以/mysite/开始鉴于这个缘故我们正常提议在你的域名可能虚拟主机的根支配Django 在同一Apache范例的多个Django装配 可以在同一Apache范例运作多个Django装配只需像这么运用VirtualHost: Java代码 一.NameVirtualHost * 2. 3. 4. ServerName www.example.com 5. # ... 6. SetEnv DJANGO_SETTINGS_MODULE mysite.settings 7. 8. 9. 10. ServerName www二.example.com 11. # ... 12. SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings 13. NameVirtualHost *ServerName www.example.com# ...SetEnv DJANGO_SETTINGS_MODULE mysite.settingsServerName www二.example.com# ...SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings如若你急需在同一VirtualHost安放两个Django装配你将急需采取一个非一般的防护来军令状mod_python的代码缓存不会把事儿 弄糟施用PythonInterpreter指示来给不同的Location指示诀别的interpreters: Java代码 1. 2. ServerName www.example.com 3. # ... 4. 5. SetEnv DJANGO_SETTINGS_MODULE mysite.settings 6. PythonInterpreter mysite 7. 8. 9. 10. SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings 11. PythonInterpreter mysite_other 12. 13. ServerName www.example.com# ...SetEnv DJANGO_SETTINGS_MODULE mysite.settingsPythonInterpreter mysiteSetEnv DJANGO_SETTINGS_MODULE mysite.other_settingsPythonInterpreter mysite_other只要它们在不同的两个Location块中PythonInterpreter的值没有关系 施用mod_python运作开发服务器 因为mod_python缓存了载入的Python代码当在mod_python调度Django站点时你将急需在历次你改动你的代码时重启Apache 这或者唤起争辩之所以这里是避免它的高速技艺: 只需增添MaxRequestsPerChild 一到你的配置文件来逼迫Apache对每个请求从新载入每个货色但是不用在产品服务器上做 这件事不然我们将废止你的Django特权 如若你是施用疏散的print话语来调试的程序员注意print话语在mod_python中没成效它们不会期待中的在Apache日记 中出现如若你急需在mod_python设立中打印调试信息你将也许念应用Python的基准日记包可能增添调试信息到你的页面 的模板中 从同一Apache范例服务Django和media资料 Django自身要强务media资料它把这项工作留给你取舍的Web服务器我们提议运用独自的Web服务器--即不是运作Django 的那个--来服务media参照下部的伸缩性一部分 但是如其你没其余抉择而不得不在Django的同一Apache VirtualHost上服务media资料这里是为站点的非一般一部分封闭mod_ python: Java代码 1. 2. SetHandler None 3. SetHandler None改动Location为你的media资料的根URL 你也可以施用LocationMatch来婚配正则表达式比如这在站点的根来建立Django但是展示的在media子目录和任如何.jpg .gif或.png煞尾的URL禁止Django: Java代码 1. 2. SetHandler python-program 3. PythonHandler django.core.handlers.modpython 4. SetEnv DJANGO_SETTINGS_MODULE mysite.settings 5. 6. 7. 8. SetHandler None 9. 10. 11. 12. SetHandler None 13. SetHandler python-programPythonHandler django.core.handlers.modpythonSetEnv DJANGO_SETTINGS_MODULE mysite.settingsSetHandler NoneSetHandler None错误处理 当你施用Apache/mod_python时错处将被Django擒获--换言之它们不会传播到Apache级别而且不会在Apache的error_lo g中出现 例外是当你的Django设立中有点货色真个的弄糟时这种情况下你将在你的浏览器受看到一个内部服务器差错页面并在 你的Apache的error_log资料里看到完整的堆栈信息error_log堆栈信息散布在多行(是的这很丑陋而且很难翻阅但这是 mod_python做事情的形式) 如若你失去瓜分故障 有时当你装配Django时Apache疏失应这发生时差点儿一直是与Django自身不相关的两个缘故中的一个: 一可能是你的Python代码在import pyexpat模块(用以解析XML)这或者与嵌入Apache的版本矛盾 参阅Expat以致Apache垮掉失去完整的信息 二可能是由于你在同一Apache范例中运作mod_python和mod_php并运用MySQL作为数据库后端 有点情况下这招致因为PHP和Python的MySQL后端的版本矛盾发生的已知的mod_python问题 在mod_python FAQ条目有完整的信息 如其你对设立mod_python依然有问题一个好事儿是让一个空的没Django构架的mod_python站点工作这是分开mod_pytho n专有的问题的简易的形式 让mod_python工作详细引见了这点 下一步应该是编者你的测试代码并平添你施用的Django专有的代码的import--你的视图模型URL配备RSS配备之类把 这些imports放在你的测试handler步骤里并在浏览器里访问你的测试URL如若这招致失败你就能确认是因为import Djan go代码以致的问题逐步减小imports的数量直到它终止失误这么就找出了罗致问题的非一般的模块如果有必要则深入到 模块中并观测它们的imports 怎的同FastCGI施用Django 诚然在Apache和mod_python停的Django是最强健的调度设立许多人施用的是FastCGI是独一的选项的共享主机 并且在某些情况下FastCGI容许比mod_python更好的保险和或者更佳的性能至于小站点FastCGI也比Apache更轻量 什么是FastCGI? FastCGI是让外部程序对Web服务器服务页面的有效的模式Web服务器委任进入的Web请求(透过socket)给FastCGIFastCGI 则施行代码并传送对答给Web服务器Web服务器则顺次将对答回来给客户端Web浏览器 像mod_python同样FastCGI容许代码驻留在内存储器中这就容许0起步时间来服务请求不像mod_pythonFastCGI历程不在 Web服务器历程里运作而是一个独自的持久的历程 为何在独自的历程里运作代码? Apache里守旧的mod_*配备把不同的脚本语言(特别是PHPPython和Perl)嵌入在你的Web服务器过程空间里边固然这减小了 起动时间--由于代码不需要为每个请求读硬盘--它是之内存应用为代价的 每个Apache历程失去Apache发动机的拷贝包括Django不施用的Apache的全部特征在另一方面FastCGI历程只拥有Python和 Django的内存储器过渡 因为FastCGI的天性也可以以一个不同的用户帐号运作的历程而不是Web服务器历程这在共享系统里是一个良好的保险好 处由于这寓意你可以从其余用户保护你的代码 必要条件:flup 在你开始同Django应用FastCGI先期你将亟需装配flup这是用于处置FastCGI的Python库有点用户汇报了老版本flup的 页面推迟之所以你或许念施用最新的SVN版本 运作你的FastCGI服务器 FastCGI基于客户端-服务器模型操作在多数情况下你将起动你自各儿的FastCGI服务器过程应服务器急需载入动态页面时 你的Web服务器(Apachelighttpd可能其余的)只联系你的Django-FastCGI过程因为后盾历程已经将代码运作在内存储器中 则可以高速的服务对答 注意 如若你在一个共享主机系统上你或许将被强逼应用Web服务器治理的FastCGI历程参照下部的运用Web服务器治理的过程来 运作Django来失去更多信息 Web服务器可以用两种模式联接FastCGI服务器:它可以施用Unix域socket(在Win32系统上的定名管道)可能应用TCP socket 你的抉择是一种偏好因为权限问题TCP socket更容易 为了起步你的服务器第一进来你的项目的索引(你的manage.py所在的地方)其后施用runfcgi选项运作manage.py: Java代码 1../manage.py runfcgi [options] ./manage.py runfcgi [options]如其你指定help作为runfcgi后头独一的选项它将展示全部可得到的选项的列表 你将亟需指定socket或许host和port其后当你起步你的Web服务器时你将只需在起动FastCGI服务器时在你指定的host/ port也许socket指出它 一些事例应当可以相助解释这点 一在一个TCP端口运作一个threaded服务器: Java代码 1../manage.py runfcgi methodthreaded host127.0.0.1 port3033 ./manage.py runfcgi methodthreaded host127.0.0.1 port3033二在一个Unix域socket运作一个preforked服务器: Java代码 1../manage.py runfcgi methodprefork socket/home/user/mysite ./manage.py runfcgi methodprefork socket/home/user/mysite三不要后台老板化(背景化)历程来运作(利于调试): Java代码 1../manage.py runfcgi daemonizefalse socket/tmp/mysite.sock ./manage.py runfcgi daemonizefalse socket/tmp/mysite.sock终止FastCGI后台老板过程 如其你有一个历程运作在前台很简略终止它:容易的输入Ctrl-C将终止和退出FastCGI服务器但是当你处置靠山过程时 你将亟需求诸于Unix kill下令 如其你指定pidfile选项到你的manage.py runfcgi你可以像这么杀掉运作的FastCGI靠山过程: Java代码 一.kill cat $PIDFILE kill cat $PIDFILE这边$PIDFILE为你指定的pidfile 为了使在Unix上重启你的FastCGI后盾历程很简单你可以施用这个小shell脚本: Java代码 1.#!/bin/bash 2. 3.# Replace these three settings. 四.PROJDIR/home/user/myproject 五.PIDFILE$PROJDIR/mysite.pid 六.SOCKET$PROJDIR/mysite.sock 7. 八.cd $PROJDIR 九.if [ -f $PIDFILE ]; then 10. kill cat -- $PIDFILE 11. rm -f -- $PIDFILE 12.fi 13. 14.exec /usr/bin/env - / 15. PYTHONPATH../python:.. / 16. ./manage.py runfcgi socket$SOCKET pidfile$PIDFILE #!/bin/bash# Replace these three settings.PROJDIR/home/user/myprojectPIDFILE$PROJDIR/mysite.pidSOCKET$PROJDIR/mysite.sockcd $PROJDIRif [ -f $PIDFILE ]; thenkill cat -- $PIDFILErm -f -- $PIDFILEfiexec /usr/bin/env - /PYTHONPATH../python:.. /./manage.py runfcgi socket$SOCKET pidfile$PIDFILEApache和FastCGI 为了同Apache和FastCGI施用Django你将急需装配和配备Apache并让mod_fastcgi装配和激活参照Apache和mod_fastcgi 文档来失去指示 万一你建立了这些货色透过编者httpd.conf(Apache配备)资料来将Apache指向你的Django FastCGI范例 你将急需做两件事儿: 一应用FastCGIExternalServer指示来指定你的FastCGI服务器的位置 二施用mod_rewrite来将URLs指向适宜的FastCGI 指定FastCGI服务器的位置 FastCGIExternalServer指示告诉Apache怎么找出你的FastCGI服务器 FastCGIExternalServer文档解释到 你可以指定socket或许host这里是两者的例证: Java代码 1.# Connect to FastCGI via a socket / named pipe. 二.FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock 3. 4.# Connect to FastCGI via a TCP host/port. 五.FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033 # Connect to FastCGI via a socket / named pipe.FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock# Connect to FastCGI via a TCP host/port.FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033甭管哪种景况/home/user/public_html/mysite.fcgi实质上不需要存在它只是Web服务器内部应用的URL--一个示意关于 一个URL的哪个请求应当透过FastCGI处置的钩子(下部分对此讲授更多) 运用mod_rewrite将URLs指向FastCGI 第二步是告诉Apache对婚配某一形式的URLs应用FastCGI为了干这个应用mod_rewrite模块并重写URLs到mysite.fcgi(或 者你在FastCGIExternalServer指示里指定的任何东西上头的一部分解释了) 在这个例证中我们告诉Apache应用FastCGI来处置不示意文件系统中的资料和不以/media/造端的任何请求如若你在应用 Django的admin站点这可能是最常见的景况: Java代码 1. 2. ServerName example.com 3. DocumentRoot /home/user/public_html 4. Alias /media /home/user/python/django/contrib/admin/media 5. RewriteEngine On 6. RewriteRule ^/(media.*)$ /$一 [QSA,L] 7. RewriteCond %{REQUEST_FILENAME} !-f 8. RewriteRule ^/(.*)$ /mysite.fcgi/$一 [QSA,L] 9. ServerName example.comDocumentRoot /home/user/public_htmlAlias /media /home/user/python/django/contrib/admin/mediaRewriteEngine OnRewriteRule ^/(media.*)$ /$一 [QSA,L]RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^/(.*)$ /mysite.fcgi/$一 [QSA,L]FastCGI和lighttpd lighttpd是一个轻量的Web服务器它一般用来服务静态资料它 生就支持FastCGI这么如其你的站点没Apache专有的需求的话它是服务静态和动态页面的好的抉择 确认mod_fastcgi在你的模块列表中座落mod_rewrite和mod_access以后但不再mod_accesslog以后你也许将也想要mod_ alias来服务admin的media 平添下列内容到你的lightpd配置文件: Java代码 一.server.document-root /home/user/public_html 二.fastcgi.server ( 3. /mysite.fcgi ( 4. main ( 5. # Use host / port instead of socket for TCP fastcgi 6. # host 127.0.0.1, 7. # port 3033, 8. socket /home/user/mysite.sock, 9. check-local disable, 10. ) 11. ), 12.) 13.alias.url ( 14. /media/ /home/user/django/contrib/admin/media/, 15.) 16. 17.url.rewrite-once ( 18. ^(/media.*)$ $一, 19. ^/favicon/.ico$ /media/favicon.ico, 20. ^(/.*)$ /mysite.fcgi$一, 21.) server.document-root /home/user/public_htmlfastcgi.server (/mysite.fcgi (main (# Use host / port instead of socket for TCP fastcgi# host 127.0.0.1,# port 3033,socket /home/user/mysite.sock,check-local disable,)),)alias.url (/media/ /home/user/django/contrib/admin/media/,)url.rewrite-once (^(/media.*)$ $一,^/favicon/.ico$ /media/favicon.ico,^(/.*)$ /mysite.fcgi$一,)在一个lighttpd范例上运作多个Django站点 lighttpd让你应用有条件的配备来容许对每个主机自定义配备为了指定多个FastCGI站点只需为每个站点增添有条件的 块来包围你的FastCGI配备: Java代码 1.# If the hostname is www.example一.com... 2.$HTTP[host] www.example一.com { 3. server.document-root /foo/site一 4. fastcgi.server ( 5. ... 6. ) 7. ... 8.} 9. 10.# If the hostname is www.example二.com... 11.$HTTP[host] www.example二.com { 12. server.document-root /foo/site二 13. fastcgi.server ( 14. ... 15. ) 16. ... 17.} # If the hostname is www.example一.com...$HTTP[host] www.example一.com {server.document-root /foo/site一fastcgi.server (...)...}# If the hostname is www.example二.com...$HTTP[host] www.example二.com {server.document-root /foo/site二fastcgi.server (...)...}你也可以经过在fastcgi.server指示里指定多个条目来在同一站点上运作多个Django装配为每项增添一个FastCGI主机 在共享主机服务商上同Apache运作Django 好多共享主机服务商不允许你运作你自个儿的服务器后盾过程后者编者httpd.conf资料这种情况下依然可以施用Web服务器 生成的过程运作Django 注意 如其你应用这一部分解释的Web服务器生成的过程你没必要自各儿起动FastCGI服务器Apache将作为伸缩性急需而自个儿生成1 些过程 在你的Web源目录增添下列内容到一个叫.htaccess的资料: Java代码 一.AddHandler fastcgi-script .fcgi 二.RewriteEngine On 三.RewriteCond %{REQUEST_FILENAME} !-f 四.RewriteRule ^(.*)$ mysite.fcgi/$一 [QSA,L] AddHandler fastcgi-script .fcgiRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ mysite.fcgi/$一 [QSA,L]其后创造一个告诉Apache怎的生成你的FastCGI程序的金莲本创设一个mysite.fcgi并把它放在你的Web索引并保准它可 施行: Java代码 1.#!/usr/bin/python 二.import sys, os 3. 4.# Add a custom Python path. 五.sys.path.insert(零, /home/user/python) 6. 7.# Switch to the directory of your project. (Optional.) 8.# os.chdir(/home/user/myproject) 9. 10.# Set the DJANGO_SETTINGS_MODULE environment variable. 11.os.environ[DJANGO_SETTINGS_MODULE] myproject.settings 12. 13.from django.core.servers.fastcgi import runfastcgi 14.runfastcgi(methodthreaded, daemonizefalse) #!/usr/bin/pythonimport sys, os# Add a custom Python path.sys.path.insert(零, /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] myproject.settingsfrom django.core.servers.fastcgi import runfastcgirunfastcgi(methodthreaded, daemonizefalse)重启生成的服务器 如其你在你的站点改动了任何Python代码你将急需告诉FastCGI代码已经更动但是这种情况下没有必要重启Apache而是 只需从新上传mysite.fcgi--或许编者该资料--这么该资料的时间戳将改变应Apache发现该资料已经更新它将为你重启你 的Django程序 如若你在Unix系统上可以访问命令行shell你可以透过施用touch下令容易的达到这点: Java代码 一.touch mysite.fcgi touch mysite.fcgi增高伸缩性 既是你懂得了怎么让Django运作在一个独自的服务器上让我们见见你怎的拔高一个Django装配的伸缩性这一部分将通览1 个站点怎么从一个独自的服务器到可以服务每小时几百万点击率的高伸缩性的集群 但是注意差一点每个特大型站点以不同的模式大很主要之所以增高伸缩性不是一个分寸量天下的操作下头的内容应当满足显 示正常的准则我们将尝试指出我们可以在哪儿作出不同的取舍 第一我们将做一个十分大的假想并额外谈一下在Apache和mod_python停拔高伸缩性虽然我们好多顺利的中到特大型FastCGI部 署我们简略的更相熟Apache 独自的服务器 半数以上站点以运作在一个独自的服务器上开始运用看上去像这么的架设: 这对小到中等的站点工作的良好而且非常便宜--你可以开销少于$三,000设计来将Django安放在一个独自的服务器 尽管这样应流量增多后你将很快进来对不同的软件开展资源争夺的化境数据库服务器和web服务器喜爱将整个服务器归属 它们自个儿来应用之所以当在同一服务器上运行时它们常常为独有同一资源(RAMCPU)而斗殴 这可以经过将数据库服务器腾挪到第二台机器上来轻便解决 把数据库服务器分开开 分开数据库服务器 对Django而谈这十分简略:你将简略的急需改动DATABASE_HOST设立为你的数据库服务器的IP或DNS如若可以的话运用IP可 会是个好主意依赖于DNS来联接你的web和数据库服务器可能是个大问题 透过将数据库服务器分开我们的架设现下看上去像这么: 这边我们开始进来一般所谓的N层架设不用被专业术语吓倒它只是指web堆栈分开到不同的物理机器的不同的层 这么的话如其你期待急需增多超过一个独自的数据库服务器现时就开始思考联接池和/或数据库复制可能是个好主意此书 几乎没有足够的空间来议论这些议题--不幸的是--之所以你将急需参照你的数据库文档和/或社区来失去更多的信息 独自的media服务器 关于独自的服务器设立我们依然剩有一个大问题:从处置动态内容的同一匣子服务media 这两个活动在不同的环境客店理最好把它们糅杂在一个匣子里你将不会把任何一个处置得良好之所以下一步是把media隔绝 开来--即不是Django视图生成的任何东西--到一个专诚的服务器: [img]http://media.djangobook.com/content/chapter21/scaling-三.png[img] 志向情况下这个media服务器应当运作一个独自的优化来公布静态media的web服务器 lighttpd和tux在这里都是良好的抉择但是一个重量级的独自Apache也可以工作 关于静态内容很多的站点--相片视频之类--搬动到一个独自的media服务器愈加主要而且或者应该是拔高伸缩性的第一步 但是这一步或者略微有的狡猾Django的admin亟需能够写上传media到media服务器(MEDIA_ROOT设立统制了这些media应当写 到哪里)如若media坐落除此以外一个服务器你将急需安顿一种对这个写跨网络发作的模式 作这个的最简略的形式是施用NFS来设立media服务器的media索引到web服务器如其你设立它们到MEDIA_ROOT指定的同一位 放media 上传将Just Work™ 载荷均衡和冗余 在这点上我们现下尽量多的分解事儿这个3服务器的设立应当处置十分大的流量--我们从这种架设服务了每日千儿八百万的 点击率--之所以如若你增长的更多你将亟需开始增添冗余 实际上这是好事:初看一眼上边的图像展示了即令三个服务器中的独自的一个垮掉了你将毁掉你的整个站点之所以当你平添 额外的服务器时你不单增加了容量你也增加了可靠性 为了这个事例让我们假想web服务器第一打击容量很简单失去运作在不同的硬件上的Django站点的多个拷贝--只需复制所 有的代码到多个机器上其后在它们上边起步Apache 尽管这样你将急需除此而外一个软件来在你的多个服务器上散发流量:一个负荷均衡器你可以购置昂贵和私有的硬件负荷均衡 器但是有一些十分高质量的开源载荷均衡器软件在那里 Apache的mod_proxy便是一个选项但是我们发现Perlbal更牛X 它是写memcached(参照第14章)的一些家伙写的一个负荷均衡器和倒转署理 注意 如若你施用FastCGI你可以透过分开你的前台web服务器和后端FastCGI历程到不同的机器来达到一样的散发/载荷均衡前 台的服务器本质上变为载荷均衡器后端的FastCGI过程则轮换了Apache/mod_python/Django服务器 web服务器现下集群以后我们进化的架设开始看上去更复杂了: 注企图像中web服务器被当做集群来指出服务器的数量是根本可变的万一你在前面有一个负荷均衡器你可以轻便的平添 和剔除后端web服务器而没一丁点的停产期 变大 在这点上接下来的几步是最后一步的衍生: 一当你急需更多的数据库性能时你将急需平添复制数据库服务器MySQL包孕了内建的复制PostgreSQL用户应当查询 Slony和pgpool来诀别失去复制和联接池 二如若独自的载荷均衡器不够你可以在前面平添更多的负荷均衡器并施用round-robin DNS散发它们 三如若独自的media服务器不能满足你可以平添更多的media服务器并用你的载荷均衡集群散发载荷 四如其你亟需更多的缓存你可以增添专诚的缓存服务器 五在任何一步如其集群不能处置的良好你可以平添更多的服务器到集群 在这些迭代以后一个高伸缩性的架设或许看上去像这么: 虽然我们只在每个级别展示了两到三个服务器大抵对你可以增添的服务器的数量没限制 性能调优 如其你有大量的银两对性能问题你可以只是砸硬件但是对其他人性能调优是务必的 注意 趁便说一下子如其谁有大量的白银而又在翻阅此书请思忖对Django项目的真实的捐赠我们也接受未雕琢的钻石和金锭 不幸的是性能调优更多的是一门艺术而不是一门科学它甚或比增高伸缩性更难写如若你对支配高伸缩性的Django程序 很热衷你应当花销大量的时间学习怎的整合你的堆栈的每个一部分 但是这里是一些我们从前几年议论的Django专有的调优小技能: 没太多的RAM 就算真个昂贵的RAM每千兆字节只价值$200--盆尼与花消在调优的时间上比照购置尽量多的你能担子的伏的RAM其后 再买多一点 更快的微处理器不会真的改善性能太多大多数web服务器花销90%的时间在硬盘IO上万一你开始互换性能将亡故更快的 硬盘或者略微有些相助但是它们比无足轻重的RAM昂贵好多 如其你有多个服务器置放你的RAM的第一个地方乃是数据库服务器如其你可以担子的讫失去足够多的RAM来让你的整个 数据库放到内存储器中这应当不难LJWorld.com的数据库--包括回顾至一九八九年的50万稿子--少于二GB 下一步是对你的web服务器最大化RAM志向的景况是永不互换如其抵达这点你应当可以承负绝大多数普普通通的流量 封锁Keep-Alive Keep-alive是HTTP的一个特征它容许多个HTTP请求对一个独自的TCP联接服务避免了TCP建立/销毁的过渡 第一眼看样子这不错但是实质上它可以杀掉一个Django站点的性能如若你刚好从一个独自的服务器服务media每个浏览你 的站点的用户将实质上最好情况下每十秒从Django服务器失去一个页面这让HTTP服务器等候下一个keep-alive请求而1 个闲工夫的HTTP服务器只是耗费一个激活的服务器应当施用的RAM 运用memcached 虽然Django支持好多不同的缓存后端它们中没一个相近memcached同样快如其你有一个高流量的站点不用与此同时应用 其余缓存后端直接应用memcached 常常运用memecached 当然如若你实际上不施用memcached的话抉择它将不会给你带到好处这边第14章是你最好的友人:学习怎么应用Django的 缓存构架并且在任何也许的地方施用它主动的尽先的缓存通常是护持站点在高流量停的独一的思忖 加入叙谈 Django堆栈的每个一部分--从Linux到Apache到PostgreSQL也许MySQL--后边都有一个卓越的社区如若你真个想从你的服务器 失去最后的一%参与你的软件后头的开源社区并谋求相助绝大多数免费软件社区成员将乐意相助 最后也确认加入Django社区你的低微的著者们只是一个十分活泼的生长中的Django开发人员群组中的两个成员我们的 社区提供一个数量硕大的群体心得 祝你好运! 我们祝你运作的Django站点有最好的命运运限不管它是你和你友人的一个小玩具仍是下一个谷歌本文来源我的异常网Java Exception