HTTPS ist über 50-mal langsamer als HTTP

8

Ich habe eine Website, die https verwendet, um eine Javascript-Datei an den Client zu übertragen. Die Website ist getimpleapps.com .

Es stellt sich heraus, dass diese Datei mit https (20.08s - 29.08s) 52-mal langsamer geladen wird als mit http (380ms).

Die Homepage der Site hat dieselbe Langsamkeit wie die Javacript-Datei.

Ich habe kürzlich von Dreamhost auf Linode umgestellt und mich gehackt, SSL auf dem neuen Server zum Laufen zu bringen, bis es funktioniert hat. Ich habe keine verrückte Konfiguration vorgenommen.

Auf dem Linode wird Ubuntu 12.04 ausgeführt und die Site befindet sich auf einem (LAMP) -Stack.

Meine Frage an die Stack-Overflow-Community lautet: Wie gehe ich vor, um SSL und HTTPS auf meinem Server zu reparieren? Ich weiß, dass der Stapelüberlauf mit Fragen zur Langsamkeit von HTTPS übersät ist, aber es werden keine wirklichen Lösungen angegeben. Ein Ubuntu-Tutorial oder eine Konfigurationsanleitung wäre ideal.


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

<VirtualHost *:80>
     ServerAdmin [email protected]
     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 [email protected]
     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>

