As Sloth As Possible

��ǽ�ʸ¤�ʥޥ���ΤǤ��ꤿ��

������Unicorn

��ʬĹ�����ȥ֥������֤��Ƥ��ޤä��Τ����ɥͥ����դ����Τǵס��ε�����

Unicorn��Passenger����٤��ä���

�ʤ�Twitter�ǡ֥����������ʤ��Ȥ���Passenger���Unicorn�Τ�®���Τˡ���������¿���ʤäƤ����餽�εդˤʤä��פä��ä�ߤ������Τǡ�����ñ��Unicorn��worker��­��ʤ��󤸤�ʤ��Ρ����֤����Τ����ɡ��ɤ��������Ȥ��Ȥ����ä򾯤��ޤȤ�롣

�ޤ���Unicorn��worker��1�ץ������ˤĤ�1�٤�1�ꥯ�����Ȥ����������ʤ����������㤨�С������绨�Ĥʷ׻������ɡ�ʿ��50ms���餤�ǥ쥹�ݥ󥹤��֤����ץ���Ȥ���С�1worker��20req/sec���餤���֤��뤫�ʤȸ��Ѥ�äơ��ԡ�������100req/sec���餤�������������ꤽ�����ä���worker��5�Ĥ��餤Ω�ƤȤ����ʡ�­��ʤ��ä���⤦����äȤ��ʡ��ߤ����˹ͤ��롣�ºݤɤ󤯤餤�Υ��������ʤΤ���ʹ���Ƥʤ��Τ��Τ�ʤ����ɡ�Nginx��10worker����Τ�Unicorn��2worker���äƸ��äƤ����顢���̵դ���ʤ����ȤĤä������Nginx�ϵդ�1worker��ʣ���ꥯ�����Ȼ�����ʿ��餯�餤Ʊ���˥�����������Ƥ��Ѥ�����餷���ˤΤ�CPU�Υ�������Ʊ��������ä�¿�����餤�Ǥ褯�ơ�Unicorn��worker�����򥬥󥬥�Ω���夲��٤���

Passenger�⤽�켫�Τ�Ʊ���ʤ�����ɡ�Passenger�ξ����پ夬�äƤ���������ɤ�����ꤷ����¤ޤǥץ������������䤷�Ƥ����Τǡ��֥������������Ƥ⶯���פΤǤϤʤ��ơ֥��������������餤�Ĥδ֤ˤ���ָƤ���ܤοͿ�����äƤ��פȤ������������Ȥ���ʤ����Ȼפ����嵭��ž��������Τϡ�Unicorn��worker�����ʤ��ס֥ꥯ�����ȿ��������Ƥ�1��1�Ĥν������֤��礷���Ѥ��ʤ��ס֥����CPU�ˤ�;͵������פäƾ��ΤȤ����Ȼפ��Τǡ�¿ʬUnicorn��worker����Ŭ�ڤʿ���Ĵ������в�褹�롣

worker�ο����䤷������꿩���󤸤㡢�äƸ����äʤ顢Unicorn��worker�ץ�������Ω���夲�����˥��ץ��preload������Ȥߤ����롣���ץ�����������ɬ�פʥ饤�֥��������ɤ߹���Ǥ���С�worker�ץ������ε�ư��ñ�ʤ�fork�ʤΤǡ�CopyOnWrite�ǿƥץ������ȥ����ͭ���Ƹ�ΨŪ�˻ȤäƤ��줽���ʵ��ۤϤ��롣����Ǥ⿩���ä��㿩�����ɤ⡢worker����Ω���夲�������­��ʤ��ʤ�ʤ�Passenger�Ǥ�Ʊ���á�ʿ����ˤ����󤷤Ƥ���뤱�ɤ⡢΢���֤��е޷�ʥ�����������˺ݤ��ƤϹ��Ƥƥץ�������������륳���Ȥ���پ夬�뤳�Ȥ⤢�뤷��ñ�Τ���Ӥ����Unicorn�Τ��ޤ����̤˶��������̥��������������������Ū������ʬ���äƤ�ʤ�Unicorn�ǡ���¿�ˤʤ��ʤ餪��ڤ�Passenger�ǡ��ߤ����ʻȤ�ʬ����

