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;
}
}
マシンは1 GのRAMを備えたLinode上のVPSです。 SSLハンドシェイクが時代遅れになっている理由を誰か教えてください。
「ephemeral diffie-hellman」暗号を無効にする必要があります。ブラウザーはとにかくそれらを使用しませんが、openSSLはcURLやapachebenchなどのツールで使用される場合に使用します。だから私は、webpagetest.orgがそれらを使用していることに賭けています。
詳細は this thread を参照してください。
私は個人的にnginxでこれらの設定を使用して、ブラウザーではなくサーバーの設定に基づいて、最速でまだ安全なSSL暗号を強制します。
更新2014-01-13:RC4への最近の攻撃、BEASTから保護するブラウザーの更新、およびクライアントとサーバーでのTLS v1.2のより広範な可用性を考慮して、このアドバイスは変更されました。
2015-10-16を更新: CloudFlare によって推奨される現在のnginx TLS設定2015-10-16。 TLSv1は推奨される構成から削除される可能性があるため、前のリンクで更新を確認してください。現在の設定では、現在のベストプラクティスとこの日付の最新の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;
これは、混乱を避けるために削除された、この回答の以前のアドバイスに優先します。
あなたは良いエントロピー源を持っていないかもしれません。 /dev/urandom
は存在しますか?そうでない場合、Nginxは/dev/random
の読み取りをブロックします。
鍵のサイズはどれくらいですか?長いほど遅くなります。
プロセスをstrace
ingして、プロセスの動作を確認してください。
どこかでDNS解決を待っていないことを確認してください。
変化する
ssl_protocols SSLv2 SSLv3 TLSv1;
に
ssl_protocols SSLv3 TLSv1 SSLv2;
リストされている順序でプロトコルを試行します。