HTTPS è oltre 50 volte più lento di HTTP


8

Ho un sito Web che utilizza https per trasmettere un file javascript al client. Il sito web è getsimpleapps.com .

Si scopre che questo file si sta caricando 52 volte più lentamente con https (20.08s - 29.08s) che con http (380ms).

La homepage del sito condivide la stessa lentezza del file javacript.

Di recente sono passato da dreamhost a linode e ho hackerato per far funzionare SSL sul nuovo server fino a quando non lo ha fatto. Non ho fatto nessuna configurazione folle.

Il linode esegue Ubuntu 12.04 e il sito si trova in cima a uno stack (LAMP).

La mia domanda alla comunità di overflow dello stack è: come posso fare per correggere SSL e HTTPS sul mio server? So che lo overflow dello stack è pieno di domande sulla lentezza dell'HTTPS, ma non vengono fornite soluzioni reali. Un tutorial o una guida alla configurazione di Ubuntu sarebbe l'ideale.


file: /etc/apache2/sites-enabled/getsimpleapps.com

<VirtualHost *:80>
     ServerAdmin admin@getsimpleapps.com
     ServerName getsimpleapps.com
     ServerAlias www.getsimpleapps.com
     DocumentRoot /srv/sites/getsimpleapps.com/public/
     ErrorLog /srv/sites/getsimpleapps.com/logs/error.log
     CustomLog /srv/sites/getsimpleapps.com/logs/access.log combined
</VirtualHost>

<VirtualHost 50.116.58.18:443>
     SSLEngine On
     #SSLCertificateFile /etc/apache2/ssl/www.getsimpleapps.com.crt
     #SSLCertificateKeyFile /etc/apache2/ssl/www.getsimpleapps.com.key
     #SSLCACertificateFile /etc/apache2/ssl/comodo.crt
     SSLCertificateFile /etc/apache2/ssl/dreamhost/dh.crt
     SSLCertificateKeyFile /etc/apache2/ssl/dreamhost/dh.key
     SSLCACertificateFile /etc/apache2/ssl/dreamhost/dh.cer

     ServerAdmin admin@getsimpleapps.com
     ServerName getsimpleapps.com
     ServerAlias www.getsimpleapps.com
     DocumentRoot /srv/sites/getsimpleapps.com/public/
     ErrorLog /srv/sites/getsimpleapps.com/logs/error.log
     CustomLog /srv/sites/getsimpleapps.com/logs/access.log combined
</VirtualHost>

Arricciatura da workstation locale

