Static files @ 50 req a second. using nginx and 2 mongrels?

hi,
i have a static page about.html in my railsapp/public folder. when
running a httperf, i am only getting around 50 requests a second.
shouldnt it be a few hundred per second?

actually,

when getting the 50 reqs a second, i am on a different computer on my
LAN. however, when performing the httperf on the same computer as nginx,
i am now getting 5000 req/second.

On 11 Feb 2008, at 09:39, Bbq P. wrote:

hi,
i have a static page about.html in my railsapp/public folder. when
running a httperf, i am only getting around 50 requests a second.
shouldnt it be a few hundred per second?

Yes, it should be way higher. Do you have configured your nginx to
serve the statics, or are the mongrels serving them? Mongrel isn’t
good at serving static conent, use nginx for that.

Frank

Make sure nginx is configured to serve the content?

----- Original Message -----
From: “Bbq P.” [email protected]
To: [email protected]
Sent: Monday, February 11, 2008 12:39 AM
Subject: static files @ 50 req a second. using nginx and 2 mongrels?

On Mon, Feb 11, 2008 at 09:44:02AM +0100, Bbq P. wrote:

when getting the 50 reqs a second, i am on a different computer on my
LAN. however, when performing the httperf on the same computer as nginx,
i am now getting 5000 req/second.

Probalby you set
tcp_nodelay off;

It should be on (default).

On Mon, Feb 11, 2008 at 03:40:34PM +0100, Bbq P. wrote:

hi, here is the config i am using. since i am getting such a large
return for static requests (5000 a second) on my localhost, should that
not indicate the conf is set to serve static by nginx? when testing
static content on localhost on apache, i was getting 500 requests a
second. nginx is ridiculously quick!

however, my other computer on the LAN connected via 802.11b, seems to
get max rate of 50 req/sec on both nginx and apache. i guess my
bandwidth is the bottleneck? i tried setting tcpnodelay to on, however
it doesnt change anything performing the httperf test.

Yes, 802.11b is 11Mbit/s network with big latencies.

thank you Igor!

Igor S. wrote:

On Mon, Feb 11, 2008 at 03:40:34PM +0100, Bbq P. wrote:

hi, here is the config i am using. since i am getting such a large
return for static requests (5000 a second) on my localhost, should that
not indicate the conf is set to serve static by nginx? when testing
static content on localhost on apache, i was getting 500 requests a
second. nginx is ridiculously quick!

however, my other computer on the LAN connected via 802.11b, seems to
get max rate of 50 req/sec on both nginx and apache. i guess my
bandwidth is the bottleneck? i tried setting tcpnodelay to on, however
it doesnt change anything performing the httperf test.

Yes, 802.11b is 11Mbit/s network with big latencies.

hi, here is the config i am using. since i am getting such a large
return for static requests (5000 a second) on my localhost, should that
not indicate the conf is set to serve static by nginx? when testing
static content on localhost on apache, i was getting 500 requests a
second. nginx is ridiculously quick!

however, my other computer on the LAN connected via 802.11b, seems to
get max rate of 50 req/sec on both nginx and apache. i guess my
bandwidth is the bottleneck? i tried setting tcpnodelay to on, however
it doesnt change anything performing the httperf test.

thanks for any help!

Basic config modified only slightly from

http://brainspl.at/articles/2007/01/03/new-nginx-conf-with-optimizations

Turns SSI on and uses locations as defined in install-nginx.sh script.

See also http://topfunky.net/svn/shovel/nginx

USE AT YOUR OWN RISK!

user and group to run as

user deploy deploy;

number of nginx workers

worker_processes 1;

pid of nginx master process

pid /usr/local/nginx/logs/nginx.pid;

Number of worker connections. 1024 is a good default

events {
worker_connections 1024;
}

start the http module where we config http access.

