Battle-ready Nginx – an optimization guide
blog.zachorr.com
blog.zachorr.com
And, btw, you are giving bad advices. You are wrong here: "By default, nginx sets our keep-alive timeout to 75s (in this config, we drop it down to 10s), which means, without changing the default, we can handle ~14 connections per second. Our config will allow us to handle ~102 users per second."
No, the keepalive connections doesn't limit nginx anyhow. Nginx closes keepalive connections when it reaches connection limit.
"gzip_comp_level sets the compression level on our data. These levesls can be anywhere from 1-9, 9 being the slowest but most compressed. We’ll set it to 6, which is a good middle ground."
No, it's not "middle ground". It kill performance of your server. With 6 you will get 5-10% better compression, but twice slowness.
"use epoll;"
What's the purpose of this? The docs says: "There is normally no need to specify it explicitly, because nginx will by default use the most efficient method."
"multi_accept tells nginx to accept as many connections as possible after getting a notification about a new connection. If worker_connections is set too low, you may end up flooding your worker connections. "
No, you have completely misunderstood this directive. It isn't related to worker_connections at all.
"send_timeout 2;" Mobile clients from another continent will "thank you" for this setting when they cannot open your site.
"error_log /var/log/nginx/error.log crit;" A way to be unaware when something is wrong with your server. Nginx produces not only "crit" errors, but a bunch of very useful warnings, that need attention.
"limit_conn addr 10;" Chrome and Firefox usually open more than 10 connections. And btw, have you ever heard about NAT?
"Most browsers will open up 2 connections" 15 years ago this was true.
"and our value is 10,"
Both comments are similar in that there's no explanation why.
The correct value for limit_conn needs to be a balance between whatever your page designer or testing addons measured under normal operation, vs DOS/DDOS harm reduction (not prevention, just... reduction) where setting it to 100000 is probably a bad idea unless you're intentionally doing something really bizarre.
I liked the article for what it is, "explain which settings in nginx can be fine tuned in order to optimize performance for handling a large number of clients". It does a really poor job of explaining how to close the loop by benchmarking and monitoring followed by methodically determining which setting to fine tune and doesn't say much about config file version management either, but that's OK, it self described as a shopping list of performance oriented config options, and at that specific sub-task it delivered successfully. One minor area of improvement would have been to bracket the story with what comes before and after in the process... so your monitoring systems and operations procedures indicates xyz which implies you should ...
> Chrome and Firefox usually open more than 10 connections.
According to browserscope.org both browsers open only 6 connections per hostname.It's a shame there isn't one for reverse (HTTP) proxies: fine tuning proxy settings: proxy_buffers, buffering, etc, and other related settings when dealing with a back end application.
The OP recommends turning off gzip in MSIE6 when it was only the very first versions of IE6 that had a problem with gzip and it was fixed in later versions.
And IE6 users are known far and wide for how fervently they upgrade. ;-)
[1] Why `gzip_disable` is added: https://github.com/h5bp/server-configs/pull/92
[2] Why `gzip_disable` is removed: https://github.com/h5bp/server-configs/issues/145
This is incorrect. The system can open ~64k connections per [src ip, dst ip] pair. In the case of a webserver listening on just 1 port, it means you can open 64k connections per remote IP, which is why some people can write about how they handle a million connections on a single server.
proxy_http_version 1.1;
proxy_set_header Connection "";
In the proxy definition."ngx_pagespeed speeds up your site and reduces page load time by automatically applying web performance best practices to pages and associated assets (CSS, JavaScript, images) without requiring you to modify your existing content or workflow."
[1]: http://nginx.org/en/docs/http/ngx_http_gzip_static_module.ht...
If the limit is a hard limit it doesn't really matter what nginx decides to do, does it? I had to increase the limit by hand, outside of nginx.
Increasing an application's maximum file descriptors past ulimit -n is bad advice. The proper way is to increase the limit in /etc/security/limits.conf (note that assigning a limit to * applies it to every user but root, so if you really want to assign a limit to every user, you must assign it to both * and root) and then increase the application's max file descriptors. Restarting the application is usually required, although on newer versions of Linux, changing limits for running processes is possible.
Thats actually true with a fair amount of what people fiddle around with. I see a lot of tuning advice based on what I can only assume is guessing. I guess this is as good of a "caveat emptor" as anything.
It's like saying `for(var i=..` is faster than `.forEach` without given any numbers.
Always test for performance, do not blindy follow guides or copy paste configuration files in your web server.
The best I know if is my co-workers' efforts here: > https://github.com/genesis/wordpress/pull/64