1幎åãç§ã¯æåã®ééã¢ããªã±ãŒã·ã§ã³ãåãå
¥ãå¯èœãªåœ¢åŒã«ããŸããã æ¬çªç°å¢ã§æ¢è£œã®ã³ãŒãã䜿çšããåé¡ã¯ã以åã¯èå³ããããŸããã§ããã ãªãçªç¶ã§ããïŒ åçŽãªèšèªãç°¡æœãªãã¬ãŒã ã¯ãŒã¯-å±éã¯ãPHPåŸã®ã¡ã³ã¿ã«ãã¬ãŒããå
æãããããæããã«é£ãããããŸããã
RailséçºããŒã ã¯ã
Phusion Passengerã®äœ¿çšãæšå¥šããŠããŸããããã¯mod_phpã®ãããªãã®ã§ããã€ã³ã¹ããŒã«ããã¡ã€ã«ã®é
眮ãããã³é£è¡ãè¡ããŸãã ãã®åé¡ãç 究ããæç¹ã§ã¯ããã©ãŒã©ã ã«ã¯ãœãªã¥ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«é¢ããæŠãããããŸããã§ããã ä¹å®¢ã¯åœŒãã®ãæ°ã«å
¥ãã§ã¯ãããŸããã§ããã
ãµã€ãã®ãã¯ãã«ã«ãã£ã¬ã¯ã¿ãŒã«1æ¥100äžäººã®ãŠããŒã¯ãªåŸæ¥å¡ã«ã¢ããã€ã¹ãæ±ããŸããã圌ã¯NginxãšUnicornã§Googleã«éããŸããã 2009幎ã®Habréã«ããçç£ã»ããã¢ããæé ã ãšãããã圌女ã¯ã¬ãã¹ã³ããã¯ããŠã®æãæ¹ãã®æ¬ ç¹ã«å§åãããã ãã§ããã
ããã»ã¹ã®äžéšã¯è±èªã§åãŸããŠãããšããããããŸãããã¢ããªã·ãã¯ãã¥ãŒããªã¢ã«ã¯ç§ã®ç®ã«çãŸããŸããã§ããã ééã³ãã¥ããã£ã®äŒçµ±ã¯ãåé¡è§£æ±ºã®çµæãšçµéšãå
±æãããšããååã«åºã¥ããŠããŸãã
ããã¹ãã¯çµéšè±å¯ãªééã¬ã€ãã«ãšã£ãŠèå³æ·±ããã®ã§ã¯ãããŸããããã³ã¡ã³ãã«æéããããå Žåã¯æè¬ããå¿
èŠãªå€æŽãå ããŸãã
-ç§ãã¡ã¯äœã«ã€ããŠè©±ããŸããïŒ-ãã®æé ã¯ãåå¿è
ããã¹ãã£ã³ã°ãéžæããã³æ§æããã®ã«åœ¹ç«ã¡ãŸãããŸããåæå±éããã³æŽæ°ã®äœç³»çãªããŒã«ã¢ãŠãã®ããã«æ¢åã®ãããžã§ã¯ããæºåããŸãã
-ãããŠããã詳现ã«ïŒ-Ubuntu 14.04ãRVMãNginxãUnicornãããã³Capistranoã䜿çšããŸãã ãã®ããã¹ãã¯ããããžã§ã¯ãã®æºåãšãµãŒããŒã®ã»ããã¢ããã®2ã€ã®ç« ã§æ§æãããŠããŸãã ããŒã«ã«æäœã¯ãã¹ãŠMac OS Xã§èª¬æãããŠããŸã
ãRubyMineã®ãããªææ°ã®IDEã¯ããã·ãŒãžã£ãå®è¡ããã®ã«äžå¿
èŠã§
ã¯ãããŸãã ã 説æãããŠãããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ã
ç¹å¥ãªãªããžããªã§ä¿®æ£ãã
ãŸã ã
第1ç« ãã¹ãã£ã³ã°
ãã¹ãã£ã³ã°ã®éžæ
NginxãšUnicornã®çãã«ããã«ã«ã¯RAMã«å¯Ÿããéåžžã«å°è±¡çãªæ¬²æ±ããããã¬ãŒã«èªäœã«ã¯å€ãã®è¿œå ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãå¿
èŠã§ãã ãããã®å¶éã¯ãVPSã®å¿
èŠæ§ãæ確ã«ç€ºããŠããŸãã
Herokuã®ãããªç¹æ®ãªãã¹ãã£ã³ã°ã䜿çšãããªãã·ã§ã³ããããŸãããåå¿è
ã«ã¯ã»ããã¢ããããã»ã¹ãæäœæ¥ã§è¡ããšäŸ¿å©ã§ãã
ãã®ããã¹ãã®äžéšãšããŠãUbuntu 14.04ã«åºã¥ããŠæ°ãã«äœæãããããããã¬ãã
Digital Oceanã䜿çšããŸãã ïŒ1ãæåã®ååãªããã¢ãŒã·ã§ã³ã³ãŒãããããŸããã€ã³ã¿ãŒãããã§2åç¡æã§äœ¿çšã§ããã¢ã«ãŠã³ãã«10ãã«ã®çŽ¹ä»ãå¿
èŠã§ã-ãªã³ã¯ãæäŸããŸããïŒ
ã·ã¹ãã ããã¯ã®æŽæ°
ã«ãŒãã®äžã®ã·ã¹ãã ã«ç§»åããŠãããã±ãŒãžãæŽæ°ããŸãã
sudo apt-get update sudo apt-get upgrade
GitãšNodeJSãã€ã³ã¹ããŒã«ãã
sudo apt-get install git-core nodejs
ãŠãŒã¶ãŒäœæ
ããªãïŒç§ã®ããã«ïŒãå±éã«åæ¥çé¢å¿ãæã£ãŠãããšæããŸãã ã¢ããªã±ãŒã·ã§ã³ããããã€ããããŒã ãã£ã¬ã¯ããªã«ãå¥ã®ãŠãŒã¶ãŒïŒã¯ã©ã€ã¢ã³ãïŒãäœæããŸãããã æçœãªããšã«å ããŠããã®ã¢ãããŒãã¯ãå¥åã®RVMïŒRubyããŒãžã§ã³ãããŒãžã£ãŒïŒã®åœ¢ã§å©ç¹ãæäŸããŸããããã«ãããããŸããŸãªã¯ã©ã€ã¢ã³ããšã¢ããªã±ãŒã·ã§ã³ã«ããŸããŸãªããŒãžã§ã³ã®ã€ã³ã¿ãŒããªã¿ãŒãšgemã䜿çšã§ããŸãã
demo
ãŠãŒã¶ãŒãäœæãã
sudo
ã°ã«ãŒãã«è¿œå ããŸãã
sudo adduser demo sudo adduser demo sudo
ã»ãã·ã§ã³ãéããŠã
demo
ãŠãŒã¶ãŒãšããŠãã°ã€ã³ããŸãã
sudoã®ãã¹ã¯ãŒããªã¯ãšã¹ãããã£ã³ã»ã«ãã
äžéšã®å±éæé ã§ã¯ãã¹ãŒããŒãŠãŒã¶ãŒæš©éãå¿
èŠã§ãã ã³ãã³ããCapistranoã䜿çšããŠå®è¡ããããšã©ãŒãçºçããªãããã«ããã«ã¯ããã¹ã¯ãŒãèŠæ±ããªãã«ããå¿
èŠããããŸãã
sudoers
ãã¡ã€ã«ãç·šéããŸãïŒsudo nano / etc / sudoersã
Capistranoã®å
¬åŒããã¥ã¡ã³ãã§
㯠ããã€ãã£ããããã€ãã§ãŒãºã§ã¯sudoã¯äžèŠã§ãããš
説æãããŠããŸãã ãã ãããã¹ãŠã®ããã»ã¹ãèªååããå Žåã¯ããã¹ã¯ãŒããªãã®sudoãäžå¯æ¬ ã§ãã
SSHããŒçæ
2ã€ã®ããŒãã¢ãå¿
èŠã§ãã ãããã®ããããã䜿çšããŠãããªãïŒããã³CapistranoïŒã¯ããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒãããµãŒããŒã«å¯ŸããŠèªèšŒãè¡ããŸãã 2çªç®ã®ãã¢ã§ã¯ããµãŒããŒã«ãªããžããªãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸãïŒãããããããã€ã¡ã³ãããŒïŒã ã©ã¡ãã®å Žåãããã¹ãã¬ãŒãºã¯ç©ºçœã®ãŸãŸã«ããŸãã
æåã®ãã¢ïŒ ããŒã«ã«ã§çæããå¿
èŠããããŸãïŒïŒ
ssh-keygen -t rsa -b 2048
ããŒãçæããã³äœ¿çšããæé ã«ç²ŸéããŠããå Žåã¯ããã¡ã€ã«ãžã®ãã¹ãšå¥œã¿ã«å¿ããèä¹
æ§ãéžæããŸãã ãã以å€ã®å Žåã¯ãããã©ã«ãã®ãŸãŸã«ããŸãã
次ã«ãå
¬éããŒã®å
容ïŒããã©ã«ãã§ã¯ããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã®
~/.ssh/id_rsa.pub
ïŒãã³ããŒããŠããµãŒããŒã®
~/.ssh/authorized_keys
ãã¡ã€ã«ã«è¿œå ããå¿
èŠããããŸãã SSHã䜿çšãããã®ç°¡åãªæäœã®åŸããã¹ã¯ãŒããªãã§ãµãŒããŒã«æ¥ç¶ã§ããŸãã ããã§ãªãå Žåã¯ããµãŒããŒã®æš©éã確èªããŸã
~/.ssh
å Žåã¯700ã
~/.ssh/*
å Žåã¯600ã§ãã
2çªç®ã®ãã¢ïŒãµãŒããŒäžïŒïŒ
ssh-keygen -t rsa -b 2048
åæ§ã«ããµãŒããŒã®ã³ã³ãã³ã
~/.ssh/id_rsa.pub
ããããã€ã¡ã³ãããŒã®ãªã¹ãã«è¿œå ããå¿
èŠããããŸãïŒgithubã§åãªããžããªã®èšå®ã§èŠã€ããããšãã§ããŸãïŒã
Fresh Nginxã®ã€ã³ã¹ããŒã«
Ubuntuã§å©çšå¯èœãªNginxã®ããŒãžã§ã³ã¯ãå€ãã®å Žåãå
¬åŒã®éçºè
ãªããžããªãããå€ãã§ãã ç§ã¯ææ°ããŒãžã§ã³ã䜿çšããããšããŸãããç°ãªããã¥ãŒãããå Žåã¯ãNginxãèªåã§ã€ã³ã¹ããŒã«ãããã®éšåãã¹ãããããŠãã ããã
å
¬åŒã®Ubuntuãªããžããªãsudo nano /etc/apt/sources.listã·ã¹ãã ãªã¹ãã«è¿œå ããŸãã ãã¡ã€ã«ã®æåŸã«è¡ãè¿œå ããŸãã
䜿çšããããã©ã¡ãŒã¿ãŒã¯Ubuntu 14.04ã«ã®ã¿é¢é£ããããšã«æ³šæããŠãã ããã
éçºè
ã®ãµã€ãã§ãOSã®ä»ã®ããŒãžã§ã³ãžã®ã€ã³ã¹ããŒã«ã«é¢ããæ
å ±ãæ¢ã
ãŠãã ããã ãããã®ãªããžããªããNginxãã€ã³ã¹ããŒã«ããã«ã¯ãããŒãããŠã³ããŒãããŠã·ã¹ãã ã«è¿œå ããå¿
èŠããããŸãã
wget http://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key
ããã§ãå©çšå¯èœãªããã±ãŒãžã®ãªã¹ããæŽæ°ããŠãNginxãã€ã³ã¹ããŒã«ã§ããŸãã
sudo apt-get update sudo apt-get install nginx
/etc/nginx/conf.d
ããããã©ã«ãã®æ§æãåé€ããŸãã ïŒãã¡ããããã¯ãªãŒã³ãªããµãŒããŒã§äœæ¥ããŠããªãå Žåã¯ããããå®è¡ããªãã§ãã ãããïŒæ¬¡ã®ç« ã§ã¢ããªã±ãŒã·ã§ã³ã®ä»®æ³ãã¹ããäœæããŸãã
sudo rm /etc/nginx/conf.d/* sudo service nginx restart
RVMãã€ã³ã¹ããŒã«ãã
\curl -sSL https://get.rvm.io | bash -s stable source ~/.rvm/scripts/rvm
ã¯ãªãŒã³ãªãµãŒããŒã®å Žåãããã€ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
rvm requirements
ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªRubyããŒãžã§ã³ãçŽæ¥ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ããšãã°ãæ°ããå®å®ããŒãžã§ã³2.1.3ïŒ
rvm install 2.1.3 rvm --default use 2.1.3
ruby -vããã³rvm infoã³ãã³ãã䜿çšããŠã€ã³ã¹ããŒã«ã確èªã§ããŸã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãã
確ãã«ãã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ããŒã¹ãImagemagick GPUãªã©ã®å€æ°ã®ã³ã³ããŒãã³ãïŒgemãé€ãïŒã䜿çšãããããèªåã§ã€ã³ã¹ããŒã«ãå®äºããå¿
èŠããããŸãã ããã§ãå°ããªã³ã¡ã³ããè¿œå ãã䟡å€ããããŸãïŒå¿ãããšãèªåå±éã¯å€±æããŸãïŒïŒã¬ãŒã«ã¯ãããã€ãã®ã³ã³ããŒãã³ãã§åäœããããã«è¿œå ã®ããã±ãŒãžãå¿
èŠãšããå ŽåããããŸãã ããšãã°ãMySQLã䜿çšããã«ã¯ããšããã
libmysqlclient-dev
ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
第2ç« ã¢ããªã±ãŒã·ã§ã³ã®æºå
gitã䜿çšãã
ç§ã¯ããªãããã§ã«æ¢è£œã®ã¢ããªã±ãŒã·ã§ã³ãæã£ãŠãããšä»®å®ããŸãã æåã®ã«ãŒã«ã¯ããããžã§ã¯ããGitã§ç®¡çããå¿
èŠããããšããããšã§ãã ããã¯ãééã®äžçã§ã¯äºå®äžã®æšæºã§ãïŒäœæãããŠããééã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã«ãã.gitignoreãã¡ã€ã«ã§ããããããæ瀺çã«æ瀺ããŠããŸãïŒã ããã«ãé
åã«çŽæ¥è²¬ä»»ãæã€Capistrano gemã®ææ°ããŒãžã§ã³ã¯ããã®ã·ã¹ãã ã®ã¿ããã€ãã£ãã«ãµããŒãããŸãã
ã«ãã¹ãã©ãŒããšã¯
Capistranoã®å
¬åŒã®å®çŸ©ã¯ãããªã¢ãŒããµãŒããŒã®èªååããã³å±éããŒã«ãã§ãã ãŠãŒã¶ãŒã®èŠ³ç¹ãããããšãCapistranoã¯ãSSHãä»ããŠãªã¢ãŒããµãŒããŒäžã§ä»»æã®ã³ãã³ãã»ãããå®è¡ã§ããããã«ãããã®ã§ãã å±éã«ã¯ä»ã®ããŒã«ïŒMinaãªã©ïŒããããŸããããããŸã§ã®ãšãããCapistranoãç¹å®ã®æšæºã§ããç¹ã«ã圹å²ããšã«åå²ããããµãŒããŒãå«ãè€æ°ã®ãµãŒããŒãžã®ã¢ããªã±ãŒã·ã§ã³ã®äžŠè¡å±éãå®è¡ã§ããããã§ãã
ã«ãã¹ãã©ãŒãã®ä»çµã¿
ãµãŒããŒäžã§ã¯ãCapistranoå
šäœã®å¶åŸ¡äžã«ããã¢ããªã±ãŒã·ã§ã³æ§é ã¯ã
repo
ã
releases
ã
shared
3ã€ã®ãã£ã¬ã¯ããªã§æ§æã
shared
ãŸãã æåã®ãã®ã«ã¯ãªããžããªã®ã³ããŒãå«ãŸãã2çªç®ã«ã¯ãªãªãŒã¹ãå«ãŸãã3çªç®ã«ã¯ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªããªãªãŒã¹ã«äŸåããªãå
±æãã¡ã€ã«ãå«ãŸããŸãã ãŸããã«ãŒãã«ã¯
current
ã·ã³ããªãã¯ãªã³ã¯ããããçŸåšã®ãªãªãŒã¹ã®ããŒãžã§ã³ãšãããã€ãã°ãã¡ã€ã«ãåç
§ããŸãã
ïŒããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒããïŒCapistranoã«å±éããã³ãã³ããäžãããšããµãŒããŒãžã®SSHæ¥ç¶ã確ç«ãããç°¡åãªã¢ã«ãŽãªãºã ãéå§ãããŸãã æåã«ãCapistranoã¯ãªã¢ãŒããªããžããªããã§ãã¯ããæ¬ èœããŠããã³ããããåãåããŸãã æ°ãããªãªãŒã¹ãäœæãããåŸïŒ
releases
ãã£ã¬ã¯ããªïŒã çŸåšã®ããŒãžã§ã³ã®ã³ãŒããããã«è»¢éãããããã§å€ãã®ãã¹ããå®è¡ãããŸãã
ç°¡åã«èšãã°ãCapistranoã¯æ°ãããªãªãŒã¹ããšã«
bundle install
ã
rake db:migrate
ã
rake assets:precompile
ãªã©ã®ããç¥ãããŠããã³ãã³ããå®è¡ãã競åããšã©ãŒãåžžã«ãã§ãã¯ããŸãã
default.scss
ã®ã»ãã³ãã³ãå¿ããŠãçŸåšã®
Gemfile.lock
ã³ããããããPaperclipãæ¥ç¶ããŸããããImagemagicããµãŒããŒã«ã€ã³ã¹ããŒã«ããã®ãå¿ããŸãããïŒ ããããã¹ãŠã®å Žåã«ãããŠãCapistranoã¯ãšã©ãŒã衚瀺ããçŸåšã®äœæ¥ãªãªãŒã¹ã«åœ±é¿ãäžããããšãªãã€ã³ã¹ããŒã«ãçµäºããŸãã å±éã¯æåããããçµæãããªãã«åããªãã£ãå ŽåãCapistranoã䜿çšããŠã以åã®ãªãªãŒã¹ã«
rollback
ã§ããŸãã
æ§æãã¡ã€ã«ã®æ§æ
Capistranoã®åãªãªãŒã¹ã¯ç¬ç«ãããšã³ãã£ãã£ã§ãã 次åãããã€ããããšããå®å
šã«çœ®ãæãããããããå€æ°ã®ãã¡ã€ã«ãã¢ããªã±ãŒã·ã§ã³æ§é ã®å€éšã«ä¿åããå¿
èŠããããŸãïŒååãšããŠããŠãŒã¶ãŒãããŠã³ããŒãããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠçæãããã³ã³ãã³ããããã³å€æ°ã®æ§æïŒã
å±éäžã«åæ°ãããªãªãŒã¹ã«ãªã³ã¯ããå¿
èŠããããã¡ã€ã«ã§ããå
±éãã£ã¬ã¯ããªãå¿
èŠã«ãªããŸãã å
±æãšåŒã³ããããžã§ã¯ãmkdir ./sharedã®ã«ãŒãã«ããŒã«ã«ã«äœæããŸãã以åã¯.gitignoreã«äŸå€ãè¿œå ããŠããŸããã ïŒãã¡ããããã¬ãŒãã³ã°ãªããžããªã«äŸå€ãè¿œå ããŸãããïŒ
å
±æãã£ã¬ã¯ããªã«ãå°æ¥ã®æ§é ãäºåã«äœæããŸãã ãŸãã
config
ãš
run
ãã©ã«ããŒãå¿
èŠã§ãã
config
å®éã®ããã«ãµãŒããŒã®
database.yml
ãš
secrets.yml
ãŸãã ïŒå人çã«ã¯ãããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒäžã§ããã2ã€ã®ãã¡ã€ã«ãconfigãã移åããŠãããããããžã®ãªã³ã¯ãäœæããããšã奜ã¿ãŸããïŒ
mv ./config/database.yml ./shared/config ln -fs ./shared/config/database.yml ./config/database.yml mv ./config/secrets.yml ./shared/config ln -fs ./shared/config/secrets.yml ./config/secrets.yml
Nginxèšå®
ããã§ã¯ã
shared/config
ãNginx
shared/config/nginx.conf
ãŸãã åºæ¬çãªåœ¢åŒã§ã¯ãã¢ããã¹ããªãŒã ãšå
žåçãªä»®æ³ãã¹ãã®2ã€ã®å°ããªéšåã§æ§æãããŠããŸãã æ§æãã¡ã€ã«ã®ãã¹ïŒ
ç¹ã«ãã以éïŒã«ã¯
ç¹ã«æ³šæããŠ
ãã ãã ã å±éäžã«çºçãããšã©ãŒã®90ïŒ
ã¯ãããã«é¢é£ããŠããŸããã
upstream unicorn { server unix:/home/demo/application/shared/run/unicorn.sock fail_timeout=0; } server { listen 80 default; root /home/demo/application/current/public; try_files $uri/index.html $uri.html $uri @app; location ^~ /assets/ { expires max; add_header Cache-Control public; } location @app { proxy_pass http://unicorn; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; } error_page 500 502 503 504 /500.html; location = /500.html { root /home/demo/application/current/public; } }
VPSã¯åäžã®ã¢ããªã±ãŒã·ã§ã³ã«äœ¿çšãããããããã©ã«ãã§ãã¹ãã䜿çšãããŸãã ïŒå¥ã®ç¶æ³ã§ã¯ãæ瀺çã«server_nameãæå®ããã¢ããã¹ããªãŒã åã®äžææ§ã«æ³šæããå¿
èŠãããããšã説æããå¿
èŠã¯ãããŸãããïŒïŒ
ãŠãã³ãŒã³æ§æ
Unicornãœã±ãããžã®ãã¹ã瀺ãã¢ããã¹ããªãŒã ãäœæããã®ã§ããã®æ§æã«é²ã¿ãŸãããã
Gemfile
Unicorn gemãè¿œå ããå¿
èŠããããŸãã æ°ããgemã®è¿œå ã«ã¯ããã³ãã«ã®ã€ã³ã¹ããŒã«ãšãªããžããªãžã®ã³ãããã䌎ãããšã
å¿ããªãã§
ãã ãã ã git pushãå¿ãããšãå€ãããŒãžã§ã³ã®ã³ãŒãããµãŒããŒã«ã¢ããããŒããããŸãããããã®gemããªãããããããã€æã«ãšã©ãŒãçºçããŸãã
group :production do gem 'unicorn', '~> 4.8.3' end
shared/config
ãã£ã¬ã¯ããªã§ã
unicorn.rb
ãã¡ã€ã«ãäœæããŸãã ã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ããžã®ãã¹ãææããå¿
èŠããããŸãã 䟿å®äžãå€æ°ã䜿çšããŠãããè¡ãããšãã§ããŸãã
äžéšã®ã·ã¹ãã å€ïŒ
å®å
šãªãªã¹ããšããã¥ã¡ã³ã ïŒã瀺ãããŠããŸãã ã¯ãŒã«ãŒã®æ°
worker_processes
ã«æ³šæããŠ
worker_processes
ãåã¯ãŒã«ãŒã¯ãäžå®éã®ã¡ã¢ãªïŒã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãïŒãš
timeout
ïŒéåžž
worker_processes
ç§ïŒãæ¶è²»ããŸãã å€ãã®äººã
preload_app
ã«ã€ããŠãèšåããŠã
preload_app
ïŒãã®
false
å€ã¯ã¯ãŒã«ãŒã®èµ·åæéãççž®ããå¯èœæ§ããããŸãïŒã ãšãããã
true
åæ¢ããŸãããããããããããªãã¯èªåã§æ±ºå®ããŸãã
Capistranoã®æ¥ç¶ãšæ§æ
ãšãã»ã³ã·ã£ã«ãžã§ã ãº
CapistranoãšãRVMãBundlerãããã³Railsãšã®æ¥ç¶ãå®è£
ããäžé£ã®gemãGemfileã«è¿œå ããå¿
èŠããããŸãã
group :development do gem 'capistrano', '~> 3.2.1' gem 'capistrano-rvm', '~> 0.1.1' gem 'capistrano-bundler', '~> 1.1.3' gem 'capistrano-rails', '~> 1.1.2' end
ãã³ãã«ã€ã³ã¹ããŒã«ãå®è¡ããcap installã䜿çšããŠCapistranoãåæåããŸãã ãã¡ã€ã«ã®ã»ãããäœæããããã®ãªã¹ããã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã
Capfile
ã
config/deploy.rb
ããã³
config/deploy/production.rb
3ã€ã䜿çšããŸãã ïŒ
config/deploy
Capistranoã¯ããã©ã«ãã®
staging.rb
ããã³
production.rb
ãã¡ã€ã«ãäœæããŸã
staging.rb
ã䜿çšããŠã®ã¿ããã«ãµãŒããŒãæ§æããŸããïŒ
Capfile
æŽæ°
æ©èœã䜿çšããCapistranoã«é¢é£ä»ããããŠãããã¹ãŠã®gemã¯ãã«ãŒãã§äœæããã
Capfile
ã§æ¥ç¶ããå¿
èŠããããŸãã ããã©ã«ãã®ãã¡ã€ã«ãèŠãŠãå¿
èŠãªè¡ã®ã³ã¡ã³ããå€ããã次ã®å
容ã䜿çšããŸãã
require 'capistrano/setup' require 'capistrano/deploy' require 'capistrano/rvm' require 'capistrano/bundler' require 'capistrano/rails' Dir.glob('lib/capistrano/tasks/*.rb').each { |r| import r }
å®åãµãŒããŒã®ã»ããã¢ãã
config/deploy/production.rb
ãã¡ã€ã«ãéãããã®å
容ã泚ææ·±ãèŠãŠãã ããã ãã©ãŒããããšã«ã¹ã¿ãã€ãºã®ãªãã·ã§ã³ãç解ããã®ã«åœ¹ç«ã¡ãŸãã äžè¬ã«ãSSHããŒã䜿çšããŠèªèšŒã䜿çšããå Žåãç°åœæ
ç·ãæžãå¿
èŠã¯ãããŸããã 1è¡ã ãïŒ
server '178.62.252.46', user: 'demo', roles: %w{web app}
å±éã·ããªãª
æãèå³æ·±ãéšåã§ãã
config/deploy.rb
ã ä»åŸã®å±éã®ãã©ã¡ãŒã¿ãæé ãããã³ã·ããªãªã説æããã®ã¯åœŒã§ãã ãã¡ã€ã«ã®åãããã¯ã«ã€ããŠèª¬æããŸãããæçµçãªåœ¢åŒã§èŠããå Žåã¯ããªããžããªã䜿çšããŠãã ããã
å¿
é ãã©ã¡ãŒã¿ãŒ
ãŸãããã®ã·ããªãªã®å¯Ÿè±¡ãšãªãCapistranoã®ããŒãžã§ã³ãæå®ããå¿
èŠããããŸãã
lock '3.2.1'
Capistranoã«ã¯ãããã€ãã®å¿
é ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ãã
ã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã«ãããã€ããããã®ãã¹ã決å®ãã
deploy_to
ãã©ã¡ãŒã¿ãŒãšåæ§ã«ã æ¢ã«äžèšã®ããã«åæ¥çå©çãæå³ãããšè¿°ã¹ããããå€æ°ã®å©ããåããŠã¹ã¯ãªãããã¡ã€ã«ãããæ®éåããæ¬ èœããŠãããã©ã¡ãŒã¿ãŒãèšå®ããŸãã
log_level
ãã©ã¡ãŒã¿ãŒãèšå®ããŸãïŒããã©ã«ãå€
:debug
ã¯CapistranoãããŸãã«ããããã¹ãã«ããŸãïŒïŒ
set :log_level, :info
Capistranoã°ããŒãã«å€æ°ïŒ
shared_path
ïŒãçŽæ¥äœ¿çšã§ããããšã«
泚æããŠ
ãã ãã ã setã§
set
fetch
ã¡ãœããã䜿çšã
äžæ®çºæ§ããŒã¿
以åã®ããŒãžã§ã³ã§äœæãããããŒã¿ã«ã¢ã¯ã»ã¹ããããã®äœæ¥ãªãªãŒã¹ã®å¿
èŠæ§ã«ã€ããŠã¯æ¢ã«æ€èšããŸããã ããšãã°ããŠãŒã¶ãŒãã¢ããããŒããããã¡ã€ã«ã¯
public/upload
ä¿åããŸãã ããããããããã®æ°ãããªãªãŒã¹ã«æ¥ç¶ããã«ã¯ã
config/deploy.rb
:linked_dirs
ãã©ã¡ãŒã¿ãŒ
:linked_dirs
èšå®ããŸãã
set :linked_dirs, %w{public/upload}
åå±éã§ã
public/upload
ã¯ã以åã®ãªãªãŒã¹äžã«ããŒã¿ãåéããã
shared/public/upload
ãã£ã¬ã¯ããªãžã®ã·ã³ããªãã¯ãªã³ã¯ã«çœ®ãæããããŸãã åæ§ã«ã
:linked_files
ã䜿çšãããšãåã
ã®ãã¡ã€ã«ããªã³ã¯ãããŸãã
set :linked_files, %w{config/secrets.yml config/database.yml}
æå®ããããã¡ã€ã«ïŒ
config/secrets.yml
ããã³
config/database.yml
ïŒã
config/secrets.yml
è¿œå ããå¿
èŠãããããšã«
泚æããŠ
ãã ãã ã ããããªããšãããŒã¿ããŒã¹ãžã®æ¥ç¶ããªãããã«ãããã€ã¡ã³ãã倱æããŸãã
æç¶ã
Capistranoã䜿çšãããšã䟿å®äžãåå空éã«çµã¿åãããããšãã§ããäžé£ã®ããã·ãŒãžã£ãäœæã§ããŸãã åå空é
:deploy
ãã§ã«ååšããè£è¶³ã®ã¿å¯èœã§ãã
production
ãµãŒããŒçšã«å«ãŸãããã¹ãŠã®æé ã¯ãcap production deployã³ãã³ãã§åŒã³åºãããšãã§ããŸãã
ã»ããã¢ãã
åã®æé ã®çµæã
shared
ãã£ã¬ã¯ããªãäœæã
shared
ãã£ã¬ã¯ããªã«ã¯ãç¹ã«æ§æãã¡ã€ã«ïŒ
shared/config
ïŒãå«ãŸããŠããŸãã è«ççãªæåã®ã¹ãããã¯ããããããµãŒããŒã«ã¢ããããŒãããããšã§ãã ãããè¡ãã«ã¯ãåå空é
:setup
å
ã®ãã¹ãŠãåã
config/deploy.rb
ã«ãããŸã
:setup
æé ãèšè¿°ããŸãã
namespace :setup do desc ' ' task :upload_config do on roles :all do execute :mkdir, "-p #{shared_path}" ['shared/config', 'shared/run'].each do |f| upload!(f, shared_path, recursive: true) end end end end
ãåç¥ã®ããã«ããã®æé ã§ã¯
shared_path
ãäœæãïŒãµãŒããŒã«ãŸã æ§é ãååšããªãããïŒãããã«ããŒã«ã«ã®
shared/config
ãã£ã¬ã¯ããªãããŒãããŸãã cap production setupïŒupload_configã³ãã³ãã§å®è¡ã§ããŸã
Nginx管ç
Capistranoã¯ãæ¬è³ªçã«ãªã¢ãŒããµãŒããŒã§ä»»æã®ã³ãã³ããå®è¡ããæ¹æ³ã§ããããšã«æ³šæããŸããã Nginxãå«ãæ§æãã¡ã€ã«ãããŠã³ããŒãããŸããã 次ã«ã管çã®ããã®ããã€ãã®æé ãäœæããŸããæ§æãžã®ã·ã³ããªãã¯ãªã³ã¯ã®äœæãšãµãŒãã¹ã®åèªã¿èŸŒã¿/åèµ·åïŒ
sudo
æš©éãå¿
èŠã§ãïŒã
namespace :nginx do desc ' /etc/nginx/conf.d nginx.conf ' task :append_config do on roles :all do sudo :ln, "-fs #{shared_path}/config/nginx.conf /etc/nginx/conf.d/#{fetch(:application)}.conf" end end desc ' nginx' task :reload do on roles :all do sudo :service, :nginx, :reload end end desc ' nginx' task :restart do on roles :all do sudo :service, :nginx, :restart end end after :append_config, :restart end
ããããšã«æ°ã¥ããïŒ -åãããŒã ã¹ããŒã¹å
ããã³ãããã®éã®ããŸããŸãªããã·ãŒãžã£ã®å®è¡é åºãæå®ã§ããŸãã
ãªãã£ã¹ãŠãã³ãŒã³
確ãã«ãUnicornã³ã³ãããŒã«ãã¬ãŒã³ã«Capistranoãæ¡åŒµãããžã§ã ãæ¢ã«ãããŸãããå®éã«ã©ã®ããã«æ©èœããã®ããç¥ããããšæããŸããã ãããã£ãŠãä»ãåã®äŸãšåæ§ã«ãUnicornã®2ã€ã®æé ïŒéå§ãšçµäºïŒãèšè¿°ããŸãã
set :unicorn_config, "#{shared_path}/config/unicorn.rb" set :unicorn_pid, "#{shared_path}/run/unicorn.pid" namespace :application do desc ' Unicorn' task :start do on roles(:app) do execute "cd #{release_path} && ~/.rvm/bin/rvm default do bundle exec unicorn_rails -c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D" end end desc ' Unicorn' task :stop do on roles(:app) do execute "if [ -f #{fetch(:unicorn_pid)} ] && [ -e /proc/$(cat #{fetch(:unicorn_pid)}) ]; then kill -9 `cat #{fetch(:unicorn_pid)}`; fi" end end end
ãã©ã¡ãŒã¿å€
:unicorn_config
ããã³
:unicorn_config
ãå¿ããã«èšå®ããŠãã ããã
å±éååŸã®æé
å±éåŸãæãå€ããªãªãŒã¹ïŒããã©ã«ãã§ã¯CapistranoãæåŸã®5ã€ãä¿åïŒãåé€ãããã£ãã·ã¥ãã¯ãªã¢ããŠãUnicornãåèµ·åããå¿
èŠããããŸãã ã¡ã€ã³ã®äœæ¥ãããã¯
:deploy
ã¯æ¬¡ã®ããã«ãªããŸãã
namespace :deploy do after :finishing, 'application:stop' after :finishing, 'application:start' after :finishing, :cleanup end
ããã·ãŒãžã£ãåå¥ã®ãã¡ã€ã«ã«å
¥ãã
deploy.rb
ãã¡ã€ã«ãä¹±éã«ãªããªãããã«ããããã«ãæžãããæé ããã®å€éšã§å®è¡ããããšãã§ããŸãïŒãŸãããããã¹ãã§ãïŒã
Capfile
æåŸã®è¡ããã®ãããªã¿ã¹ã¯ã
lib/capistrano/tasks
ãã£ã¬ã¯ããªããã€ã³ããŒããã圹å²ã
lib/capistrano/tasks
-ããã¯ãããžãã¯ã®ãã®éšåã移åããå Žæã§ãã
å±éã®å®è¡
ãã®æç¹ãããã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ãããŒã«ã¢ãŠãããããã«å¿
èŠãªããšã¯ãå€æŽãã³ãããããgit pushãå®è¡ããcap production deployã³ãã³ãã䜿çšããããšã ãã§ãã
åæ§ã«ã
staging
ãµãŒããŒãæ§æããããšãã§ããŸãã
staging
ãµãŒããŒã¯ããã£ããã¹ããŒãžã³ã°ãããã€ã®å®è£
å
ã§ãã
äœãã倱æããŠããŸããïŒ -ã³ã¡ã³ããæ®ããŠãèšäºãè£å®ããŸãããã
æŽæ°äºå®ïŒ
-æ¢åã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®æŠèŠïŒUnicornãéžæããå ŽåïŒã
-ããã»ã¹ç®¡çïŒãŠãã³ãŒã³ã¯ãŒã«ãŒãã©ãŒãšãããŒãžã£ãŒïŒ;
-ã¢ããã°RVMã®éžæãšæ§æã
-PPAã䜿çšããŠNginxãã€ã³ã¹ããŒã«ããŸãã
-ãã¹ã¯ãŒããªãã®sudoã«é¢ããç·šéã