Nginx上的SSL握手协议非常慢

我使用Nginx作为4个Apache实例的代理。 我的问题是SSL协商需要很多时间(600毫秒)。 以此为例: http : //www.webpagetest.org/result/101020_8JXS/1/details/

这是我的Nginx Conf:

user www-data; worker_processes 4; events { worker_connections 2048; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; keepalive_timeout 0; tcp_nodelay on; gzip on; gzip_proxied any; server_names_hash_bucket_size 128; } upstream abc { server 1.1.1.1 weight=1; server 1.1.1.2 weight=1; server 1.1.1.3 weight=1; } server { listen 443; server_name blah; keepalive_timeout 5; ssl on; ssl_certificate /blah.crt; ssl_certificate_key /blah.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location / { proxy_pass http://abc; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

该机器是Linode上的VPS,具有1G的RAM。 任何人都可以请告诉为什么SSL握手需要时间?

你需要禁用“ephemeral diffie-hellman”密码。 浏览器无论如何都不使用它们,但是当openSSL和cURL或者apachebench这样的工具一起使用的时候。 所以我打赌,webpagetest.org正在使用它们。

看到这个线程的更多细节。

我个人在nginx中使用这些设置来强制基于服务器首选项的最快但仍然安全的SSL密码,而不是浏览器:

更新2014-01-13:由于最近发生的RC4攻击,针对BEAST的浏览器更新以及TLS v1.2在客户端和服务器上更广泛的可用性,此build议已发生变化。

更新2015-10-16: CloudFlare推荐的当前nginx TLS设置2015-10-16。 请检查前面的链接是否有更新,因为TLSv1在某些时候可能会从推荐的configuration中删除。 目前的设置根据当前最佳实践和最新的PCI-DSS禁用了SSLv3和RC4。

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; 

这取代了此答案中的较早的build议,为了避免混淆,已经将其删除。

你可能没有一个好的熵源。 /dev/urandom是否存在? 如果不是Nginx会在读取/dev/random阻塞。

你的钥匙的大小是多less? 越长越慢。

尝试调整stream程,看看他们在做什么。

检查你是否在某个地方等待DNSparsing。

更改

 ssl_protocols SSLv2 SSLv3 TLSv1; 

 ssl_protocols SSLv3 TLSv1 SSLv2; 

按照列出的顺序尝试协议。