thomas@workstation:~$ time curl -Iv https://getsimpleapps.com/
* About to connect() to getsimpleapps.com port 443 (#0)
*   Trying 50.116.58.18... connected
* Connected to getsimpleapps.com (50.116.58.18) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: OU=Domain Control Validated; OU=Provided by New Dream Network, LLC; OU=DreamHost Basic SSL; CN=getsimpleapps.com
*    start date: 2012-02-23 00:00:00 GMT
*    expire date: 2013-02-22 23:59:59 GMT
*    subjectAltName: getsimpleapps.com matched
*    issuer: C=GB; ST=Greater Manchester; L=Salford; O=Comodo CA Limited; CN=PositiveSSL CA
*    SSL certificate verify ok.
> HEAD / HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: getsimpleapps.com
> Accept: */*
> 
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Thu, 02 Aug 2012 20:31:39 GMT
Date: Thu, 02 Aug 2012 20:31:39 GMT
< Server: Apache/2.2.22 (Ubuntu)
Server: Apache/2.2.22 (Ubuntu)
< X-Powered-By: PHP/5.3.10-1ubuntu3.2
X-Powered-By: PHP/5.3.10-1ubuntu3.2
< Set-Cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2298c7e45da25e4aaf80f7a1e36ed4a006%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%2250.75.209.154%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A81%3A%22curl%2F7.21.4+%28universal-apple-darwin11.0%29+libcurl%2F7.21.4+OpenSSL%2F0.9.8r+zlib%2F1.2.5%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1343939499%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D80bf8ae5040fc47780ccd59f1fb8b267; expires=Thu, 02-Aug-2012 22:31:39 GMT; path=/
Set-Cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2298c7e45da25e4aaf80f7a1e36ed4a006%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%2250.75.209.154%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A81%3A%22curl%2F7.21.4+%28universal-apple-darwin11.0%29+libcurl%2F7.21.4+OpenSSL%2F0.9.8r+zlib%2F1.2.5%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1343939499%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7D80bf8ae5040fc47780ccd59f1fb8b267; expires=Thu, 02-Aug-2012 22:31:39 GMT; path=/
< Vary: Accept-Encoding
Vary: Accept-Encoding
< Content-Type: text/html
Content-Type: text/html

< 
* Connection #0 to host getsimpleapps.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

real    0m29.078s
user    0m0.018s
sys 0m0.005s

Curl dal server Linode (tramite SSH)

thomas@vannevar:~$ time curl -Iv https://getsimpleapps.com/happy-ending/api/script.js?shop=holstee.myshopify.com
* About to connect() to getsimpleapps.com port 443 (#0)
*   Trying 50.116.58.18... connected
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: OU=Domain Control Validated; OU=Provided by New Dream Network, LLC; OU=DreamHost Basic SSL; CN=getsimpleapps.com
*    start date: 2012-02-23 00:00:00 GMT
*    expire date: 2013-02-22 23:59:59 GMT
*    subjectAltName: getsimpleapps.com matched
*    issuer: C=GB; ST=Greater Manchester; L=Salford; O=Comodo CA Limited; CN=PositiveSSL CA
*    SSL certificate verify ok.
> HEAD /happy-ending/api/script.js?shop=holstee.myshopify.com HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: getsimpleapps.com
> Accept: */*
> 
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Thu, 02 Aug 2012 20:43:30 GMT
Date: Thu, 02 Aug 2012 20:43:30 GMT
< Server: Apache/2.2.22 (Ubuntu)
Server: Apache/2.2.22 (Ubuntu)
< X-Powered-By: PHP/5.3.10-1ubuntu3.2
X-Powered-By: PHP/5.3.10-1ubuntu3.2
< Set-Cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2204a54136cab08f9fdc5f082ebb8e739a%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%2250.116.58.18%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A97%3A%22curl%2F7.22.0+%28i686-pc-linux-gnu%29+libcurl%2F7.22.0+OpenSSL%2F1.0.1+zlib%2F1.2.3.4+libidn%2F1.23+librtmp%2F2.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1343940210%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7De7d7b8e2ca69b34c531ba7472b4b21b7; expires=Thu, 02-Aug-2012 22:43:30 GMT; path=/
Set-Cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2204a54136cab08f9fdc5f082ebb8e739a%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%2250.116.58.18%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A97%3A%22curl%2F7.22.0+%28i686-pc-linux-gnu%29+libcurl%2F7.22.0+OpenSSL%2F1.0.1+zlib%2F1.2.3.4+libidn%2F1.23+librtmp%2F2.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1343940210%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3B%7De7d7b8e2ca69b34c531ba7472b4b21b7; expires=Thu, 02-Aug-2012 22:43:30 GMT; path=/
< Content-Type: text/javascript
Content-Type: text/javascript
* no chunk, no close, no size. Assume close to signal end

< 
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

real    0m25.991s
user    0m0.015s
sys 0m0.022s

1
"It turns out that this file is loading 52% slower with https (20.08s - 29.08s) that with http (380ms)."- eh? Puoi ricontrollare le tue unità e la grammatica lì, per favore. Non ha molto senso.
MDMarra,

1
Penso che l'OP abbia significato 53 volte più lentamente. L'HTTPS si sta caricando molto lentamente.

Forse hai semplicemente lasciato cadere virtualmin su di esso e gli hai permesso di configurare tutto per te.
Andrew Smith,

1
Hmm. Questo è sbagliato. C'è qualcosa nei registri di Apache che può indicare dove si trova il rallentamento? Sul mio server, vedo che ci vogliono 263ms per HTTPS e 84ms per HTTP. La grande differenza che stai vedendo è dovuta a qualcos'altro.
cjc

1
Si prega di incollare la configurazione di Apache.
Michael Hampton,

Risposte:


3

Ho avuto lo stesso problema, con differenze di tempo di risposta quasi identiche tra HTTP e HTTPS. Si scopre che il problema era come nella risposta di @htmltiger : Apache2 stava semplicemente esaurendo i processi di lavoro.

Ciò provoca l'accodamento di nuove richieste fino a quando un lavoratore diventa libero e può elaborare il successivo [ sorgente ]. Suppongo che il motivo per cui ciò influisca solo su HTTPS e non anche su HTTPS sia che quasi tutto il traffico è su HTTP e Apache dà alle richieste HTTP e HTTPS la stessa priorità, prendendo una richiesta a turno da ciascuna coda. Pertanto, quando la coda HTTPS è molto più lunga, le richieste attendono molto più tempo. In effetti ci sono due code, poiché la coda è semplicemente il meccanismo della coda di connessione TCP Linux e Linux fornisce una coda per porta.

Diagnostica

Se questo è il tuo problema, verranno applicati i seguenti sintomi:

  • L'indicatore migliore: sul tuo server, apachectl statusmostra che tutti i processi di lavoro consentiti sono in esecuzione. Questo è il caso in cui nessun punto .viene mostrato nella riga del quadro di valutazione del processo, indicando che non è rimasto alcun "slot aperto senza processo corrente". La linea potrebbe apparire così, ad esempio:

    KKKKKKRKKKRRCWKKKCCKWKKKKCRCKKKKKKKCKCKKKKWRKKKKWRWKKKKKKCWKKWKKK
    
  • Vengono visualizzati messaggi come questo nel registro degli errori principale di Apache2 ( /var/log/apache2/error.log, non in quelli specifici del dominio):

    [mpm_prefork:error] [pid 4715] AH00161: server reached MaxRequestWorkers 
        setting, consider raising the MaxRequestWorkers setting
    
  • Esistono molti processi nel backlog di Apache. Secondo questo articolo approfondito , è possibile vedere questo dal unacked:valore ss -lti '( sport = :https )'nell'output. A seconda della versione o della configurazione di ss, tuttavia, quel valore potrebbe mancare.

  • La maggior parte del ritardo (diciamo, 17 di 20 s) viene mostrato nella console di rete di Firefox, nella scheda "Tempi" per l'URL iniziale richiesto, come "Blocco".

Soluzione

Ciò presuppone che tu usi il modulo server MPM prefork in Apache. È simile per i moduli MPM "evento" e "lavoratore" - dettagli .

  1. Modifica /etc/apache2/mods-enabled/mpm_prefork.confe aumenta l' MaxRequestWorkersimpostazione.

  2. Se lo aumenti oltre il valore predefinito di 256, devi anche impostare ServerLimit sullo stesso valore per rendere effettiva la modifica.

  3. Applica le modifiche: service apache2 reload

  4. Assicurarsi che nell'output del tabellone sia attiva apachectl statusla nuova MaxRequestWorkersimpostazione. Deve essere equivalente alla lunghezza della linea del tabellone segnapunti in caratteri.

  5. Se l'impostazione non è ancora valida, cerca le /etc/apache2vecchie direttive di configurazione (e i loro sinonimi obsoleti ancora più vecchi) che potrebbero sovrascrivere le modifiche:

    grep -R MaxRequestWorkers /etc/apache2/*
    grep -R MaxClients /etc/apache2/*
    

Diagnosi differenziali

Nel caso in cui HTTPS sia molto più lento di HTTP ma non ogni volta in una serie di ricariche di pagine (solo in media), allora potresti avere una variante di questo problema , con due server Apache2 in esecuzione sulla porta SSL 443.


0

Prova a cambiare la cifra in RC4-MD5 (buon equilibrio tra prestazioni e sicurezza), ovvero:

SSLCipherSuite RC4-MD5

Saluti


2
La disparità segnalata tra HTTP e HTTPS non è causata da una scelta di cifratura. È un'altra configurazione errata.
cjc

@cjc Mi piacerebbe vedere se fa la differenza ... non può far male provare.
HTTP500

@ HTTP500 metti questo in httpd.conf? Che dire SSLProtocol all?
ThomasReggi,

@ThomasReggi, mettilo sotto il tuo SSLEngine On line. Suggerirei: SSLProtocol all -SSLv2
HTTP500

Che cosa?! ora è molto più veloce. Non ho riavviato apache2 va bene?
ThomasReggi,

0

Ho avuto un problema simile per un server occupato ma aumentando MaxRequestWorkers a 400 in mpm_prefork.conf è stato risolto.


-1

Risulta che il mio problema era che le mie chiavi provenivano da un altro server. Avevo bisogno di ottenere un nuovo certificato e configurarlo con nuove chiavi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.