Я запускаю экземпляр nginx, который действует как точка завершения SSL и основной балансировщик нагрузки на виртуальном сервере EC2, и вижу очень низкую производительность для страниц SSL, обслуживаемых из вышестоящего источника.
Экземпляр EC2 - это c1.medium, и он должен поддерживать разумную пропускную способность, но я не могу получить его выше 60 транзакций в секунду.
Обслуживая страницу состояния nginx непосредственно с сервера, я управляю более чем в десять раз большей пропускной способностью, так что это не чисто SSL-накладные расходы, но если я перенастрою его для обслуживания того же контента без SSL, я также буду намного лучше, так что он также не вверх по течению накладные расходы. ЦП является максимально, пока он обслуживает 60 транзакций в секунду.
Я использую ab для тестирования с параметрами «-n 1000 -c 50 -k» - 1000 обращений, параллелизм 50, пакеты поддержки активности включены, так что кеширование сеанса SSL должно работать.
Вот сокращенный конфиг:
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;
}
}
}
Я обнаружил то же самое, с HTTP, идущим со скоростью 500 ударов в секунду (ограниченная пропускная способность), а HTTPS, едва управляющим 10 (ограниченный ЦП). У меня нет решения для этого как такового, но в качестве обходного пути, который может иметь много преимуществ и мало недостатков, рассматривали ли вы прекращение использования SSL с помощью эластичных балансировщиков нагрузки Amazon? Они кажутся много быстрее с дополнительными расходами всего на несколько копеек, дешевле, чем покупка большего количества экземпляров, по крайней мере, из-за нехватки процессора.