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で様々な振る舞いを定義することができますので、色々独自の設定を書いて遊んでみてください。