読者です 読者をやめる 読者になる 読者になる

人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

Trusterd HTTP/2 Webサーバで複数のサーバを簡単に立ち上げる方法

Trusterdの設定はRubyでプログラマブルに定義することができます。

それを利用することにより、一つの設定ファイルで、例えば複数のサーバを様々なパラメータで起動させることも当然できます。

今回は、HTTP/2サーバのTLS有りと無しのサーバをそれぞれ一気に起動させてみましょう。

設定は以下のように書きます。

SERVER_NAME = "Trusterd"
SERVER_VERSION = "0.0.1"
SERVER_DESCRIPTION = "#{SERVER_NAME}/#{SERVER_VERSION}"

root_dir = "/usr/local/trusterd"
run_user = "matsumotory"

tls = HTTP2::Server.new({

  :port                            => 8080,
  :document_root                   => "#{root_dir}/htdocs",
  :server_name                     => SERVER_DESCRIPTION,

  :worker                          => "auto",
  :run_user                        => run_user,

  :rlimit_nofile                   => 65535,
  :write_packet_buffer_expand_size => 4096,
  :write_packet_buffer_limit_size  => 4096,

  :key                             => "#{root_dir}/ssl/server.key",
  :crt                             => "#{root_dir}/ssl/server.crt",

})

no_tls = HTTP2::Server.new({

  :port                            => 8081,
  :document_root                   => "#{root_dir}/htdocs",
  :server_name                     => SERVER_DESCRIPTION + "/no_tls",

  :worker                          => 2,
  :run_user                        => run_user,

  :tls                             => false,

})

pid1 = Process.fork() { tls.run }
pid2 = Process.fork() { no_tls.run }

Process.waitpid pid1
Process.waitpid pid2

起動してみて、プロセスを確認してみましょう。

./bin/trusterd ./conf/trusterd.conf.multi.rb

psコマンドは以下です。

matsumo+  1756  0.0  0.0  21264  2072 pts/2    Ss    2014   0:00  \_ /bin/bash
root     63333  0.0  0.0  64952  1376 pts/2    S     2014   0:00  |   \_ sudo su
root     63334  0.0  0.0  64532  1428 pts/2    S     2014   0:00  |       \_ su
root     63335  0.0  0.0  21836  2712 pts/2    S     2014   0:05  |           \_ bash
root     46072  0.0  0.0  38380  6308 pts/2    S+   06:19   0:00  |               \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
root     46073  0.0  0.0  38380  4608 pts/2    S+   06:19   0:00  |                   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46075  0.0  0.0  46812  6212 pts/2    S+   06:19   0:00  |                   |   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46076  0.0  0.0  46812  6212 pts/2    S+   06:19   0:00  |                   |   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46078  0.0  0.0  46812  6212 pts/2    S+   06:19   0:00  |                   |   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46080  0.0  0.0  46812  6212 pts/2    S+   06:19   0:00  |                   |   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
root     46074  0.0  0.0  38380  4640 pts/2    S+   06:19   0:00  |                   \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46077  0.0  0.0  46812  5336 pts/2    S+   06:19   0:00  |                       \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb
matsumo+ 46079  0.0  0.0  46812  5336 pts/2    S+   06:19   0:00  |                       \_ /home/matsumotory/DEV/trusterd/build/bin/trusterd build/conf/trusterd.conf.multi.rb

念のためnetstatも見ます。

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      46090/trusterd  
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      46088/trusterd  
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      46087/trusterd  
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      46085/trusterd  
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      46089/trusterd  
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      46091/trusterd  

想定通り動きましたね。

tls版はworkerをautoと設定することによって自動的にサーバのCPUコア(今回はコア4つのマシン)の数だけ起動させ、no_tls版は2workerと指定しています。

今回はRlimitの設定と、起動ユーザの指定を行うために一旦rootでサーバをstartさせていますが、起動処理完了時に各workerは指定のユーザ(:run_userオプション)にsetuidされるのでご安心下さい。

ついでにアクセスしてみると、

$ nghttp -v http://127.0.0.1:8081/index.html | grep server
[  0.001] recv (stream_id=1, noind=0) server: Trusterd/0.0.1/no_tls
[root@pool:/app/docker]$ nghttp -v https://127.0.0.1:8080/index.html | grep server
[  0.008][NPN] server offers:
[  0.011] recv (stream_id=1, noind=0) server: Trusterd/0.0.1

ちゃんと動いていて、server_nameも反映されていますね。

以上のようにtrusterdはRubyで様々な振る舞いを定義することができますので、色々独自の設定を書いて遊んでみてください。