æè¿ãWebéçºã®åéã§ãPythonããã°ã©ãã³ã°èšèªã人æ°ãéãå§ããŠããŸãã ãã ããPythonã®å€§èŠæš¡ãªæ®åã¯ããã®èšèªã§ã¢ããªã±ãŒã·ã§ã³ãå¹ççã«èµ·åããåé¡ã«ãã£ãŠåŠšããããŠããŸãã ãããŸã§ã®ãšãããã»ãšãã©ã®å Žåãããã¯å°çšãµãŒããŒãŸãã¯ä»®æ³ãµãŒããŒã®éåœã§ãã ã¢ãžã¥ã©ãŒèšèªã¯ãåºæ¬çãªphpæ©èœã®ã¢ããªã·ãã¯ãšã¯ç°ãªããåèŠæ±ã§å°ãªããšãã©ã³ã¿ã€ã ã©ã€ãã©ãªãããŒãããå°ãªããšããŠãŒã¶ãŒãèŠæ±ããæ°åå以äžã®ã¢ãžã¥ãŒã«ãããŒãããŸãã ãããã£ãŠãPythonããã³Perlã®mod_phpã®ãããªå€å
žçãªã¢ãããŒãã¯ããŸãé©åã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ãã¡ã¢ãªã«åžžã«ä¿æããã®ã¯é«äŸ¡ã§ããã ããããæãçµã€ã«ã€ããŠããã¯ãããžãŒã¯ãã匷åã§å®äŸ¡ã«ãªããŸããããããŠãããªãé·ãéã倧éãã¹ãã£ã³ã°ã®äžéšãšããŠã¢ããªã±ãŒã·ã§ã³ã§åžžã«å®è¡ãããŠããããã»ã¹ã«ã€ããŠå®å
šã«è©±ãããšãã§ããŸãã
ããã¯äœã§ãã
Pythonã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããæ¹æ³ã«é¢ããããŸããŸãªææ¡ããããã¯ãŒã¯äžã«æã
衚瀺ãããŸãã ããšãã°ãæè¿Ginoã
ãã¹ããããšã mod_pythonãäžæã«ä¿®æ£ãã
ãããã䜿çš
ãããã¹ãã£ã³ã°ãæäŸãããŸã ã 圌ã«ç¶ããŠãç¹å®ã®Locumãã¹ãã£ã³ã°ãmod_pythonã®ã»ãã¥ãªãã£ãå®å
šã«æåŠãïŒå
ã®ã»ãã¥ãªãã£ã®æ¬è³ªãnirvanaã«åããå¯äžã®ITåé¡ã§ããããã§ãïŒã
fastcgiã«å¯Ÿããmodwsgiã®åå©ãã¹ããå®æœããŸãã ã ç§ã®æ€çŽ¢ããå€æãããšãã³ãã¥ããã£ã¯mod_pythonãšFastCGIã®éã§åŒãè£ãããŠããŸãã ããã«ãFastCGIã¯éåžžDjangoã«ä»å±ããŠãããã®-flupãæå³ããŸãã
Pythonã¢ããªã±ãŒã·ã§ã³ã®äººæ°ã®ãã
ãã¹ãã£ã³ã°ã§ãããã ãç§ãã¡ã¯ãã®ç¥èãªæŠäºãéããã«è²¢ç®ããããšã«ããŸããã
ã©ããªãã¯ãããžãŒã§ããå®è£
ã³ãŒã·ã£ãããã©ãŒãã³ã¹ã䜿ãããããæ±çšæ§ãæé©ã«çžé¢ãããã¹ãã ãšç§ã¯å¿ããä¿¡ããŠããŸãã ããã«åºã¥ããŠãæ瀺ããããœãªã¥ãŒã·ã§ã³ã®ããããã«ã€ããŠèª¬æããŸãã ç§ã¯éžæã®åé¡ã«äž»èŠ³çã«ã¢ãããŒããã誰ããç解ã§ããæ®éçãªããã»ã¹ãããŒãžã£ãŒãšããŠApache WebãµãŒããŒã«çŠç¹ãåœãŠãŸããã
www.wsgi.org/wsgi/Serversãã
flup ïŒ
trac.saddi.com/flup ïŒãpython-fastcgiïŒ
pypi.python.org/pypi/python-fastcgi ïŒãããã³mod_wsgiïŒ
www.modwsgi.org ïŒãéžæããŸããã åæã«ã圌ã¯mod_pythonïŒ
www.modpython.org ïŒãæ¡çšããŸãããããã¯ãäžè¬çãª
ãã¹ãã£ã³ã°æ¥è
ã®éã§pythonãèµ·åããæãäžè¬çãªæ¹æ³ã§ãã
äœã«è¿ã
ç§ã¯ãã¹ãŠã®ãªãã·ã§ã³ã«çæ³çãªæ¡ä»¶ãäœæããããšããŸãããç¹å®ã®æ°ã®ãªã¯ãšã¹ãã®åŸã«åèµ·åããããšã¯ãªãããã¹ãŠãéåžžã®åçŽãªæ¹æ³ã§è¡ãããŸããã å®éã«ã¯ãApache-> Publisher-> Applicationãã¹ã®å¹çãšçç£æ§ã®ãã¹ãããããŸãã ãããã®ãã¹ãã®å€ãã¯äœããã®çç±ã§ã€ã³ã¿ãŒããªã¿ãŒã®ããã©ãŒãã³ã¹ããã¹ãããŸãããåãã€ã³ã¿ãŒããªã¿ãŒãæ¯èŒããçç±ã説æããç°ãªãã€ã³ã¿ãŒããªã¿ãŒã®å Žåãã©ã®æ©èœã®å®è£
ããã¹ããããã¹ãããå¿
èŠãããã®ãââã説æããã®ã¯é£ããããšãããããŸããã ç¹ã«ããã¹ãŠã®æè¡ãã¹ãã¯ããã©ãŒãã³ã¹ã®æ¯èŒè©äŸ¡ã®ã¿ãæäŸãããšããäºå®ã«æ³šæãåèµ·ããããšæããŸãã ãããã£ãŠãç¹å¥ãªãã¥ãŒãã³ã°ãããã©ãŒãã³ã¹ã®åäžã¯è¡ãããŸããã§ããã phpã«é¢ããäžå¿
èŠãªæŽèšãé¿ããããã«ãmod_phpããã¹ãã«å«ãŸããŠããŸãã
ãã¹ãŠã®æªéåãããããã»ã¹ã«ã€ããŠãæ¡ä»¶ãéžæãããŸãã-ãããã5ã¹ã¬ããã®2ã€ã®äºåéå§ããã»ã¹ã ãã©ããã®ããç¹å¥ãªå Žåãé€ããŸãã ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒãã£ãªãã£ab 100,000ïŒ10äžïŒãªã¯ãšã¹ãã10åæã«ãªã¯ãšã¹ããããã«10,000ïŒ10,000ïŒãªã¯ãšã¹ãã®è¿œå mod_pythonãã¹ãã«ãã£ãŠãã¹ããããŸãã 5ã30ã100ã®äºåéå§ããã»ã¹ïŒMPM PreforkïŒã䜿çšããŠãåŸåãç¹å®ããããã«ãApacheã§é 次ãã¹ããè¡ââãããŸããã
å®éšç
ãã¥ã¢ã«ããã»ããµXeon E5335 2.00GHzãRAM 4GbãSCSI-3ã€ã³ã¿ãŒãã§ã€ã¹ãåããSCSIããŒããã©ã€ãã FreeBSD 7.2-RELEASE amd64ãApache 2.2.11ãphp 5.2.10ãpython 2.5.4ãmod_wsgi 3.0ãmod_python 3.3.1ãmod_fastcgi 2.4.6ãpython-fastcgi 1.1ããã³fcgi devkit 2.4.0ãflup 1.0.2ãã€ã³ã¹ããŒã«ã ãã¹ãŠã®ãã¹ãã¯ãµãŒããŒäžã§ããŒã«ã«ã«å®è¡ãããè² è·ã1ãè¶
ããããšã¯ãããŸããã§ããã
ãã©ãã
FastCGIã€ã³ã¿ãŒãã§ãŒã¹ãåããWSGIãµãŒããŒã§ãã ããã¯ãdjangoã¢ããªã±ãŒã·ã§ã³
docs.djangoproject.com/en/dev/howto/deployment/fastcgiãèµ·åããããã®ã¡ã€ã³ã§å¯äžã®éåžžã®æ¹æ³
ã§ã ã ãã¹ãã«ã¯ã次ã®ããã°ã©ã ã䜿çšããŸããã
#!/usr/local/bin/python <br/> <br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/> from flup.server.fcgi import WSGIServer<br/>wsgi_opts = { 'maxSpare' : 5 , 'minSpare' : 5 , 'maxThreads' : 5 }<br/>WSGIServer(application,**wsgi_opts).run() <br/>
ãã®æ¹æ³ã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšã«ã¯ãããã€ãã®å°é£ããããŸãïŒãµãŒããŒãåèµ·åããã«ã¢ããªã±ãŒã·ã§ã³ãåèµ·åã§ããªããåèµ·åãŸãã¯ãµãŒãããŒãã£ã®æ¹åãªãã§ã¢ããªã±ãŒã·ã§ã³ã³ãŒãããªããŒãã§ããªããã¢ããªã±ãŒã·ã§ã³ã§fastcgiãã³ãã©ãŒãšãã®ãã©ã¡ãŒã¿ãŒãåå¥ã«å®£èšããå¿
èŠããã ããã¯ãpython-fastcgiã«ãåœãŠã¯ãŸããŸãã çµæãããããããã«ãflupã¯5ã€ã®äºåèµ·åãããApacheããã»ã¹ã䜿çšãããã¹ãã§æ¢ã«é£œåç¶æ
ã«ãªã£ãŠããŸãã 圌ã¯ãŸããflupãããã«åŠçã§ããªããã®ã¯ãã¹ãŠæãããšææããŸããã ãã¹ãã§ã¯ãšãªãšã©ãŒã®æ倧40ïŒ
ãåãåããŸããã ãã®ãã¹ãã¯æ²ãã¿ãšæ²ãã¿ãåŒãèµ·ãããŸããç§ã®çµ±èšã«ãããšãããã°ã©ããŒã¯ããã°ã©ã ãã©ã®ããã«æ©èœãããããã£ãã«èŠãªããããå€ãã®äººãä»ã¢ã¡ãªã«ãéããŠããŸãã é©ããããšã«ãå®è¡äžã®ã¹ã¬ãããå³å¯ã«å¶éããã«flupã®åäœã調ã¹ãããšã«ããäžèŠãªãã©ã¡ãŒã¿ãŒãåé€ããŠæ¬¡ã®ããã°ã©ã ãäœæããŸããã
#!/usr/local/bin/python <br/> <br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/> from flup.server.fcgi import WSGIServer<br/>WSGIServer(application).run() <br/>
çµæãæåŸ
ãããŠããŸããã æ倱ã¯ââãããŸãããflupã¯å¿
èŠã«å¿ããŠã¹ã¬ãããäœæããŸãïŒpsã®åºåãç£èŠããŸãïŒããäºæ³ã©ãããããã©ãŒãã³ã¹ã¯ã»ãŒååã«ãªããŸãã
ããã§ãä»æ¥ã®Djangoãèµ·åããæã人æ°ã®ããæ¹æ³ã§ãããç§ã®æ¿ããæšæ¶ãããŸã...
modwsgi
Apacheçšã®ã¢ãžã¥ãŒã«ãšããŠèšèšãããWSGIãµãŒããŒã§ãã ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¢ã³ã¢ãŒãã§ãã ã€ãŸã WebãµãŒããŒããäœæãããåžžé§ããã°ã©ã ãšãã®ç®¡çã®éã®ä»²ä»è
ã«ãããªãå Žåã Djangoãèµ·åããããã®äž»ãªæšå¥šæ¹æ³ã§ã
docs.djangoproject.com/en/dev/howto/deployment/modwsgi Apacheã§äœ¿çšãããããApachevã®ããããçš®é¡ã®.htaccessãªã©ã®ãããããªããšãã䜿çšã§ããã·ã¹ãã 管çè
ã«ãšã£ãŠã¯ããã»ã©æããã®ã§ã¯ãããŸããã åãäºå®ã¯ãnginxã«ã€ããŠèããŠãApacheãæªã§ãããšèããŠããéçºè
ã倧ãã«æããããŸãã ãã¹ãã«äœ¿çšããããã°ã©ã ã¯æ¬¡ã®ããã«ãªããŸãã
def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/>
ãã¹ãçµæã¯ãApacheãã³ãã©ãŒã®å¢å ã«äŒŽãããã©ãŒãã³ã¹ã®åäžã瀺ããŠããŸãã 圩床ã®æ¬ åŠã ãããŠãæããã«ãã©ãããããçç£çã§ãã
modwsgiã®ããã€ãã®æ©èœã«æ³šç®ããããšæããŸãã ãŸããåèµ·åããåã«åŠçãããªã¯ãšã¹ãã®æ°ãç¬èªã«èšå®ããŸãã ããã«ãããã¡ã¢ãªãªãŒã¯ã«å¹æçã«å¯ŸåŠã§ããŸãã ä»ã®æ¹æ³ãšåæ§ã«ãäŸã§ã¯ãã®èšå®ãè¡ããŸããã§ãããããã¯ããã©ãŒãã³ã¹ããããã«äœäžããããšãæããã ããã§ãã 第äºã«ãä»ã®æ¹æ³ãšã¯ç°ãªãããŠããŒã¯ãªã¢ã€ãã«æéèšå®ãããããã®åŸã¯éè² è·ã«ãªããŸãã ããã«ããããããã€ãããã¢ããªã±ãŒã·ã§ã³ããäžèŠãªãšãã«ã¡ã¢ãªããªãŒã¯ããã¢ããªã±ãŒã·ã§ã³ãã¡ã¢ãªã«ä¿æããªãããã«ããããšãã§ããŸãã 第äžã«ãã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«ã®æŽæ°æã«èªåçã«ãªããŒããããŸãã ã€ãŸã ããã°ã©ã ãå€æŽãããšãã¯ãå¿
ãæ°ããããŒãžã§ã³ã衚瀺ããããšç¢ºä¿¡ããŠããŸãã äžèšã®æ¹æ³ã®ãããããç¹å¥ãªå€æŽãããã«ãããè¡ãããšã¯ã§ããŸããã ãã1ã€ã®éèŠãªæ©èœã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæ¹æ³ãã¢ããªã±ãŒã·ã§ã³ã®è²¬ä»»ç¯å²ããæãåºããªãããšã§ãã äŸã«æ³šæããŠãã ãã-ããã°ã©ã ã«ã¯å®éã«ã¯WSGIã€ã³ã¿ãŒãã§ãŒã¹ãããªããããã ãã§ãã
python-fastcgi
ããã³ãŽã§ãïŒ -WSGI_serverãFastCGIã€ã³ã¿ãŒãã§ãŒã¹ä»ãã å®éãæšæºC ++ FastCGIã®ã©ãããŒã ããã°ã©ã ã¯æ¬¡ã®ããã«ãªããŸãã
#!/usr/local/bin/python <br/> import fastcgi<br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/>s = fastcgi.ThreadedWSGIServer( my_wsgi_application , workers= 5 )<br/>s.serve_forever() <br/>
ãã¹ãçµæã¯äžç®çç¶ã§ãã ãµãŒããŒãã³ãã©ãŒã®æé·ã«äŒŽããçç£æ§ãåäžããŸãã æããã«python-fastcgiã¯ãã¹ãã®ãªãŒããŒã§ãïŒããã«ã¡ã¯ãLocumïŒã äžè¬ã«ãApacheãä»ããŠFastCGIã®å°é ãåºæ¬çã«ç Žã£ãåŸããã®ã¢ãžã¥ãŒã«ã¯æå°éã®è³ªåãšèŠæ
ãåŒãèµ·ãããŸããã åœç¶ããã®èµ·åæ¹æ³ã®ãã¹ãŠã®æ¬ ç¹ããããŸã-èšå®ã®è€éããã¢ããªã±ãŒã·ã§ã³ãžã®ãµãŒããŒã®äŸåæ§ãå®æçãªåèµ·åããŒã«ã®æ¬ åŠïŒããã°ã©ã ã®æŽæ°ãªã©ïŒãªã©ã
mod_python
mod_phpã®ãããªApacheãµãŒããŒã¢ãžã¥ãŒã«ã§ãã ããã€ãã®ããã¯ããããWSGIã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããŸããã äž»ãªåé¡ã¯ã»ãã¥ãªãã£ãšèŠãªãããŸããããã¯ãå€æŽããã«ãµãŒããŒã«ä»£ãã£ãŠå®è¡ãããããã§ãã 確ãã«ãmod_phpãå«ãçµã¿èŸŒã¿ã¢ãžã¥ãŒã«ã«ãåãæ¬ ç¹ããããŸãã ãã¹ãçšã«æ¬¡ã®ããã°ã©ã ãäœæããŸããã
#!/usr/local/bin/python <br/> <br/> def index (req):<br/> return "Hello World!\n" <br/>
çªç¶ãçµæã¯æ§ããã«ãªããŸããã ãã¹ãã®éçšã§ããã1ã€ã®æ©èœãæããã«ãªããŸããã 10,000ã¯ãšãªã®ãã¹ãçµæã¯æ¬¡ã®ãšããã§ãã
ããã»ããµã®æ°ãå¢ãããšãçç£æ§ãäœäžããããšãããããŸãã ããã¯ããµãŒããŒã®èµ·åæã«apacheãã¢ããªã±ãŒã·ã§ã³ããåžããã®ã§ã¯ãªãããªã¯ãšã¹ãããã³ãã©ã®1ã€ã«ããããããšãã«ã®ã¿åžãããã§ãã ãããã£ãŠããã³ãã©ãŒãäœæããã°ããã»ã©ããåããŠãã®ãªã¯ãšã¹ããå¢ããŸããã 2-3ã®ã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã茻茳ãéåžžã«é »ç¹ã«çºçããããšã¯æããã§ãã ãµãŒããŒå
šäœããæ§æã§ããªãå Žåã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åããæ¹æ³ãéžæãããã©ããã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã ãŸããmod_pythonã«ã¯ã³ãŒãæŽæ°ã®åé¡ããããŸãã 圌ã«ã¯é©åãªèšå®ããããŸããããµãŒããŒå
šäœãåèµ·åããã«å€æŽãããšãã«ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããå¹æçã«æŽæ°ããããšã¯ã§ããŸããã§ããã äžéšã®ãã¹ãã£ã³ã°ãµã€ãã§ã¯ãdiffprivã¢ãžã¥ãŒã«ã䜿çšããŠã³ãŒããæŽæ°ãããšããç®ã«èŠããåé¡ãªãåäœããŸãã ãããã2çªç®ã®åé¡ãçºçããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ãŠã®ãªã¯ãšã¹ãã«å¯ŸããŠãµãŒããŒã«ãã£ãŠããŠã³ããŒããããããããã¹ããå€æ¿ããŠãããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããŸãã ãããŠãå¥ã®æ·±å»ãªåé¡ã¯ããã¡ããããåºç瀟ãã®éžæãšåœŒããšååããããšã§ãã mod_pythonã¯ãã€ã³ãžã±ãŒã¿ãŒã®åèšã«ããè©äŸ¡ã®æãåºç€ã§ããããšãå€æããŸããã
mod_php
æ¯èŒã®ããã«ããã¹ããšphpãå®è¡ããããšã«ããŸããã ããã°ã©ã ã¯éåžžã«æçœã«èŠããŸãïŒ
<?php echo ( "Hello, World!" ); ?> <br/>
çµæã¯æçœã§ãããæ³ååã¯æãããŸããã äžå¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãšã¢ããªã·ãã¯ãªphpèªäœãååšããªãå Žåã2以äžã®ä¿æ°ãäºæ³ãããŸããã
èŠçŽã¯éåžžã«ã·ã³ãã«ã§æçœã§ãã ãã¯ãããžãŒãåçŽã§ããã°ããã»ã©ãçç£æ§ãåäžããŸãã ããã©ãŒãã³ã¹ã®ããããŒãã«ãããè©äŸ¡ã®ãªãŒããŒã¯ééããªãpython-fastcgiã§ãããå©äŸ¿æ§ã®ããããŒãã®ãªãŒããŒã¯modwsgiã§ãã ããã«ãmodwsgiã¯æããã«ä»æ¥ã§ã¯ç¹æ§ã®åèšã«å¯Ÿããæé©ãªãœãªã¥ãŒã·ã§ã³ã§ãããæãçç£çã§ããã°ã®å€ããã®ã§ããããŸããã