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

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

2022-05-31 last update

11 minutes reading Nginx Ubuntu 20.04 Let's Encrypt Ubuntu
이 강좌의 초기 버전은 Sergey Zhukaev으로 작성되었다.

소개


Nginx은 신속하고 신뢰할 수 있는 소스 웹 서버입니다.메모리 사용량이 적고 확장성이 높으며 구성이 쉽고 다양한 프로토콜을 지원하기 때문에 인기가 많습니다.
HTTP/2는 서버에서 브라우저로 페이지를 전송하는 데 사용되는 하이퍼텍스트 전송 프로토콜의 최신 버전입니다.HTTP/2는 최근 20년 동안 HTTP의 첫 번째 중대한 업데이트이다. HTTP1.1은 1999년에 이미 대중에게 출시되었고 당시 웹 페이지의 크기는 훨씬 작았다.그때부터 인터넷에 커다란 변화가 생겼고 우리는 현재 HTTP 1.1의 제한에 직면해 있다.이 프로토콜은 대부분의 현대 사이트의 잠재적 전송 속도를 제한한다. 왜냐하면 대기열의 페이지의 일부분을 다운로드하고, 앞부분은 다음 부분을 다운로드하기 전에 완전히 다운로드해야 하며, 일반적인 현대 사이트는 수십 개의 단독 CSS,javascript와 이미지 자산을 다운로드하기 때문이다.
HTTP/2는 다음과 같은 근본적인 변화를 가져왔기 때문에 이 문제를 해결했습니다.
  • 대기열
  • 이 아닌 모든 요청을 병렬 다운로드
  • HTTP 헤더가
  • 압축됨
  • 페이지를 바이너리 파일로 전송하는 것이지 텍스트 파일로 전송하는 것이 아니라
  • 페이지를 효율적으로 전송하는 것이다
  • 서버는 심지어 사용자의 요청이 없는 상황에서도 데이터를 전송할 수 있다. 이것은 높은 지연을 가진 사용자를 위해 속도
  • 비록 HTTP/2는 암호화가 필요하지 않지만, 두 가지 가장 유행하는 브라우저 Google Chrome과 Mozilla Firefox의 개발자는 보안상의 이유로 HTTPS가 연결된 HTTP/2만 지원할 것이라고 밝혔다.따라서 HTTP/2 지원을 사용하여 서버를 설정하려면 HTTPS를 사용하여 서버를 보호해야 합니다.
    이 강좌는 HTTP/2를 지원하는 빠르고 안전한 Nginx 서버를 설정하는 데 도움을 줍니다.

    선결 조건


    시작하기 전에 다음 작업을 수행해야 합니다.
  • the Ubuntu 20.04 initial server setup guide에 설정된 Ubuntu 20.04 서버를 통해 sudo 비root 사용자와 방화벽을 포함합니다.
  • 서버에
  • Nginx가 설치되어 있으며 How To Install Nginx on Ubuntu 20.04에 따라 조작할 수 있습니다.
  • 은 서버를 가리키는 도메인 이름으로 설정됩니다.Namecheap에서 구매하거나 Freenom에서 무료로 받을 수 있습니다.How To Manage Your Domain With DigitalOcean의 문서에 따라 도메인을 Digital Ocean Drops로 가리키는 방법을 배울 수 있습니다.
  • 서버에 구성된 TLS/SSL 인증서.다음과 같은 세 가지 옵션이 있습니다.
  • 당신은 Let’s Encrypt에 따라 How to Secure Nginx with Let’s Encrypt on Ubuntu 20.04에서 무료 증서를 받을 수 있습니다.
  • How to Create a Self-signed SSL Certificate for Nginx in Ubuntu 20.04에 따라 자체 서명 인증서를 생성하고 설정할 수 있습니다.
  • Nginx는 포트 80에서 포트 443으로 트래픽을 리디렉션하도록 구성되어 있습니다. 이것은 앞의 선결 조건에 포함되어야 합니다.
  • Nginx는 2048비트 이상의 순간 Diffie-Hellman(DHE) 키를 사용하도록 구성되어 있으며, 이것도 앞의 선결 조건에 포함되어야 한다.
  • 1단계 - HTTP/2 지원 활성화


    server block set up step in the Nginx installation tutorial을 준수하는 경우 /etc/nginx/sites-available/your_domain에 도메인에 서버 블록을 설정하고 server_name 명령을 적절하게 설정해야 합니다.첫 번째 변경 사항은 HTTP/2를 사용하도록 도메인의 서버 블록을 수정하는 것입니다.nano 또는 기본 설정 편집기를 사용하여 도메인의 구성 파일을 엽니다.
    1. sudo nano /etc/nginx/sites-enabled/your_domain
    파일에서 포트 listen과 연관된 443 변수를 찾습니다.
    /etc/nginx/sites enabled/your\u 도메인
    ...
        listen [::]:443 ssl ipv6only=on; 
        listen 443 ssl; 
    ...
    
    첫 번째는 IPv6 연결에 사용됩니다.두 번째 방법은 모든 IPv4 연결에 적용됩니다.HTTP/2를 활성화합니다.listen을 포함하여 각 http2 명령을 수정합니다.
    /etc/nginx/sites enabled/your\u 도메인
    ...
        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
    ...
    
    이것은 Nginx가 지원하는 브라우저에서 HTTP/2를 사용하는 것을 알려줍니다.
    프로필을 저장하고 텍스트 편집기를 종료합니다.nano을 사용하는 경우 Ctrl+X을 누른 다음 메시지가 나타나면 Y을 누른 다음 Enter를 누릅니다.
    Nginx 구성 파일을 변경할 때마다 -t 플래그를 사용하여 구성에 오류가 있는지 확인해야 합니다. 이 플래그는 Nginx의 내장 구문 검사 명령을 실행합니다.
    1. sudo nginx -t
    구문에 오류가 없으면 다음과 같은 출력을 받을 수 있습니다.
    sudonginx-t의 출력
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    이제 Nginx 서버를 구성하여 더욱 엄격한 암호 목록을 사용하여 서버의 보안을 향상시킬 것입니다.

    2단계 - 이전 및 비보안 암호 키트 제거


    HTTP/2에는 blocklist의 이전 암호와 안전하지 않은 암호가 있으므로 사용을 피해야 합니다.암호 세트는 전송된 데이터를 어떻게 암호화하는지 설명하는 암호화 알고리즘이다.
    암호를 정의하는 방법은 Nginx에 TLS/SSL 인증서를 구성하는 방식에 따라 다릅니다.
    Certbot을 사용하여 인증서를 가져오면 /etc/letsencrypt/options-ssl-nginx.conf 파일이 만들어집니다. 이 파일에 포함된 암호는 HTTP/2에 안전하지 않습니다.단, 이 파일을 수정하면 Certbot이 나중에 업데이트를 적용하는 것을 막을 수 있습니다. 따라서 Nginx에 이 파일을 사용하지 말라고 알려주고 비밀번호 목록을 지정합니다.
    도메인의 서버 블록 구성 파일을 열려면 다음과 같이 하십시오.
    sudo nano /etc/nginx/sites-enabled/your_domain
    
    options-ssl-nginx.conf 파일이 들어 있는 줄을 찾아 줄 머리에 # 문자를 추가하여 주석을 달립니다.
    /etc/nginx/sites enabled/your\u 도메인
    
        # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
    
    이 행 아래에 허용되는 암호를 정의하기 위해 이 행을 추가합니다.
    /etc/nginx/sites enabled/your\u 도메인
    
    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
    다음 행을 찾습니다.
    /etc/nginx/snippets/ssl 매개 변수.형태
    ...
    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;
    ...
    
    다음 암호 목록으로 수정합니다.
    /etc/nginx/snippets/ssl 매개 변수.형태
    
    ...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    
    파일을 저장하고 편집기를 종료합니다.nginx -t 명령을 다시 사용하여 구성의 구문 오류를 확인합니다.
    1. sudo nginx -t
    만약 어떤 오류가 발생하면 그것들을 해결하고 다시 테스트하십시오.
    구성은 구문 검사 후 systemctl 명령을 사용하여 Nginx를 다시 시작합니다.
    1. sudo systemctl reload nginx.service
    서버가 다시 시작되면 정상적으로 작동하는지 확인하십시오.

    3단계 - HTTP/2 활성화 여부 확인


    서버에서 HTTP/2를 실행하고 있는지 확인합니다.curl 명령을 사용하여 사이트에 요청을 보내고 제목을 봅니다.
    1. curl -I -L --http2 https://your_domain
    다음 출력을 받게 됩니다.
    HTTP/2 200
    server: nginx/1.18.0 (Ubuntu)
    date: Wed, 10 Nov 2021 17:53:10 GMT
    content-type: text/html
    content-length: 612
    last-modified: Tue, 09 Nov 2021 23:18:37 GMT
    etag: "618b01cd-264"
    accept-ranges: bytes
    
    또한 HTTP/2가 Google Chrome에서 사용되는지 확인할 수 있습니다.Chrome을 열고 https://your_domain으로 이동합니다.Chrome 개발자 도구(View->Developer->Developer Tools)를 열고 페이지를 다시 로드합니다(View->reload This page).네트워크 탭으로 이동하여 이름으로 시작하는 테이블 머리글 행을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 계약 옵션을 선택합니다.
    HTTP/2가 작업 중임을 나타내는 h2(HTTP/2 대표)이 포함된 새 프로토콜 열이 나타납니다.

    이제 HTTP/2 프로토콜을 통해 컨텐츠를 제공할 준비가 되었습니다.HST를 활성화함으로써 보안과 성능을 향상시킵니다.

    단계 4 - HTTP 엄격한 전송 보안(HSTS) 활성화


    HTTP가 HTTPS로 리디렉션을 요청하더라도 이러한 리디렉션을 수행하지 않도록 HTTP 엄격한 전송 보안(HSTS)을 설정할 수 있습니다.브라우저에서 HSTS 헤더를 찾으면 주어진 시간 동안 일반 HTTP를 통해 서버에 다시 연결하지 않습니다.어쨌든 암호화된 HTTPS 연결만 사용하여 데이터를 교환합니다.이 헤더는 또한 우리가 협의 downgrade attacks의 영향을 받지 않도록 보호한다.
    도메인의 서버 블록 구성 파일을 다시 열려면 다음과 같이 하십시오.
    sudo nano /etc/nginx/your_domain
    
    이 행을 SSL 암호가 있는 파일의 동일한 블록에 추가하여 HSTS를 활성화합니다.
    /etc/nginx/your\u 도메인
    server {
    ...
        ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        add_header Strict-Transport-Security "max-age=15768000" always;
    }
    ...
    
    max-age은 초 단위로 설정됩니다.15768000은 6개월에 해당한다.
    기본적으로 이 헤더는 하위 도메인 요청에 추가되지 않습니다.하위 도메인이 있고 HST를 모든 하위 도메인에 적용하려는 경우 다음 그림과 같이 행 끝에 includeSubDomains 변수를 추가해야 합니다.
    /etc/nginx/your\u 도메인
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
    
    파일을 저장하고 편집기를 종료합니다.
    구성에서 구문 오류를 다시 확인합니다.
    1. sudo nginx -t
    마지막으로 변경 사항을 적용하기 위해 Nginx 서버를 다시 시작합니다.
    1. sudo systemctl reload nginx.service

    결론


    이제 Nginx 서버에서 HTTP/2 페이지를 사용할 수 있습니다.SSL 연결의 강도를 테스트하려면 Qualys SSL Lab을 방문하여 서버에서 테스트를 실행합니다.만약 모든 설정이 정확하다면, 당신은 A+의 안전 표시를 받아야 합니다.
    Nginx가 서버 블록 규칙을 해석하고 실현하는 방법에 대한 자세한 내용은 Understanding Nginx Server and Location Block Selection Algorithms을 참조하십시오.