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;
}
}
}