Je fais tourner une instance nginx qui agit comme point de terminaison SSL et comme équilibreur de charge de base sur un serveur virtuel EC2, et j'observe de très mauvaises performances pour les pages SSL servies à partir de la source en amont.
L'instance EC2 est une c1.medium, et devrait pouvoir supporter un débit raisonnable, mais je n'arrive pas à dépasser 60 transactions par seconde.
En servant la page d'état de nginx directement à partir du serveur, je parviens à multiplier le débit par plus de dix, ce qui n'est donc pas purement dû à la surcharge de SSL, mais si je reconfigure le serveur pour servir le même contenu sans SSL, je fais également beaucoup mieux, ce qui n'est donc pas non plus dû à la surcharge en amont. L'unité centrale est est au maximum de ses capacités lorsqu'il effectue ses 60 transactions par seconde.
J'utilise ab pour le tester, avec les paramètres "-n 1000 -c 50 -k" -- 1000 hits, concurrence de 50, keepalives activés pour que la mise en cache de la session SSL fonctionne.
Voici une configuration abrégée :
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
}
http {
sendfile off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/json;
log_format standard '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log standard;
error_log /var/log/nginx/error.log;
gzip on;
gzip_types text/plain application/json;
gzip_comp_level 1;
upstream test {
server 10.226.31.66;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/certs/both.crt;
ssl_certificate_key /etc/nginx/certs/https.key;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!kEDH:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location /v1/system/nginx {
stub_status on;
allow all;
}
location /nginx_status {
stub_status on;
allow all;
}
location / {
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffering on;
proxy_connect_timeout 15;
proxy_intercept_errors on;
}
}
}