웹사이트 검색

Ubuntu 18.04에서 HTTP/2 지원으로 Nginx를 설정하는 방법


이 튜토리얼의 이전 버전은 Sergey Zhukaev가 작성했습니다.

소개

Nginx는 빠르고 안정적인 오픈 소스 웹 서버입니다. 낮은 메모리 공간, 높은 확장성, 구성 용이성 및 다양한 프로토콜 지원으로 인해 인기를 얻었습니다.

HTTP/2는 서버에서 브라우저로 페이지를 전달하기 위해 웹에서 사용되는 하이퍼텍스트 전송 프로토콜의 새 버전입니다. HTTP/2는 거의 20년 만에 HTTP의 첫 번째 주요 업데이트입니다. HTTP1.1은 웹 페이지가 일반적으로 인라인 CSS 스타일시트가 있는 단일 HTML 파일이었던 1999년에 대중에게 소개되었습니다. 그 이후로 인터넷은 극적으로 변화했고 이제 우리는 HTTP 1.1의 한계에 직면해 있습니다. 이 프로토콜은 대기열에 있는 페이지의 일부를 다운로드하기 때문에 대부분의 최신 웹사이트에 대한 잠재적인 전송 속도를 제한합니다(이전 부분은 다운로드 전에 완전히 다운로드해야 함). 다음 부분이 시작됩니다) 그리고 평균적인 현대 웹페이지는 다운로드하기 위해 약 100개의 요청이 필요합니다(각 요청은 사진, js 파일, css 파일 등입니다).

HTTP/2는 몇 가지 근본적인 변화를 가져오기 때문에 이 문제를 해결합니다.

  • 모든 요청은 대기열이 아닌 병렬로 다운로드됩니다.
  • HTTP 헤더가 압축됨
  • 페이지는 더 효율적인 텍스트 파일이 아닌 바이너리로 전송됩니다.
  • 서버는 사용자의 요청 없이도 데이터를 "푸시\할 수 있으므로 대기 시간이 긴 사용자의 속도가 향상됩니다.

HTTP/2에는 암호화가 필요하지 않지만 가장 널리 사용되는 두 브라우저인 Google Chrome과 Mozilla Firefox의 개발자는 보안상의 이유로 HTTPS 연결에 대해서만 HTTP/2를 지원할 것이라고 밝혔습니다. 따라서 HTTP/2 지원으로 서버를 설정하기로 결정한 경우 HTTPS로도 보안을 유지해야 합니다.

이 튜토리얼은 HTTP/2를 지원하는 빠르고 안전한 Nginx 서버를 설정하는 데 도움이 됩니다.

전제 조건

