HTTPS가 HTTP보다 50 배 이상 느립니다.


8

https를 사용하여 자바 스크립트 파일을 클라이언트로 전송하는 웹 사이트가 있습니다. 웹 사이트는 getsimpleapps.com 입니다.

이 파일은 http (380ms)보다 https (20.08s-29.08s)보다 52 배 느리게로드됩니다.

사이트의 홈페이지는 javacript 파일과 동일한 속도를 공유합니다.

최근에 dreamhost에서 linode로 전환했으며 SSL을 새 서버에서 작동하도록 해킹했습니다. 나는 미친 구성을하지 않았다.

linode가 Ubuntu 12.04를 실행 중이고 사이트가 (LAMP) 스택 위에 있습니다.

스택 오버플로 커뮤니티에 대한 질문은 서버에서 SSL 및 HTTPS를 수정하는 방법은 무엇입니까? 스택 오버플로 에 HTTPS속도 저하에 관한 질문이 있지만 실제 솔루션은 제공되지 않습니다. 우분투 자습서 또는 구성 안내서가 이상적입니다.


파일 : /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>

로컬 워크 스테이션에서 말림

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

linode 서버에서 말림 (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)."-응? 당신은 당신의 단위와 문법을 다시 확인하실 수 있습니다. 그건 말이되지 않습니다.
MDMarra

1
OP가 53 느리다고 생각했습니다 . HTTPS가 실제로 느리게로드됩니다.

어쩌면 가상 머신을 버리고 모든 것을 구성 할 수있을 것입니다.
Andrew Smith

1
흠. 이것은 잘못이다. Apache 로그에 속도 저하 위치를 나타내는 것이 있습니까? 내 서버에서 HTTPS의 경우 263ms, HTTP의 경우 84ms가 소요됩니다. 당신이 보는 매우 큰 차이는 다른 무언가 때문입니다.
cjc

1
Apache 구성을 붙여 넣으십시오.
Michael Hampton

답변:


3

HTTP와 HTTPS의 응답 시간 차이가 거의 동일한 동일한 문제가 있습니다. 문제는 @htmltiger답변과 같았습니다 : Apache2에는 작업자 프로세스가 부족했습니다.

이로 인해 작업자가 해제되고 다음 소스를 처리 할 수있을 때까지 새 요청이 대기됩니다 . 이것이 HTTPS에만 영향을 미치고 HTTPS에만 영향을 미치는 이유는 거의 모든 트래픽이 HTTP를 통해 Apache가 HTTP와 HTTPS 요청에 동일한 우선 순위를 부여하여 각 큐에서 한 번에 한 요청을 가져 오기 때문이라고 가정합니다. 따라서 HTTPS 큐가 훨씬 길면 요청이 훨씬 오래 기다립니다. 실제로 큐는 단순히 Linux TCP 연결 큐 메커니즘이고 Linux는 포트 당 하나의 큐를 제공하기 때문에 실제로 두 개의 큐가 있습니다.

진단

이것이 문제인 경우 다음 증상이 적용됩니다.

  • 최상의 지표 : 서버에서 apachectl status허용 가능한 모든 작업자 프로세스가 실행되고 있음을 나타냅니다. 이것은 .프로세스 스코어 보드 라인에 도트 가 없어 "현재 프로세스가없는 열린 슬롯"이 없음을 나타내는 경우입니다. 예를 들어 라인은 다음과 같습니다.

    KKKKKKRKKKRRCWKKKCCKWKKKKCRCKKKKKKKCKCKKKKWRKKKKWRWKKKKKKCWKKWKKK
    
  • 기본 Apache2 오류 로그 ( /var/log/apache2/error.log도메인 특정 오류 아님)에 다음 과 같은 메시지가 표시됩니다 .

    [mpm_prefork:error] [pid 4715] AH00161: server reached MaxRequestWorkers 
        setting, consider raising the MaxRequestWorkers setting
    
  • Apache 백 로그에는 많은 프로세스가 있습니다. 이 심층 기사에 따르면 출력 unacked:값에서 이것을 볼 수 있습니다 ss -lti '( sport = :https )'. 의 버전이나 구성에 ss따라 해당 값이 누락 될 수 있습니다.

  • 지연의 대부분 (예 : 20 초 중 17 초)은 Firefox 네트워크 콘솔에서 요청 된 초기 URL의 "타이밍"탭에 "차단"으로 표시됩니다.

해결책

이는 Apache에서 prefork MPM 서버 모듈 을 사용한다고 가정합니다 . "event"및 "worker"MPM 모듈과 비슷하지만 details 입니다.

  1. 설정을 편집 /etc/apache2/mods-enabled/mpm_prefork.conf하고 늘리십시오 MaxRequestWorkers.

  2. 기본값 인 256 이상으로 늘리면 변경 사항을 적용하기 위해 ServerLimit 을 동일한 값으로 설정해야합니다.

  3. 변경 사항을 적용하십시오. service apache2 reload

  4. apachectl status새로운 MaxRequestWorkers설정 의 스코어 보드 출력에서 ​​효과가 있는지 확인하십시오 . 스코어 보드 줄의 길이 (문자)와 같아야합니다.

  5. 설정이 아직 유효하지 않은 경우 /etc/apache2변경 사항을 겹쳐 쓸 수있는 이전 구성 지시문 (및 이전의 더 이상 사용되지 않는 동의어)을 검색하십시오.

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

차별 진단

HTTPS가 HTTP보다 훨씬 느리지 만 일련의 페이지를 다시로드 할 때마다 (평균적으로) 모든 시간이 아닌 경우 SSL 포트 443에서 실행되는 두 개의 Apache2 서버와 함께이 멋진 문제 의 변형 있을 수 있습니다 .


0

암호를 RC4-MD5 (성능과 보안의 균형)로 변경해보십시오.

SSLCipherSuite RC4-MD5

건배


2
HTTP와 HTTPS 간의보고 된 차이는 암호 선택으로 인한 것이 아닙니다. 다른 잘못된 구성입니다.
cjc

@cjc 차이가 나는지 알고 싶습니다 ... 시도해 볼 수 없습니다.
HTTP500

@ HTTP500이 httpd.conf에 넣었습니까? 무엇에 대해 SSLProtocol all?
ThomasReggi 2009 년

@ThomasReggi, SSLEngine On 라인에 넣으십시오. 나는 제안 할 것이다 : SSLProtocol all -SSLv2
HTTP500

뭐?! 지금은 훨씬 빠릅니다. apache2를 다시 시작하지 않았습니다. 괜찮습니까?
ThomasReggi

0

바쁜 서버와 비슷한 문제가 있었지만 mpm_prefork.conf에서 MaxRequestWorkers를 400으로 늘리면 문제가 해결되었습니다.


-1

내 키가 다른 서버에서 온 것이 문제였습니다. 새 인증서를 얻어서 새 키로 설정해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.