ãã®è¨äºã¯ãã¢ãã¤ã«ãã¡ã¯ããªã¼ Advent Calendar 2015 11æ¥ç®ã®è¨äºã§ã
â» æç¨¿å 容ã¯ç§åäººã®æè¦ã§ãããæå±ä¼æ¥ã»é¨éè¦è§£ãªãã³ã«æè¡æ¦ç¥ã代表ãããã®ã§ã¯ããã¾ããã
æ¨æ¥ã¯@rymizukiããã®npmã©ã¤ãã©ãªã®éç¨ã¨ç®¡çã«ã¤ãã¦ã§ããã仿¥ã¯Perlã®è©±ã§ãã
ãä»äºããã©ã¤ãã¼ãã§Perlã®webã¢ããªã±ã¼ã·ã§ã³ãæ¸ããã¨ãå¤ããããããç¥è¦ãæºã¾ã£ã¦ãã¦ãã®ã§ãããã§å°ãç´¹ä»ãããã¨æãã¾ãã ä»åã¯Plack/PSGIãªwebã¢ããªã±ã¼ã·ã§ã³ã®å®è¡ç°å¢ã®è©±ã§ããmod_perlãªã¢ããªã±ã¼ã·ã§ã³ã¨ã¯ã¡ãã£ã¨ã³ã³ããã¹ããéãã¾ãã å°ããã£ã¡ãã³ã³ããã¹ãã«è¿ãã§ããå人ã§è»½ãwebã¢ããªã±ã¼ã·ã§ã³ç«ã¦ããªãããå°ããããµãã§ãåé¡ãªãã¯ãã§ãã
OS
Ubuntuã®LTSã使ããã¨ãå¤ãã§ããUbuntuåæã®å 容ãå¾ã«ç¶ãã¾ãã
Perl
System Perlã¯ä½¿ã£ã¦ã¾ãããOS/ãã£ã¹ããªãã¥ã¼ã·ã§ã³ãå¤ãã£ã¦ããªãã¹ããã®ã¾ã¾åãããã«ãããããã§ãã
perl-buildã§ç¬èªãã«ãããPerlã使ãã¾ããã¤ã³ã¹ãã¼ã«å ´æã¨ãã¦ã¯ã /usr/local/perl/perl-5.${VERSION}
ã«ç½®ãã¾ãã
Perlãç¬èªãã«ããããã®ãDebian packageåãã¦å®è¡ç°å¢ã«ã¯ã¤ã³ã¹ãã¼ã«ãã¾ãã
ä»ã®æ¹æ³ã¨ãã¦ã¯ããã«ãæ¸ã¿ã®perlãtarã§åºãã¦ãé
å¸ããã¨ããã®ãããã¾ãã
ã©ã¡ãã§ãæ§ããªãã®ã§ããããã¼ã«ã«ãããã¯ã¼ã¯ã«aptãµã¼ãç«ã¦ã¦ããé¢ä¿ã§ãDebian packageã®æ¹ãéç¨ããããã®ã§ãã
ã¾ããperlã®ãã¤ãã¼ãã¼ã¸ã§ã³ã¢ããã®éãDebian packageãä½ãç´ããä¸ã§ã apt-get upgrade
(or aptitude safe-upgrade
)ã§å®çµããã®ã§ãaptã®æä½ã«æ
£ãã¦ãã¦æ¥½ã¨ããã®ãããã¾ãã
ã¢ã¸ã¥ã¼ã«ç®¡ç
ä»é¢¨ã«cpanfileã§ã¢ã¸ã¥ã¼ã«ç®¡çãã¦ã¾ããã¢ã¸ã¥ã¼ã«ã¤ã³ã¹ãã¼ã«ã¯Cartonã使ã£ã¦ã¾ãã
Cartonã®å¾ç¶ã§Carmelãéçºããã¦ã¾ããå人çã«ã¯ãããã触ã£ã¦ããããã¨ããã§ãã
ã¾ããcpanfile.snapshotãã¬ãã¸ããªã«å
¥ãã¦ãã¾ãã
ä¸è¬çãªã¢ã¸ã¥ã¼ã«ã¯ç¹å®ã®(å¤ã)ãã¼ã¸ã§ã³ã«ä¾åããã«åãã¹ãã§ããã
ä¾åã¢ã¸ã¥ã¼ã«ã®ãã¼ã¸ã§ã³éãã«ãã£ã¦ç¾å¨åãã¦ããã¢ããªã±ã¼ã·ã§ã³ãå£ããã®ãé²ãããã«ããã¼ã¸ã§ã³åºå®ãã¾ãã
cpanfile.snapshotãããç¶æ
ã§ä¸è¨ã®ããã« carton install
ãã¦ãããã¨ãã©ã®ç°å¢ã§ãåããã¼ã¸ã§ã³ã®
ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¹ãã¼ã«ããã¾ãã
carton install --deployment --without develop,test
ä»ãã£ã¦ãªãã§ããã奿¹æ³ã¨ãã¦ã¯ãã¢ã¸ã¥ã¼ã«ãã¤ã³ã¹ãã¼ã«æ¸ã¿ã®ç¶æ
ã§ã carton bundle
ãã㨠vendar/
ã«ã¢ã¸ã¥ã¼ã«ã®tarãåºããããã®ã§ããããã¬ãã¸ããªç®¡çããä¸ã§ãä¸è¨ã®æ§ã«ã¤ã³ã¹ãã¼ã«ããã¨ããæãããã¾ããã¤ã³ã¹ãã¼ã«ã®é㯠vendor/bin/carton
ã«fatpackãããcartonã³ãã³ããå
¥ãã®ã§ããã使ãã¾ãã
(ã¢ããªå®è¡ç°å¢ã«cartonãæ¢ãã¦å
¥ããå¿
è¦ã¯ç¡ã)
# ä¾åã¢ã¸ã¥ã¼ã«ãåºãã carton bundle # ã¤ã³ã¹ãã¼ã« # env.shã¯å¾è¿° ./script/env.sh vendor/bin/carton install --cached --deployment --without develop,test
ããã«å¥æ¹æ³ã¨ãã¦ã¯ããã«ããµã¼ãã§ä¾åã¢ã¸ã¥ã¼ã«ããã«ãããä¸ã§ããã£ã¬ã¯ããªãã¨å®è¡ç°å¢ã«rsyncãã¦ãããæ¹æ³ã§ãã ãã«ããµã¼ããéç¨ãã¦ãããªãã°ããã®æ¹æ³ã§ãè¯ãã§ãããã
åç §
ç¬èªã¢ã¸ã¥ã¼ã«
ãªãã¹ããç¬èªã¢ã¸ã¥ã¼ã«ã¯ä½¿ããªãæ¹ãè¯ãã®ã§ãããå人çãªäºæ ãªã©ã§ãCPANã«å ¬éåºæ¥ãªãã¢ã¸ã¥ã¼ã«ã«é¢ãã¦ã¯ãOrePAN2 ã§Darkpanãä½ã£ã¦ãããããã¼ã«ã«ã«é ä¿¡ããããã«ãã¦ã¾ãã OrePAN2ã®ãµã¼ããç°¡åã«ç«ã¡ä¸ããããOrePAN2::Serverãããã¾ããã䏿æã¯ä½¿ã£ã¦ãã¾ããããã¢ã¸ã¥ã¼ã«ã®ã¢ãããã¼ãæ©è½ã¯å¥ã«ãããªããªã©ã®çç±ã§ä»ã¯webãµã¼ãããéçé ä¿¡ãã¦ã¾ãã
ç°å¢å¤æ°
ããã¸ã§ã¯ãã®ã¬ãã¸ããªã« config/env.rc
ã¨ããååã§ãã¢ããªã±ã¼ã·ã§ã³ãåããããã«å¿
è¦ãªç°å¢å¤æ°ãå®ç¾©ãããã¡ã¤ã«ãä½ãã¾ãã
PERL5_VERSION="22" export PROJECT_BASE="/path/to/project" export PERL_CARTON_MIRROR="http://orepan.local/" export PERL5LIB="${PROJECT_BASE}/local/lib/perl5:${PROJECT_BASE}/lib" export PATH="${PROJECT_BASE}/local/bin:/usr/local/perl/perl-5.${PERL5_VERSION}/bin:${PATH}" export PLACK_PORT=5555
ã¾ãã script/env.sh
ã¨ããååã§ config/env.rc
ãèªã¿è¾¼ãã ä¸ã§ãããã°ã©ã ãå®è¡ããã©ããã¼ã¹ã¯ãªãããä½ãã¾ãã
ã¹ã¯ãªãããªã©ã¯åºæ¬çã«ãããéãã¦å®è¡ãã¾ãã
#!/bin/bash -ue # 諸ã ç°å¢å¤æ°ãè¨å®ããä¸ã§ã³ãã³ããå®è¡ããå # # env.sh perl hogehoge.pl # source /path/to/project/config/env.rc exec "$@"
éçºç°å¢ã§ããã¡ãã¡ã©ããã¼ã¹ã¯ãªããéãã®ãé¢åãªå ´åã¯ãconfig/env.rc
ã®symlinkãããã¸ã§ã¯ãã«ã¼ãã« .envrc
ã¨ãã¦å¼µã£ãä¸ã§ãdirenv使ã£ã¦æ¸ã¾ãã¦ãã¾ãå ´åãããã¾ãã
web ãµã¼ãèµ·åã¹ã¯ãªãã
psgiãã¡ã¤ã«ã plackup
ããã®ã§ã¯ãªãããããªæãã®ã¹ã¯ãªãããscript/web
ã¿ãããªååã§ ç¨æãã¦ã¢ããªã±ã¼ã·ã§ã³ãµã¼ããèµ·åããããã«ãã¦ã¾ãã
#!/usr/bin/env perl use strict; use warnings; use lib "$ENV{PROJECT_BASE}/lib"; use Plack::Loader; use SomeApplication::Config; use SomeApplication::Web::Handler; my $config = SomeApplication::Config->load(); my $app = SomeApplication::Web->to_app(); Plack::Loader->load( $config->{psgi}->{server}, %{ $config->{psgi}->{config} }, )->run($app);
ã¾ãããã®ã¹ã¯ãªãããstart_serverãçµç±ãã¦èµ·åãããã¨ã§ã(graceful restartã«ãã)ããããããã¤ãã§ããããã«ãã¦ã¾ãã
start_server
ã®ããã»ã¹ã«SIGHUPãéãã¨åããã»ã¹ã®ã¢ããªã±ã¼ã·ã§ã³ãµã¼ããåèµ·åãã¦ãããã®ã§ããã plackup
ã³ãã³ãã§èµ·åãã¦ã㨠start_server
ã«æ¸¡ãã弿°ããã®ã¾ã¾ä½¿ã£ã¦plackup
ãåèµ·åããã®ã§ã max_workers
ã®æ°ãå¤ãããã¨ããªã©ã start_server
èªä½ã®ããã»ã¹ãåèµ·åããªãã¦ã¯ãªããªãã®ã§ä¸ä¾¿ã§ãã
ãªã®ã§ãèµ·åã¹ã¯ãªãããä½ã£ã¦ã¾ãããã®ã»ãã«ãçç±ãããã®ã§ãããåç
§ãªã³ã¯ã«è©³ããããã¾ãã
ãµã¼ãå®è£ ã¨ãã¦ã¯ãStarletãGazelleã使ã£ã¦ã¾ãã
åç §
- PSGI/Plackã¢ããªã±ã¼ã·ã§ã³ã®èµ·åæ¹æ³ããããã¨æ¬çªç°å¢ã¢ã¬ã³ã¬
- æ®éã«ä½¿ã Plack/PSGI Server
- Graduate from .psgi
ãã¼ã¢ã³ç®¡ç
ç¾å¨ã¯Upstartã§ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã®ãã¼ã¢ã³ç®¡çãã¦ã¾ãã 以ä¸ã®çç±ã§ãå人çã«ã¯å¥½ãã§ãã(éå»å½¢)ãææ°ã®Ubuntuã¯Systemdã«å¤ãã£ã¦ãã¾ã£ãã®ã§ãå°æ¥çã«ã¯Systemdã«ç§»è¡ãããã¨ã«ãªãã§ãããã
- Ubuntuã«æ¨æºã§å ¥ã£ã¦ãã¦
- ãµã¼ãèµ·åæã®èªåèµ·åãã¦ããã¦
- ãã¼ã¢ã³ç°å¸¸çµäºæã«èªååèµ·åãã¦ããã¦
- è¨å®ã¯ãããããããããã
/etc/init/web-some-application.conf
ã¿ãããªååã§ãããªè¨å®ãã¡ã¤ã«ãä½ãã¾ã
description 'some web application' author 'masasuzu <[email protected]>' start on runlevel [2345] stop on starting rc RUNLEVEL=[016] setuid webapp setgid webapp # ç°å¸¸æã«åèµ·åãã respawn script . /path/to/project/config/env.rc export PLACK_ENV="production" exec ${PROJECT_BASE}/local/bin/start_server \ --interval 10 \ --port ${PLACK_PORT} \ -- ${PROJECT_BASE}/script/service/web end script
ä¸è¨ã®ãã¡ã¤ã«ãä½ãã¨ä»¥ä¸ã®ããã«æä½åºæ¥ã¾ããreloadã§SIGHUPãéããã®ã§ãã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã®start_serverçµç±ã®graceful restartãã§ãã¾ãã
# èµ·å service web-some-application start # 忢 service web-some-application stop # (start_serverã®ããã»ã¹ãã¨)åèµ·å service web-some-application restart # Plackãµã¼ããåèµ·å service web-some-application reload
ã¢ããªã±ã¼ã·ã§ã³ãµã¼ã以å¤ããã¸ã§ãã®ã¯ã¼ã«ã¼ãªã©ããç¬èªã«è¨å®ãã¡ã¤ã«ãä½ã£ã¦ãUpstartçµç±ã§èµ·åããããã¦ã¾ãã
Upstart以å¤ã®é¸æè¢ã¨ãã¦ã¯ãå ã«æããSystemdã®ä»ã以ä¸ã®ãã®ãããã§ãããã 好ã¿ã¨è¦ä»¶ã«åããã¦ä½¿ãã°è¯ãã¨æãã¾ãã
åç §
- Server::Starterããå¦ã¶hot deployã®ä»çµã¿
- Server::Starter ã® --interval ãªãã·ã§ã³ã¯å¤§å
- Upstart ã使ã£ã¦ãæè»½ daemon å
- Upstart Intro, Cookbook and Best Practises
ãããã«
WAF(Web Application Framework)ããã°ã®è©±ãªã©è¨ãã¾ããã¨æãã°ãã£ã¨è¨ãã¾ãããã¾ãããå®è¡ç°å¢ã®è©±ãªã®ã§ãããã¾ã§ã§æãã¦ããã¾ãã
ãã£ããã¨ãPlack/PSGIãªã¢ããªã±ã¼ã·ã§ã³ã®å®è¡ç°å¢ã«ã¤ãã¦èª¬æãã¦ãã¾ããã Perlã§Webã¢ããªã±ã¼ã·ã§ã³ãä½ãæã«ä½ãåèã«ãªãã°å¹¸ãã§ãã ã¾ãããã£ã¨è¯ãæ¹æ³ãããã°ãæãã¦ããã ããã¨ãããããã§ãã
ææ¥ã¯ã@nekobato ããã§ã webpackã®ãªã«ãé¢ç½ã話ãããããããªããã¨ããã©ããã¦ã¾ãã