NGINX / PHP-FPM extremamente lento quando acessado via https / SSL

3

Começando cerca de uma semana atrás, comecei a notar um desempenho terrível na minha webapp.

Minha inscrição é veiculada em uma instância do Amazon EC2 m1.large.

Arquivos estáticos de apenas 4-5kb costumavam levar mais de 10 segundos para receber. Isso aconteceria intermitentemente, mas para cada carregamento de página, eu poderia esperar pelo menos um ou dois grandes tempos de espera para um recurso em particular.

Verificando o Firebug Estava claro que o atraso estava na parte 'aguardando' do pedido. (DNS / conexão / envio e recebimento sempre foram bons)

Infelizmente, ainda não tenho a reputação necessária para postar uma imagem, ou gostaria de fazer isso.

Para piorar a situação, quando uma página solicita muitos recursos estáticos, como Imagens, quase todas as solicitações parecem exibir esse problema.

Tendo brincado com minha configuração NGINX e PHP-FPM, a última semana não cheguei até hoje, quando percebi que o problema parece existir apenas quando o servidor é acessado via HTTPS.

Isso pode ser visto ao usar o comando ab para testar o desempenho.

HTTPS:

ab -c 100 -n 3000 https://www.mydomain.com/

    Server Port:            443
SSL/TLS Protocol:       TLSv1,RC4-SHA,2048,128

Document Path:          /
Document Length:        13367 bytes

Concurrency Level:      100
Time taken for tests:   12.122 seconds
Complete requests:      3000
Failed requests:        0
Write errors:           0
Total transferred:      41205000 bytes
HTML transferred:       40101000 bytes
Requests per second:    247.48 [#/sec] (mean)
Time per request:       404.067 [ms] (mean)
Time per request:       4.041 [ms] (mean, across all concurrent requests)
Transfer rate:          3319.52 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       13  219  91.2    216     577
Processing:    18  178  83.5    166     562
Waiting:       10  168  80.5    156     549
Total:         60  397 124.9    386     809

HTTP:

 ab -c 100 -n 3000 http://www.mydomain.com/

    Server Port:            80

    Document Path:          /
    Document Length:        184 bytes

    Concurrency Level:      100
    Time taken for tests:   0.468 seconds
    Complete requests:      3000
    Failed requests:        0
    Write errors:           0
    Non-2xx responses:      3000
    Total transferred:      1431000 bytes
    HTML transferred:       552000 bytes
    Requests per second:    6404.06 [#/sec] (mean)
    Time per request:       15.615 [ms] (mean)
    Time per request:       0.156 [ms] (mean, across all concurrent requests)
    Transfer rate:          2983.14 [Kbytes/sec] received

    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        3    7   2.2      8      11
    Processing:     2    8   2.4      7      18
    Waiting:        1    6   2.0      6      16
    Total:         11   15   1.4     15      28

Eu sou muito inexperiente quando se trata de diagnosticar esses tipos de problemas e é bem possível que eu esteja interpretando mal a saída da ferramenta acima. Independentemente disso, apesar de uma enorme quantidade de pesquisa no Google eu ainda não sei por onde começar.

A parte relevante do meu nginx.conf :

 #SSL certs
 ssl on;
 ssl_certificate /etc/ssl/certs/mycert.crt;
 ssl_certificate_key /etc/ssl/certs/mycert.key;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
 ssl_session_cache   shared:SSL:10m;
 ssl_session_timeout 10m;                          
 ssl_prefer_server_ciphers   on;

Em primeiro lugar, gostaria de saber se pareço estar no caminho certo com a minha afirmação de que é o SSL / HTTPS que está causando o problema. Em segundo lugar, como há alguma sugestão de como eu iria corrigi-lo?

A mesma configuração funcionou perfeitamente até recentemente, por isso não tenho a certeza do que aconteceu.

Muito obrigado antecipadamente.

    
por user2616246 05.09.2013 / 17:16

1 resposta

7
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;

Você precisará remover a entrada

ECDHE-RSA-AES256-SHA384

que ativa a curva elíptica Diffie-Helman Ecrã efêmera e substitui-a por

!kEDH
A menos que você exija um perfeito sigilo de encaminhamento, isso é desnecessário e é a causa dos longos atrasos que você está vendo para as solicitações. A entrada de cifra ALTA deve ser perfeitamente razoável para a maioria das aplicações.

* Uma edição rápida: você pode dar uma olhada em quais cifras estão sendo negociadas usando o utilitário de linha de comando openssl:

openssl s_client -host HOSTNAME -port 443

Substituindo o nome do host pelo ip ou nome de domínio do servidor que você está visualizando. Se você ver 'DHE-RSA-AES256-SHA' na linha 'Cipher' antes destas mudanças, então este é provavelmente o problema.

    
por 05.09.2013 / 18:33