Curl von der lokalen Workstation

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 vom Linode Server (via 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
ThomasReggi
quelle
1
"It turns out that this file is loading 52% slower with https (20.08s - 29.08s) that with http (380ms)."- huh? Können Sie dort bitte Ihre Einheiten und Grammatik überprüfen? Das macht nicht viel Sinn.
MDMarra
1
Ich denke, das OP bedeutete 53- mal langsamer. Das HTTPS wird sehr langsam geladen.
Vielleicht legen Sie einfach virtualmin darauf und lassen es alles für Sie konfigurieren.
Andrew Smith
1
Hmm. Das ist falsch. Gibt es irgendetwas in den Apache-Protokollen, das darauf hinweist, wo die Verlangsamung ist? Auf meinem Server dauert es 263 ms für HTTPS und 84 ms für HTTP. Der sehr große Unterschied, den Sie sehen, ist auf etwas anderes zurückzuführen.
cjc
1
Bitte fügen Sie Ihre Apache-Konfiguration ein.
Michael Hampton

Antworten:

3

Ich hatte das gleiche Problem mit nahezu identischen Unterschieden in der Antwortzeit zwischen HTTP und HTTPS. Es stellte sich heraus, dass das Problem wie in der Antwort von @htmltiger war : Apache2 gingen einfach die Arbeitsprozesse aus.

Dies führt dazu, dass neue Anforderungen in die Warteschlange gestellt werden, bis ein Mitarbeiter frei wird und die nächste [ Quelle ] verarbeiten kann. Ich nehme an, der Grund, warum dies nur HTTPS und nicht auch HTTPS betrifft, ist, dass fast Ihr gesamter Datenverkehr über HTTP erfolgt und Apache HTTP- und HTTPS-Anforderungen dieselbe Priorität einräumt und jeweils eine Anforderung aus jeder Warteschlange entgegennimmt. Wenn die HTTPS-Warteschlange viel länger ist, warten Anforderungen viel länger. In der Tat gibt es zwei Warteschlangen, da die Warteschlange einfach der Linux-TCP-Verbindungswarteschlangenmechanismus ist und Linux eine Warteschlange pro Port bereitstellt.

Diagnose

Wenn dies Ihr Problem ist, treten die folgenden Symptome auf:

  • Der beste Indikator: apachectl statusZeigt auf Ihrem Server an, dass alle zulässigen Arbeitsprozesse ausgeführt werden. Dies ist der Fall, wenn .in der Prozessanzeigetafel keine Punkte angezeigt werden, was darauf hinweist, dass kein "offener Slot ohne aktuellen Prozess" mehr vorhanden ist. Die Zeile könnte beispielsweise so aussehen:

    KKKKKKRKKKRRCWKKKCCKWKKKKCRCKKKKKKKCKCKKKKWRKKKKWRWKKKKKKCWKKWKKK
    
  • Sie sehen Meldungen wie diese in Ihrem Haupt-Apache2-Fehlerprotokoll ( /var/log/apache2/error.lognicht domänenspezifische):

    [mpm_prefork:error] [pid 4715] AH00161: server reached MaxRequestWorkers 
        setting, consider raising the MaxRequestWorkers setting
    
  • Es gibt viele Prozesse in Ihrem Apache-Backlog. Nach diesem ausführlichen Artikel können Sie diese aus dem sehen unacked:Wert in ss -lti '( sport = :https )'Ausgabe. Abhängig von der Version oder Konfiguration von sskann dieser Wert jedoch fehlen.

  • Der größte Teil der Verzögerung (z. B. 17 von 20 Sekunden) wird in der Firefox-Netzwerkkonsole auf der Registerkarte "Timings" für die ursprünglich angeforderte URL als "Blocking" angezeigt.

Lösung

Dies setzt voraus, dass Sie das Prefork MPM-Servermodul in Apache verwenden. Ähnlich verhält es sich jedoch mit den MPM-Modulen "event" und "worker" - Details .

  1. Bearbeiten /etc/apache2/mods-enabled/mpm_prefork.confund erhöhen Sie die MaxRequestWorkersEinstellung.

  2. Wenn Sie den Standardwert von 256 überschreiten , müssen Sie ServerLimit auf denselben Wert setzen, damit Ihre Änderung wirksam wird.

  3. Übernehmen Sie die Änderungen: service apache2 reload

  4. Stellen Sie in der Anzeigetafelausgabe sicher, apachectl statusdass die neue MaxRequestWorkersEinstellung wirksam ist. Es muss der Länge der Anzeigetafel in Zeichen entsprechen.

  5. Wenn die Einstellung noch nicht wirksam ist, suchen Sie /etc/apache2nach alten Konfigurationsanweisungen (und ihren noch älteren veralteten Synonymen), die Ihre Änderung überschreiben könnten:

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

Differentialdiagnosen

Wenn Sie feststellen, dass HTTPS viel langsamer als HTTP ist, jedoch nicht jedes Mal in einer Reihe von Seiten-Neuladungen (nur im Durchschnitt), liegt möglicherweise eine Variante dieses ausgefallenen Problems vor , bei dem zwei Apache2-Server auf SSL-Port 443 ausgeführt werden.

Tanius
quelle
0

Versuchen Sie, die Verschlüsselung auf RC4-MD5 zu ändern (gute Balance zwischen Leistung und Sicherheit), dh:

SSLCipherSuite RC4-MD5

Prost

HTTP500
quelle
2
Die gemeldete Ungleichheit zwischen HTTP und HTTPS wird nicht durch eine Verschlüsselungsauswahl verursacht. Es ist eine andere Fehlkonfiguration.
cjc
@cjc Ich würde gerne sehen, ob es einen Unterschied macht ... es kann nicht schaden, es zu versuchen.
HTTP500
@ HTTP500 dies in httpd.conf setzen? Was ist mit SSLProtocol all?
Thomas Reggi
@ThomasReggi, stell es einfach unter deine SSLEngine On line. Ich würde vorschlagen: SSLProtocol all -SSLv2
HTTP500
Was?! es ist jetzt viel schneller. Ich habe apache2 nicht neu gestartet. Ist das in Ordnung?
Thomas Reggi
0

Ich hatte ein ähnliches Problem für einen ausgelasteten Server, aber die Erhöhung von MaxRequestWorkers auf 400 in mpm_prefork.conf hat es behoben.

htmltiger
quelle
-1

Es stellte sich heraus, dass mein Problem darin bestand, dass meine Schlüssel von einem anderen Server stammten. Ich musste ein neues Zertifikat bekommen und es mit neuen Schlüsseln einrichten.

ThomasReggi
quelle