2 votes

Performances de terminaison SSL avec Nginx sur EC2

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

2voto

Andrew Sledge Points 4883

J'ai constaté la même chose, avec le HTTP à 500 hits/sec (bande passante limitée) et le HTTPS à peine à 10 (CPU limité). Je n'ai pas de solution à ce problème en tant que tel, mais comme solution de contournement qui pourrait avoir beaucoup d'avantages et peu d'inconvénients, avez-vous envisagé de mettre fin à SSL en utilisant les équilibreurs de charge élastiques d'Amazon ? Ils semblent beaucoup plus rapide avec seulement quelques centimes de dépenses supplémentaires, moins cher que d'acheter plus d'instances en raison d'une pénurie de CPU au moins.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X