시작하기 전에 몇 가지 사항이 필요합니다.

  • 루트가 아닌 sudo 사용자 및 방화벽을 포함하여 Ubuntu 18.04 초기 서버 설정 가이드에 따라 설정된 Ubuntu 18.04 서버 1대
  • 서버에 Nginx가 설치되어 있습니다. Ubuntu 18.04에 Nginx를 설치하는 방법에 따라 수행할 수 있습니다.
  • 서버를 가리키도록 구성된 도메인 이름. DigitalOcean으로 도메인을 관리하는 방법에서 구매할 수 있습니다.
  • 서버용으로 구성된 TLS/SSL 인증서. 세 가지 옵션이 있습니다.
    • Ubuntu 18.04에서 Let's Encrypt로 Nginx를 보호하는 방법에서 무료 인증서를 얻을 수 있습니다.
    • Ubuntu 18.04에서 Nginx용 자체 서명 SSL 인증서를 만드는 방법에 따라 자체 서명 인증서를 생성하고 구성할 수도 있습니다.
    • Ubuntu 18.04에서 Nginx용 자체 서명 SSL 인증서를 생성하는 방법을 확인할 수 있습니다.

    1단계 - HTTP/2 지원 활성화

    Nginx 설치 가이드의 서버 블록 설정 단계를 따랐다면 /etc/nginx/sites-available/your_domain에 도메인용 서버 블록이 있어야 합니다. server_name지시문이 이미 적절하게 설정되었습니다. 첫 번째 변경 사항은 HTTP/2를 사용하도록 도메인의 서버 블록을 수정하는 것입니다.

    도메인의 구성 파일을 엽니다.

    1. sudo nano /etc/nginx/sites-available/your_domain

    파일에서 포트 443과 연결된 listen 변수를 찾습니다.

    ...
        listen [::]:443 ssl ipv6only=on; 
        listen 443 ssl; 
    ...
    

    첫 번째는 IPv6 연결용입니다. 두 번째는 모든 IPv4 연결용입니다. 둘 다에 대해 HTTP/2를 활성화합니다.

    http2를 포함하도록 각 listen 지시문을 수정합니다.

    ...
        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
    ...
    

    이는 지원되는 브라우저에서 HTTP/2를 사용하도록 Nginx에 지시합니다.

    구성 파일을 저장하고 텍스트 편집기를 종료합니다.

    Nginx 구성 파일을 변경할 때마다 다음과 같은 구문 오류에 대한 구성을 확인해야 합니다.

    1. sudo nginx -t

    구문에 오류가 없으면 다음 출력이 표시됩니다.

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    다음으로 더 제한적인 암호 목록을 사용하도록 서버를 구성합니다.

    2단계 - 오래되고 안전하지 않은 암호 제품군 제거

    HTTP/2에는 오래되고 안전하지 않은 암호의 블랙리스트가 있으므로 이러한 암호를 피해야 합니다. 암호 제품군은 전송된 데이터를 암호화하는 방법을 설명하는 암호화 알고리즘입니다.

    암호를 정의하는 데 사용할 방법은 Nginx용 TLS/SSL 인증서를 구성한 방법에 따라 다릅니다.

    Certbot을 사용하여 인증서를 얻은 경우 HTTP/2에 대해 충분히 강력하지 않은 암호가 포함된 /etc/letsencrypt/options-ssl-nginx.conf 파일도 생성되었습니다. 이 파일을 수정하면 불행하게도 Certbot이 향후 업데이트를 적용하지 못하게 되므로 Nginx에 이 파일을 사용하지 말라고 지시하고 자체 암호 목록을 지정합니다.

    도메인에 대한 서버 블록 구성 파일을 엽니다.

    sudo nano /etc/nginx/sites-available/your_domain
    

    options-ssl-nginx.conf 파일이 포함된 줄을 찾아 주석 처리합니다.

    
        # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
    

    해당 줄 아래에 이 줄을 추가하여 허용되는 암호를 정의합니다.

    
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    

    파일을 저장하고 편집기를 종료합니다.

    자체 서명된 인증서를 사용했거나 타사의 인증서를 사용하고 전제 조건에 따라 구성한 경우 텍스트 편집기에서 /etc/nginx/snippets/ssl-params.conf 파일을 엽니다.

    1. sudo nano /etc/nginx/snippets/ssl-params.conf

    다음 줄을 찾습니다.

    ...
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ...
    

    다음과 같이 보이도록 수정하십시오.

    
    ...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    

    파일을 저장하고 편집기를 종료하십시오.

    다시 한 번 구문 오류에 대한 구성을 확인하십시오.

    1. sudo nginx -t

    오류가 있으면 해결하고 다시 테스트하십시오.

    구문 오류가 표시되지 않으면 Nginx를 다시 시작합니다.

    1. sudo systemctl reload nginx

    서버가 다시 시작되면 작동하는지 확인합시다.

    3단계 - HTTP/2가 활성화되었는지 확인

    서버가 실행 중이고 HTTP/2로 작동하는지 확인합시다.

    curl 명령을 사용하여 사이트에 요청하고 헤더를 봅니다.

    1. curl -I -L https://your_domain

    다음 출력이 표시됩니다.

    Output
    HTTP/1.1 301 Moved Permanently Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://your_domain/ HTTP/2 200 server: nginx/1.14.0 (Ubuntu) date: Fri, 06 Jul 2018 19:07:12 GMT content-type: text/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes

    Google Chrome에서 HTTP/2가 사용 중인지 확인할 수도 있습니다. Chrome을 열고 http://your_domain으로 이동합니다. Chrome 개발자 도구를 열고(보기 -> 개발자 -> 개발자 도구) 페이지를 다시 로드합니다(보기 -> 이 페이지 다시 로드). 네트워크 탭으로 이동하여 이름으로 시작하는 테이블 헤더 행을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 프로토콜 옵션을 선택합니다.

    새 프로토콜 열에 h2(HTTP/2를 나타냄)가 표시되어 HTTP/2가 작동 중임을 나타냅니다.

    이제 HTTP/2 프로토콜을 통해 콘텐츠를 제공할 준비가 된 것입니다. HSTS를 활성화하여 보안과 성능을 향상시키자.

    4단계 - HSTS(HTTP Strict Transport Security) 활성화

    HTTP 요청이 HTTPS로 리디렉션되더라도 이러한 리디렉션을 수행할 필요가 없도록 HTTP Strict Transport Security(HSTS)를 활성화할 수 있습니다. 브라우저가 HSTS 헤더를 찾으면 지정된 시간 동안 다시 일반 HTTP를 통해 서버에 연결을 시도하지 않습니다. 어쨌든 암호화된 HTTPS 연결만을 사용하여 데이터를 교환합니다. 이 헤더는 또한 프로토콜 다운그레이드 공격으로부터 우리를 보호합니다.

    편집기에서 Nginx 구성 파일을 엽니다.

    sudo nano /etc/nginx/nginx.conf
    

    HSTS를 활성화하려면 다음 행을 파일에 추가하십시오.

    http {
    ...
        ##
        # Virtual Host Configs
        ##
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        add_header Strict-Transport-Security "max-age=15768000" always;
    }
    ...
    

    max-age는 초 단위로 설정됩니다. 값 15768000은 6개월에 해당합니다.

    기본적으로 이 헤더는 하위 도메인 요청에 추가되지 않습니다. 하위 도메인이 있고 모든 하위 도메인에 HSTS를 적용하려면 다음과 같이 줄 끝에 includeSubDomains 변수를 추가해야 합니다.

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
    

    파일을 저장하고 편집기를 종료합니다.

    다시 한 번 구문 오류에 대한 구성을 확인하십시오.

    1. sudo nginx -t

    마지막으로 Nginx 서버를 다시 시작하여 변경 사항을 적용합니다.

    1. sudo systemctl reload nginx

    결론

    Nginx 서버가 이제 HTTP/2 페이지를 제공하고 있습니다. SSL 연결의 강도를 테스트하려면 Qualys SSL Lab을 방문하여 서버에 대해 테스트를 실행하십시오. 모든 것이 올바르게 구성되면 보안에 대해 A+ 마크를 받아야 합니다.