Hardware used in my test
CPU: E3-1231 v3 CPU SPECS: 4 Core, 8 Threads - 3.40GHz Memory: 32 GB Storage: 4 x 240 GB SSD Force 3 Raid adapter: 3Ware 9750
Let’s beginning with os tuning. We will tweak sysctl.conf.
# # file: '/etc/sysctl.conf' # vm.swappiness = 0 vm.max_map_count = 262144 net.ipv4.tcp_wmem = 4096 65536 33554432 net.ipv4.tcp_syn_retries = 3 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_max_tw_buckets = 5880000 net.ipv4.tcp_max_syn_backlog = 3240000 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_congestion_control = cubic net.ipv4.neigh.default.gc_thresh3 = 450560 net.ipv4.neigh.default.gc_thresh2 = 450560 net.ipv4.neigh.default.gc_thresh1 = 225280 net.ipv4.neigh.default.gc_stale_time = 7200 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.ip_forward = 1 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.all.log_martians = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.accept_redirects = 0 net.core.wmem_max = 67108864 net.core.rmem_max = 67108864 net.core.rmem_default = 67108864 net.core.wmem_default = 67108864 net.ipv4.tcp_sack = 0 net.ipv4.tcp_dsack = 0 net.ipv4.tcp_fack = 0 net.core.netdev_max_backlog = 64000 net.core.default_qdisc = fq kernel.randomize_va_space = 1 kernel.pid_max = 65536 kernel.msgmnb = 65536 kernel.msgmax = 65536 fs.nr_open = 4000000 fs.file-max = 4000000
Nginx configuration file
#
# file: '/etc/nginx/nginx.conf'
#
user www-data;
worker_processes 8;
worker_priority -15;
pid /var/run/nginx.pid;
worker_rlimit_nofile 400000;
timer_resolution 10000ms;
events {
worker_connections 20000;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 120;
keepalive_requests 100000;
client_max_body_size 128M;
client_body_timeout 40;
client_header_timeout 40;
client_body_buffer_size 128k;
client_header_buffer_size 8k;
connection_pool_size 8192;
request_pool_size 16k;
server_names_hash_max_size 2048;
server_names_hash_bucket_size 2048;
types_hash_max_size 4086;
server_tokens off;
resolver 127.0.0.1;
resolver_timeout 3s;
reset_timedout_connection on;
send_timeout 60;
open_file_cache max=400000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /dev/null;
error_log /dev/null;
include /etc/nginx/conf.d/*;
}
Virtual host example (SSL)
#
# file '/etc/nginx/sites-enabled/example.conf'
#
server {
listen 0.0.0.0:443 rcvbuf=64000 sndbuf=120000 backlog=20000 ssl http2;
server_name example.com www.example.com;
keepalive_timeout 60;
ssl on;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS:!RC4';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:TLSSL:30m;
ssl_session_timeout 10m;
ssl_buffer_size 32k;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
more_set_headers "X-Secure-Connection: true";
add_header Strict-Transport-Security max-age=315360000;
root /var/www;
location / {
root /var/www;
index index.php index.html;
}
location ~ .php$ {
fastcgi_keep_conn on;
fastcgi_pass unix:/run/php5.6-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors off;
fastcgi_buffer_size 32k;
fastcgi_buffers 32 32k;
fastcgi_connect_timeout 5;
}
location ~* ^.+.(jpg|jpeg|gif|png|svg|ico|css|less|xml|html?|swf|js|ttf)$ {
root /var/www;
expires 10y;
}
}
PHP-FPM configuration file
# # file: '/etc/php5/fpm/pool.d/www.conf' # [www] user = www-data group = www-data listen = /run/php5.6-fpm.sock listen.owner = www-data listen.group = www-data process.priority = -10 pm = ondemand pm.max_children = 2000 pm.process_idle_timeout = 10s pm.max_requests = 500
Results
Static content:
Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Concurrency Level: 100 Time taken for tests: 1.216 seconds Complete requests: 100000 Failed requests: 0 Keep-Alive requests: 100000 Total transferred: 238800000 bytes HTML transferred: 183800000 bytes Requests per second: 82207.57 [#/sec] (mean) Time per request: 1.216 [ms] (mean) Time per request: 0.012 [ms] (mean, across all concurrent requests) Transfer rate: 191710.62 [Kbytes/sec] received
Dynamic content:
Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Concurrency Level: 100 Time taken for tests: 1.342 seconds Complete requests: 100000 Failed requests: 0 Keep-Alive requests: 100000 Total transferred: 50700000 bytes HTML transferred: 15400000 bytes Requests per second: 74527.98 [#/sec] (mean) Time per request: 1.342 [ms] (mean) Time per request: 0.013 [ms] (mean, across all concurrent requests) Transfer rate: 36900.08 [Kbytes/sec] received