http {

pull in mime-types. You can break out your config

into as many include’s as you want to make it cleaner

include /usr/local/nginx/conf/mime.types;

set a default type for the rare situation that

nothing matches from the mimie-type include

default_type application/octet-stream;

configure log format

log_format main '$remote_addr - $remote_user [$time_local] ’
'“$request” $status $body_bytes_sent “$http_referer” ’
‘“$http_user_agent” “$http_x_forwarded_for”’;

main access log

access_log /usr/local/nginx/logs/nginx_access.log main;

main error log

error_log /usr/local/nginx/logs/nginx_error.log debug;

no sendfile on OSX

sendfile on;

These are good default values.

tcp_nopush on;
tcp_nodelay on; #off;

output compression saves bandwidth

gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript
text/xml application/xml application/xml+rss text/javascript;

this is where you define your mongrel clusters.

you need one of these blocks for each cluster

and each one needs its own name to refer to it later.

Rename to mongrel_site1, mongrel_site2, etc if using

virtual hosts.

upstream mongrel {
server 127.0.0.1:8002;
server 127.0.0.1:8003;
server 127.0.0.1:7000;
}

Copy this section on down and put into a separate file

if you want to organize your virtual hosts in files.

Then include here with

include /usr/local/nginx/conf/vhosts/my_subdomain.conf

the server directive is nginx’s virtual host directive.

server {
# port to listen on. Can also be set to an IP:PORT.
listen 3050;

# Set the max size for file uploads to 50Mb
client_max_body_size 50M;

# sets the domain[s] that this vhost server requests for
# server_name www.[engineyard].com [engineyard].com;

# doc root
root /var/www/app3x/public;

# vhost specific access log
access_log  /var/www/app3x/nginx.vhost.access.log  main;

# NOTE Uncomment and edit to redirect all subdomains back to 

# Useful for sending .net and .org variants back to your site.
# if ($host !~ ^domain.com$) {
# rewrite ^.+ http://domain.com$uri permanent;
# break;
# }

# this rewrites all the requests to the maintenance.html
# page if it exists in the doc root. This is for capistrano's
# disable web task
if (-f $document_root/system/maintenance.html) {
  rewrite  ^(.*)$  /system/maintenance.html last;
  break;
}

location / {
  # Uncomment to allow server side includes so nginx can
  # post-process Rails content
  ## ssi on;

  # needed to forward user's IP address to rails
  proxy_set_header  X-Real-IP  $remote_addr;

  # needed for HTTPS
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect false;
  proxy_max_temp_file_size 0;

  # If the file exists as a static file serve it directly without
  # running all the other rewite tests on it
  if (-f $request_filename) {
    break;
  }

  # check for index.html for directory index
  # if its there on the filesystem then rewite
  # the url to add /index.html to the end of it
  # and then break to send it to the next config rules.
  if (-f $request_filename/index.html) {
    rewrite (.*) $1/index.html break;
  }

  # this is the meat of the rails page caching config
  # it adds .html to the end of the url and then checks
  # the filesystem for that file. If it exists, then we
  # rewite the url to have explicit .html on the end
  # and then send it on its way to the next config rule.
  # if there is no file on the fs then it sets all the
  # necessary headers and proxies to our upstream mongrels
  if (-f $request_filename.html) {
    rewrite (.*) $1.html break;
  }

  if (!-f $request_filename) {
    # Use other cluster name here if you are running multiple
    # virtual hosts.
    proxy_pass http://mongrel;
    break;
  }
}

error_page   500 502 503 504  /500.html;
location = /500.html {
  root   /var/www/app3x/public;
}

}

This server is setup for ssl. Uncomment if

you are using ssl as well as port 80.

server {

# port to listen on. Can also be set to an IP:PORT

listen 443;

# Set the max size for file uploads to 50Mb

client_max_body_size 50M;

# sets the domain[s] that this vhost server requests for

# server_name www.[engineyard].com [engineyard].com;

# doc root

root /var/www/apps/mysite.com/current/public;

# vhost specific access log

access_log

/var/www/apps/mysite.com/shared/log/nginx.vhost.access.log main;

# NOTE See also

http://blog.imperialdune.com/2007/3/31/setting-up-godaddy-turbo-ssl-on-nginx

# if you are buying a GoDaddy SSL cert.

ssl on;

ssl_certificate /var/keys/domain.com.crt;

ssl_certificate_key /var/keys/domain.com.key;

# NOTE Uncomment and edit to redirect all subdomains back to

# Useful for sending .net and .org variants back to your

site.

if ($host !~ ^domain.com$) {

rewrite ^.+ https://domain.com$uri permanent;

break;

}

# this rewrites all the requests to the maintenance.html

# page if it exists in the doc root. This is for capistrano’s

# disable web task

if (-f $document_root/system/maintenance.html) {

rewrite ^(.*)$ /system/maintenance.html last;

break;

}

location / {

# needed to forward user’s IP address to rails

proxy_set_header X-Real-IP $remote_addr;

# needed for HTTPS

proxy_set_header X_FORWARDED_PROTO https;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_redirect false;

proxy_max_temp_file_size 0;

# If the file exists as a static file serve it directly without

# running all the other rewite tests on it

if (-f $request_filename) {

break;

}

# check for index.html for directory index

# if its there on the filesystem then rewite

# the url to add /index.html to the end of it

# and then break to send it to the next config rules.

if (-f $request_filename/index.html) {

rewrite (.*) $1/index.html break;

}

# this is the meat of the rails page caching config

# it adds .html to the end of the url and then checks

# the filesystem for that file. If it exists, then we

# rewite the url to have explicit .html on the end

# and then send it on its way to the next config rule.

# if there is no file on the fs then it sets all the

# necessary headers and proxies to our upstream mongrels

if (-f $request_filename.html) {

rewrite (.*) $1.html break;

}

if (!-f $request_filename) {

proxy_pass http://mongrel;

break;

}

}

error_page 500 502 503 504 /500.html;

location = /500.html {

root /var/www/apps/mysite.com/current/public;

}

}

}