Rainbows!�äƲ�

�����ޤǤ��äϤ����ޤǡ�1��1�ĤΥꥯ�����Ȥ��礷�ƽŤ��ʤ����ɰ��٤������Υꥯ�����Ȥ������ä����٤��ʤä����ߤ����ʾ�硣�㤨�Ф��ä��Ȱ�äơ�ʿ�ѤǸ����100ms���餤�ʤ�����ɡ�20���1�󤯤餤�γ���1500ms���餤������ꥯ�����Ȥ����뤳�Ȥ����롢�Ȥ��롣���줬���ޤ���5��Ʊ���˥ꥯ�����Ȥ��Ƥ��ޤä��顢5worker�����줾��1.5�ä��Ĺ�«����Ƥ��δְ��ڥ쥹�ݥ󥹤��֤��ʤ��ʤ롣�����Ǥϥե����륵���Ф˥ǥ����ե�����񤤤Ƥ�Ȥ���DB�˽Ť��������ꤲ�Ƥ�Ȥ���APIá���Ƴ�������ǡ�����ä���Ƥ�Ȥ��ǡ��ºݤˤϥ��ץ꼫�Τ��ԤäƤ������CPU�����⥹�å��������ߤ����ʾ��֤Ǥ��äƤ⡣����ʳ��Υꥯ�����Ȥ�30ms���餤��¨���Ǥ���Τ��Ȥ��Ƥ⡣

Rainbows!�ξ���Unicorn��١����ˤ��Ƥ��뤱��ɤ⡢EventMachine�Ȥ�Revacator�ߤ����ʥ��٥�ȶ�ư�饤�֥���Ȥä�1worker������˥ꥯ�����Ȥ�����Ǥ���褦�ˤ��Ƥ��롣���ä��ߤ�����Ĺ�����Ԥ��ˤʤ�ꥯ�����Ȥ���ƤƤ⡢�ԤäƤ�֤�¾�ο���ms���٤��֤���ꥯ�����Ȥ������äƽ��������֤��롣1�ץ�����1�ꥯ�����Ȥ��Ȥ������Τ��Ǥ�Unicorn����worker�����餻�ƥ���ѥ��Ȥˤʤ뤫�⤷��ʤ��������ƥ��٥�ȥ롼�פ���ǥ��ץ꤬ư���Τ�AsyncSinatra�ߤ����ʥե졼������Ȥäƥ��ץ������Ʊ��������񤱤롣�ʤΤǽŤ��ꥯ�����Ȥ�������Ϥ��ä���Ȥ��Ȥ������ä��äˤʤ롣

�ʤ���ɤ����ȤŤ��ᤸ���Unicorn����ʤ��Ҥ���󡢤äƤʤ뤫�Ȼפ��Ф����Ǥ�ʤ���Unicorn�����⤽��prefork��1�ץ�����1�ꥯ�����ȤǤߤ����ʡ��Ҥɤ�����ڤä������褦�ˤ�äƤϳ�ȸ�ŵŪ�ʻ��ȤߤˤʤäƤ�Τϡ���Ԥ��Ƥ������٥�ȶ�ư����Thin�ߤ����ʥ��ץꥱ������󥵡��Ф��Ф��ƤΡ֥���ץ���������Τ������ڤ������ʤ��������ǥѥե����ޥ󥹤�Ф뤸���פߤ����ʥ�����ơ���Ū�ʤȤ������ä��ꤹ��Τǡ��虜�虜ʣ�������ᤷ�Ƥ�Rainbows!�Ϥ����������åȤȤΥȥ졼�ɥ��դˤʤ롣�Ȥ����ʤ�����Ũ�ʴ����ˤϤʤ뤱�ɡ�worker���䤻�в�褹�����٤��äʤ��Ǥ�Unicorn�Ǥ��礷�ƺ���ʤ���

�ɵ�

��Unicorn�����ʥ�����Хץ��������䤷���긺�餷����Ǥ��뤫�顢netstat�Ȥ����ƵͤޤäƤ������ä��鼫ư��������褦�ˤ��Ƥ롼����¿�������ʤ����ɡפäƤ����������ä���TTIN�ǥץ��������䤹��TTOU�ǥץ��������餹�Ȥ��Ǥ���Τǡ���ư�����������ߤ�����Фʤ�Ŭ���˴ƻ륹����ץȽ񤤤�Ŭ�������ʥ�����褦�ˤ��Ȥ��Ф������⡣�ޤ�������äƤ⤤������

�ɤ����Unicorn�Ȥ����Τ��ɤ��餷���Ȥ�������ʹ���Ĥ����Τǡ��ɤ�ʤ�󤸤���Ȼ�Ƥߤ뤳�Ȥˤ�����

Route 477 - �絬��Rails�����ȤΤ���ο�����HTTP�����С�Unicorn

Unicorn�ƤΤϲ��ԤʤΤ��ȸ����ȡ�Rack�ڤ�Rails���б�����Ruby��Web���ץ��Ѥ�HTTP�����С��ܤ����Ͼ�ε������ɤ�Dz�������github�Ǥ�ȤäƤ뤽���������ȡ�̾�����ʹ��ɤ��ʤ���ޤ�ط��ʤ��ˡ�

�ޤ���unicorn������

�ȸ��äƤ⡢gem install unicorn����config.ru������ǥ��쥯�ȥ��unicorn���ޥ�ɤ�á���С�thin�Ȥ���Ʊ���褦�˥����Ф���ư���롣rackup�ߴ��Υ��ץ������դ��Ƥ�Τ��ä�Ǻ�ळ�Ȥ�ʤ��Ȼפ������Ȥ����̤�Apache�Ȥ��ǥץ����������ꤷ�Ƥ��ʤ�ʤ�ʤꤹ��Ф����Ȥ��롣

������������礷�����򤯤ʤ��Τǡ��޳Ѥ������ε����˽񤤤Ƥ���褦�ˡ�nginx�ǥ����åȤǤäƤ�������򤷤Ƥߤ롣���Unicorn���������ꡣ���ʤߤ˥���ץ�˻Ȥä��Τ���ˤ�ä������404�Τ�ġ������ߤ�Apache2+Passenger��ư���Ƥ�����

# unicron.conf
worker_processes  4
working_directory '/var/www/rackapp'
listen '/tmp/rackapp.sock', :backlog => 1
listen 4423, :tcp_nopush => true
timeout 10
pid '/tmp/rackapp.pid'
preload_app  true
stderr_path '/var/log/rackapp.log'

before_fork do |server, worker|
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  sleep 1
end

after_fork do |server, worker|
  addr = "127.0.0.1:#{4423 + worker.nr}"
  server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => 1)
end

��ȤϤۤȤ��Unicorn�����������饳�ԥڡ����ʤߤˡ�nginx��侩���Ƥ�������ä�nginx������˻�����DSL�ˤʤäƤ뤱�ɡ����֤ϸ��Ƥ��̤�Ruby�����ε��ˤʤ��ưŪ������򤴤ˤ礴�ˤ�ߤ����ʤ��Ȥ�Ǥ��롣������Thin�ߤ����ˤ褷�ʤˤ�äƤϤ���ʤ����ɡ������դ������Logger���Ϥ��ʤ�Rack�Υߥɥ륦������ȤäƤʤ�Ȥ�����ʤꤹ���OK��

��Ǥ����Ŭ���ʥե�����̾����¸�����顢���Τ褦��unicorn���ޥ�ɤ�á����

$ unicorn -D -c /var/www/rackapp/unicorn.conf /var/www/rackapp/config.ru

-D���ץ����ǥǡ����ư��-c���ץ���������ե�����λ��ꡢ�Ǹ�ΰ�����rackup�ե�����Υե�ѥ������ʤߤˤ����/var/www/rackapp����ʤ��Ȥ����Ǽ¹Ԥ��Ƥߤ�������ɡ��ǽ�ϡ�working_directory�Ȥ����ꤷ�Ƥ뤫�顢�����ˤ���config.ru�򾡼���ɤ�Ǥ��줿�ꤷ�ʤ����ʡפȤ��פäƤ�������ɤ�äѤ����ǡ����θ����Хѥ��ǻ��ꤷ�Ƥߤ���require�ǥ����ơ֤���ʥե�����͡��衢�����Ͽ��Ƹ����פ��ܤ�Ф����Τǡ����Хѥ��ˤ�����Ԥ�����

���λ�����http://localhost:4423/�������ȸ����뤳�Ȥȡ�unicorn.sock������Ƥ뤳�Ȥ��ǧ���褷����nginx��

nginx�Υץ���������

����ʴ�����

�� nginx.unicorn.conf
upstream rackapp {
    server unix:/tmp/rackapp.sock;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://rackapp;
    }
}

��������ܤ�nginx.conf��http�Υ֥��å��Τɤ�����include���Ƥ�롣������äȤ��Ȥ���ʳ��ˤ����̤�nginx�κ٤�������Ϥ��Ƥ뤱�ɡ������ǤϾ�ά���Ƥޤ���

���ʤߤˡ������åȤǤ��褦�����ꤷ�Ƥ뤫�餳���ʤäƤ뤱�ɡ�TCP���ɤ����proxy_pass�ΤȤ�����http://localhost:4423�Ȥ��ˤ��Ƥ�äƤ����̤�ư����

�Ȥꤢ��������Ǵ��������Ȥ�nginx��ư���Ƥ��С������ȸ����롣��Ũ��

���󥿡��ե����������줵��Ƥ�ä���Ũ���

���䤡����ä�Rack�ǥ��󥿡��ե����������줵��Ƥ�äơ��ɤ��Ǥ���͡����ץ�¦����ޤ�Ϯ��ʤ��Ƥ⤵���äȰܹԤǤ���櫓�Ǥ������äƤ����ä򤳤ʤ����񤤤��ˡ����ȡ��Ĥ��Ǥ�Ʊ�������Ф�ư���Ƥ�HTTP::Engine�Υ��ץ�⡢apache+modperl����nginx+fcgi�˰ܹԤ��Ƥߤ����ɡ����ä�����礳�ä������Ѥ������餤�ǥ��ץ�¦������Ϯ�äƤʤ����ɤ��ʡ����������ƿ������Ķ����ФƤ����ꤷ���Ȥ��ˤϤ�äѤ�Rack��ʤ��餬������ȯ�����롣�޳ѤʤΤǼ���Plack��H::E�ΤȤ���Ʊ�����Ȥ��äƤߤ褦�ȸ�Ƥ�档

��ǡ����Unicorn���ɤ��Ρ������Ρ�

�����ĥ٥����äƤʤ��ΤǤʤ�Ȥ⡣��äƤ�������404�פ��㤢��ޤ껲�ͤˤʤ�ʤ������ʡ������������ץ������ɤ�����äƤ���fork����Ȥ�nginx¦�˵��դ����ʤ��Ѥ˺Ƶ�ư�Ǥ���Ȥ������դ����Ǥ⽽ʬ̥��Ū�ǤϤ��롣���ȡ��Ƶ�ư���ᤫ�ä���ή�С�

�����Υڡ����Υȥåץ