HTTPS lebih dari 50 kali lebih lambat dari HTTP

8

Saya memiliki situs web yang menggunakan https untuk mengirimkan file javascript ke klien. Situs webnya adalah getsimpleapps.com .

Ternyata file ini memuat 52 kali lebih lambat dengan https (20.08s - 29.08s) dengan http (380ms).

Beranda situs berbagi lambatnya sama dengan file javacript.

Saya baru-baru ini beralih dari dreamhost ke linode, dan meretas untuk mendapatkan SSL agar dapat bekerja di server baru hingga berhasil. Saya tidak melakukan konfigurasi gila.

Linode menjalankan Ubuntu 12.04 dan situs berada di atas tumpukan (LAMP).

Pertanyaan saya kepada komunitas stack overflow adalah: Bagaimana cara saya memperbaiki SSL & HTTPS di server saya? Saya tahu bahwa stack overflow dipenuhi dengan pertanyaan mengenai lambatnya HTTPS tetapi tidak ada solusi nyata yang diberikan. Tutorial atau panduan konfigurasi ubuntu akan ideal.


file: /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>

Keriting dari workstation lokal

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 dari server linode (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
sumber
1
"It turns out that this file is loading 52% slower with https (20.08s - 29.08s) that with http (380ms)."- ya Bisakah Anda memeriksa ulang unit Anda dan tata bahasa di sana? Itu tidak masuk akal.
MDMarra
1
Saya pikir OP berarti 53 kali lebih lambat. HTTPS memuat sangat lambat.
Mungkin Anda hanya menjatuhkan virtualmin di atasnya dan mengizinkannya untuk mengkonfigurasi semuanya untuk Anda.
Andrew Smith
1
Hmm. Ini salah. Apakah ada sesuatu di log Apache yang dapat menunjukkan di mana perlambatan itu? Di server saya, saya melihatnya butuh 263ms untuk HTTPS dan 84ms untuk HTTP. Perbedaan yang sangat besar yang Anda lihat adalah karena sesuatu yang lain.
cjc
1
Silakan tempel konfigurasi Apache Anda.
Michael Hampton

Jawaban:

3

Saya memiliki masalah yang sama, dengan perbedaan waktu respons yang hampir sama antara HTTP dan HTTPS. Ternyata masalahnya seperti dalam jawaban oleh @htmltiger : Apache2 hanya kehabisan proses pekerja.

Ini menyebabkan permintaan baru harus antri sampai seorang pekerja menjadi bebas dan dapat memproses [ sumber ] berikutnya. Saya kira alasan mengapa ini hanya mempengaruhi HTTPS dan tidak juga HTTPS adalah bahwa hampir semua traffic Anda melebihi HTTP dan Apache memberikan HTTP dan HTTPS permintaan prioritas yang sama, mengambil satu permintaan dari setiap antrian secara bergantian. Jadi ketika antrian HTTPS lebih lama, permintaan menunggu lebih lama. Memang ada dua antrian, karena antrian hanyalah mekanisme antrian koneksi Linux TCP, dan Linux menyediakan satu antrian per port.

Diagnostik

Jika ini masalah Anda, gejala berikut akan berlaku:

  • Indikator terbaik: di server Anda, apachectl statusmenunjukkan bahwa semua proses pekerja yang diizinkan berjalan. Ini adalah kasus ketika tidak ada titik .shwon di garis papan skor proses, menunjukkan tidak ada "slot terbuka tanpa proses saat ini" tersisa. Baris mungkin terlihat seperti ini misalnya:

    KKKKKKRKKKRRCWKKKCCKWKKKKCRCKKKKKKKCKCKKKKWRKKKKWRWKKKKKKCWKKWKKK
    
  • Anda melihat pesan seperti ini di log kesalahan utama Apache2 Anda ( /var/log/apache2/error.log, bukan yang spesifik domain):

    [mpm_prefork:error] [pid 4715] AH00161: server reached MaxRequestWorkers 
        setting, consider raising the MaxRequestWorkers setting
    
  • Ada banyak proses dalam tumpukan Apache Anda. Menurut artikel mendalam ini , Anda bisa melihatnya dari unacked:nilai ss -lti '( sport = :https )'output. Tergantung pada versi atau konfigurasi ss, nilai itu mungkin hilang.

  • Sebagian besar penundaan (misalnya, 17 dari 20 detik) ditampilkan di Firefox Network Console, di tab "Timing" untuk URL awal yang diminta, sebagai "Blocking".

Larutan

Ini mengasumsikan Anda menggunakan modul server prefork MPM di Apache. Ini serupa untuk modul MPM "event" dan "worker" - detail .

  1. Edit /etc/apache2/mods-enabled/mpm_prefork.confdan tambah MaxRequestWorkerspengaturan.

  2. Jika Anda meningkatkannya di luar standar 256, Anda juga harus mengatur ServerLimit ke nilai yang sama untuk membuat perubahan Anda efektif.

  3. Terapkan perubahan: service apache2 reload

  4. Pastikan dalam keluaran papan skor apachectl statusbahwa MaxRequestWorkerspengaturan baru efektif. Itu harus setara dengan panjang garis papan skor dalam karakter.

  5. Jika pengaturannya belum efektif, cari /etc/apache2arahan konfigurasi lama (dan sinonim usang yang bahkan lebih lama) yang dapat menimpa perubahan Anda:

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

Diagnosis Banding

Jika Anda melihat HTTPS jauh lebih lambat daripada HTTP tetapi tidak setiap saat dalam serangkaian reload halaman (hanya rata-rata), maka Anda mungkin memiliki varian masalah mewah ini , dengan dua server Apache2 berjalan pada port SSL 443.

tanius
sumber
0

Coba ubah cipher ke RC4-MD5 (keseimbangan kinerja dan keamanan yang baik), yaitu:

SSLCipherSuite RC4-MD5

Bersulang

HTTP500
sumber
2
Perbedaan yang dilaporkan antara HTTP dan HTTPS tidak disebabkan oleh pilihan sandi. Ini beberapa kesalahan konfigurasi lainnya.
cjc
@ cjc Saya ingin melihat apakah ada bedanya ... tidak ada salahnya untuk mencoba.
HTTP500
@ HTTP500 taruh ini di httpd.conf? Bagaimana dengan SSLProtocol all?
ThomasReggi
@ThomasReggi, letakkan saja di bawah SSLEngine On line Anda. Saya akan menyarankan: SSLProtocol all -SSLv2
HTTP500
Apa?! sekarang jauh lebih cepat. Saya tidak memulai ulang apache2 apakah itu oke?
ThomasReggi
0

Saya memiliki masalah serupa untuk server yang sibuk tetapi meningkatkan MaxRequestWorkers menjadi 400 di mpm_prefork.conf memperbaikinya.

htmltiger
sumber
-1

Ternyata masalah saya adalah kunci saya berasal dari server lain. Saya perlu mendapatkan sertifikat baru dan mengaturnya dengan kunci baru.

ThomasReggi
sumber