jhit
9/29/2012 - 7:27 PM

RVM + Puma + Ubuntu

RVM + Puma + Ubuntu

description "Puma webservice for bmsweb"
author      "Piotr Zolnierek <pz@anixe.pl>"

respawn
respawn limit 15 5

env PADRINO_ENV=acceptance
env APP_PATH=/opt/bmsweb/current
env LOG=/var/log/nginx/puma_bmsweb.log
env BASE_URI=/bmsweb

console output
chdir /opt/bmsweb/current

script 
	exec su root -c bash -l -c "cd $APP_PATH && PADRINO_ENV=$PADRINO_ENV SCRIPT_NAME=$BASE_URI RACK_BASE_URI=$BASE_URI  bundle exec puma -b 'unix:///tmp/puma.sock' -S $APP_PATH/tmp/puma >> $LOG"
end script
# default 8-16 threads
# notice the number of failed requests

> ab -c 20 -n 1000  '***secret***'

Server Software:        nginx/1.0.15
Server Hostname:        hotx.resfinity.com
Server Port:            9099

Document Path:          ***secret***
Document Length:        173 bytes

Concurrency Level:      20
Time taken for tests:   64.359 seconds
Complete requests:      1000
Failed requests:        980
   (Connect: 0, Receive: 0, Length: 980, Exceptions: 0)
Write errors:           0
Non-2xx responses:      20
Total transferred:      15148480 bytes
HTML transferred:       14366340 bytes
Requests per second:    15.54 [#/sec] (mean)
Time per request:       1287.179 [ms] (mean)
Time per request:       64.359 [ms] (mean, across all concurrent requests)
Transfer rate:          229.86 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    3   3.0      2      24
Processing:     3 1273 3490.3   1053   64263
Waiting:        3 1270 3490.4   1048   64261
Total:          6 1276 3490.3   1055   64267

Percentage of the requests served within a certain time (ms)
  50%   1055
  66%   1240
  75%   1390
  80%   1470
  90%   1707
  95%   2039
  98%   2531
  99%   2801
 100%  64267 (longest request)
> ab -c 20 -n 1000  '***secret***'

Server Software:        nginx/1.0.15
Server Hostname:        hotx.resfinity.com
Server Port:            8088

Document Path:          ***secret***
Document Length:        14656 bytes

Concurrency Level:      20
Time taken for tests:   20.504 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      15536000 bytes
HTML transferred:       14656000 bytes
Requests per second:    48.77 [#/sec] (mean)
Time per request:       410.086 [ms] (mean)
Time per request:       20.504 [ms] (mean, across all concurrent requests)
Transfer rate:          739.94 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    4   2.3      3      20
Processing:   113  402 148.1    390    1179
Waiting:      110  398 148.1    386    1177
Total:        117  406 148.0    394    1182

Percentage of the requests served within a certain time (ms)
  50%    394
  66%    428
  75%    480
  80%    519
  90%    581
  95%    701
  98%    798
  99%    897
 100%   1182 (longest request)
# created by pzol for testing independent worker pools, do not delete, please
upstream puma {
  server unix://tmp/puma.sock fail_timeout=0;
}

server {
  listen             9099;
  server_name        localhost;
  root               /var/www/root;
  error_log          /var/log/nginx/puma_error.log;
  access_log         /var/log/nginx/puma_access.log;
 
  location /bmsweb {
    rewrite ^/bmsweb/(/?)(.*) /$2 break;
    proxy_pass  http://puma;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location /static/ {
      alias /usr/local/nginx/static/;
  }
  rack_env           acceptance;
}

Running Puma on Nginx

I use the latest Puma v1.4.0 from rubygems.

Make sure you have nginx installed with these options:

>/opt/nginx/sbin/nginx -V
nginx version: nginx/1.0.15
built by gcc 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_gzip_static_module --with-cc-opt=-Wno-error --add-module=/usr/local/rvm/gems/ruby-1.9.3-p0/gems/passenger-3.0.12/ext/nginx --with-http_ssl_module --with-pcre=/tmp/pcre/pcre-8.30

We installed nginx using passenger as you can see above, as we run currently most apps with it, but that is of course not required for puma to run.