server {
listen 48080;
server_name localhost;
root /home/ubuntu/DEV/ngx_mruby/build/nginx/html/;
# test for hello world and cache option
location /mruby {
mruby_rewrite_handler_code 'Nginx::Async.sleep 3000; Nginx.echo "done"';
}
}
こういう別のnginxを作って、
location /sub_req_proxy_pass {
proxy_pass http://127.0.0.1:48080/mruby;
mruby_output_body_filter_code '
Nginx.log Nginx::LOG_INFO, "read subrequest proxy pass"
';
}
location /async_http_sub_request_with_proxy_pass {
mruby_rewrite_handler_code '
Nginx::Async::HTTP.sub_request "/sub_req_proxy_pass"
res = Nginx::Async::HTTP.last_response
Nginx.rputs res.body
';
}
こういうhttp clientを作って、
[ubuntu@ubuntu-xenial:~/DEV/mruby-simplehttpserver]$ ps auwxf | grep ngin[x]
ubuntu 8463 0.6 0.1 34880 11136 pts/1 S+ 03:59 0:00 | \_ ./build/nginx/sbin/nginx
ubuntu 8420 0.1 0.1 33000 8676 pts/4 S+ 03:58 0:00 \_ ./build2/nginx/sbin/nginx -c /home/ubuntu/DEV/ngx_mruby/build2/nginx/conf/nginx.conf
どっちもシングルプロセスなのに、
[ubuntu@ubuntu-xenial:~/DEV/ngx_mruby]$ time curl 127.0.0.1:58080/async_http_sub_request_with_proxy_pass &
[1] 8559
[ubuntu@ubuntu-xenial:~/DEV/ngx_mruby]$ time curl 127.0.0.1:58080/async_http_sub_request_with_proxy_pass &
[2] 8561
[ubuntu@ubuntu-xenial:~/DEV/ngx_mruby]$ time curl 127.0.0.1:58080/async_http_sub_request_with_proxy_pass &
[3] 8563
[ubuntu@ubuntu-xenial:~/DEV/ngx_mruby]$ done
real 0m3.014s
user 0m0.004s
sys 0m0.000s
done
real 0m3.016s
user 0m0.000s
sys 0m0.004s
done
real 0m3.023s
user 0m0.004s
sys 0m0.000s
同時に3つリクエスト投げると、http clientもsleepもブロックされることなく、ちゃんと1プロセスで同時に3つ受けたリクエストを同時に3つレスポンスとしても返せている....!
もちろんこういうのも。