SSL 터미널을 사용하여 Nginx 로드 밸런싱 설정하는 방법

SSL 터미널을 사용하여 Nginx 로드 밸런싱 설정하는 방법

2022-06-01 last update

12 minutes reading Ubuntu Nginx Load Balancing Scaling

소개


본고는 부하 평형기에서 SSL 인증서 하나만 사용하여 SSL 종료가 있는 Nginx 부하 균형을 설정하는 방법을 보여 줍니다.이것은 OpenSSL 업데이트와 키와 인증서를 부하 평형기 자체에서 관리할 수 있기 때문에 SSL 관리 비용을 줄일 것입니다.

SSL 종료 정보


Nginx는 여러 백엔드 서버 주위에 데이터를 전송할 수 있도록 부하 평형기로 구성할 수 있습니다.SSL 종료는 부하 평형기에서 발생하는 과정이며, 부하 평형기는 부하 평형기와 백엔드 서버 간의 통신이 HTTP가 되도록 SSL 암호화/복호화를 처리한다.부하 평형기 IP에 대한 접근을 제한함으로써 백엔드를 보호해야 합니다. 본고는 잠시 후에 이에 대해 설명하겠습니다.

선결 조건


이 강좌에서 명령은 루트 사용자나 sudo 권한이 있는 사용자로 실행되어야 합니다.Users Tutorial 에서 설정 방법을 볼 수 있습니다.
다음 설명서는 참조로 사용할 수 있습니다.
  • Setting up a LAMP Server on Ubuntu 14.04
  • Setting up SSL on Nginx
  • Setting up Load Balancing on Nginx
  • LAMP 서버는 필수는 아니지만 이 강좌에서는 이를 예로 사용합니다.

    설치 프로그램


    이 강좌는 다음 3개의 물방울을 사용합니다.
    물방울 1 (전단)
  • 이미지: Ubuntu 14.04
  • 호스트 이름:loadbalancer
  • 개인 IP: 10.130.227.33
  • 물방울 2 (후면)
  • 이미지: Ubuntu 14.04
  • 호스트 이름: 웹1
  • 개인 IP: 10.130.227.11
  • 물방울 3 (후면)
  • 이미지: Ubuntu 14.04
  • 호스트 이름: 웹2
  • 개인 IP: 10.130.227.22
  • 도메인 이름 - example.com
    이 모든 액체는 반드시 사용해야 한다private networking.
    세 서버 모두에서 소프트웨어를 업데이트하고 업그레이드하려면 다음과 같이 하십시오.
    apt-get update && apt-get upgrade -y
    
    업그레이드를 적용하기 위해 각 서버를 다시 시작합니다.OpenSSL은 최신 버전을 사용해야 안전하기 때문에 매우 중요합니다.
    도메인 이름을 위한 새로운 Nginx 가상 호스트를 설정합니다. 업스트림 모듈 로드 밸런싱 백엔드입니다.
    Nginx 로드 밸런싱을 설정하기 전에 VPS에 Nginx를 설치해야 합니다.apt-get를 사용하여 신속하게 설치할 수 있습니다.
    apt-get install nginx
    
    두 백엔드 서버에서 저장소를 업데이트하고 Apache를 설치합니다.
    apt-get install apache2
    
    두 백엔드 서버에 PHP 설치:
    apt-get install php5 libapache2-mod-php5 php5-mcrypt
    
    자세한 내용은 this article 을 참조하십시오.

    키 생성 및 SSL 인증서 생성


    이 섹션에서는 SSL 인증서를 작성하는 데 필요한 단계를 완료합니다.This article 에서는 Nginx의 SSL 인증서를 자세히 설명합니다.
    SSL 인증서 디렉토리를 만들고 해당 디렉토리로 전환합니다.
    mkdir -p /etc/nginx/ssl/example.com
    cd /etc/nginx/ssl/example.com
    
    개인 키 만들기:
    openssl genrsa -des3 -out server.key 2048
    
    암호 구문을 삭제하려면 다음과 같이 하십시오.
    openssl rsa -in server.key -out server.key
    
    CSR(인증서 서명 요청) 작성:
    openssl req -new -key server.key -out server.csr
    
    이 CSR을 사용하여 유효한 인증서를 가져오거나 다음 명령을 사용하여 자체 서명된 인증서를 생성합니다.
    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    
    이 작업을 완료하면 이 디렉토리에 다음 파일이 포함됩니다.
  • 서버.키 - 개인 키
  • ca 인증서.pem - CA의 루트 인증서와 중간 인증서의 집합입니다.CA
  • 로부터 유효한 인증서를 받은 경우에만 참석
  • 서버.crt-도메인 이름의 SSL 인증서
  • 가상 호스트 파일 및 업스트림 모듈


    Nginx 디렉토리에 가상 호스트 파일 만들기
    nano /etc/nginx/sites-available/example.com
    
    백엔드 서버 전용 IP 주소가 포함된 업스트림 모듈 추가
    upstream mywebapp1 {
        server 10.130.227.11;
        server 10.130.227.22;
    }
    
    이 줄 다음에 서버 블록을 시작합니다.이 블록은 도메인 이름, 업스트림 서버에 대한 참조, 백엔드로 전달해야 할 헤더를 포함합니다.
    server {
        listen 80;
        server_name example.com www.example.com;
    	
        location / {
            proxy_pass http://mywebapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    proxy_set_header 명령은 요청과 관련된 중요한 정보를 상위 서버에 전달하는 데 사용됩니다.
    이 파일을 저장하고 sites-enabled 디렉토리에 대한 기호 링크를 만듭니다.
    ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
    
    오류를 확인하기 위해 설정 테스트를 실행합니다.
    service nginx configtest
    
    오류가 나타나지 않으면nginx 서비스를 다시 불러옵니다.
    service nginx reload
    
    이제 HTTP에 대한 로드 밸런싱이 구성되었습니다.

    SSL 사용


    다음 명령을 server {} 블록에 있는 가상 호스트 파일 (/etc/nginx/sitesavailable/example.com) 에 추가합니다.다음 예제의 컨텍스트에 이러한 행이 표시됩니다.
    listen 443 ssl;
    ssl on;
    ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
    ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
    
    자체 서명 인증서를 사용하는 경우 ssl_trusted_certificate 명령을 무시합니다.이제 블록은 다음과 같이 표시됩니다.
    server {
        listen 80;
        listen 443 ssl;
        server_name example.com www.example.com;
    
        ssl on;
        ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
        ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
        ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
    
        location / {
            proxy_pass http://mywebapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    구성 오류를 확인하고 Nginx 서비스를 다시 로드합니다.
    service nginx configtest && service nginx reload
    

    백엔드 서버 보호


    현재 공공 IP 주소를 아는 사람은 누구나 백엔드 서버에 위탁 관리되는 사이트를 직접 방문할 수 있다.백엔드의 웹 서버를 전용 인터페이스에서만 정탐하도록 설정함으로써 이런 상황을 방지할 수 있다.Apache에서 이 작업을 수행하려면 다음과 같이 하십시오.server 파일을 편집합니다.
    nano /etc/apache2/ports.conf
    
    다음 행을 찾습니다.
    Listen 80
    
    백엔드 서버의 전용 IP 주소로 교체하려면 다음과 같이 하십시오.
    Listen 10.130.227.22:80
    
    모든 백엔드 서버에서 이 작업을 수행하고 Apache를 다시 시작합니다.
    service apache2 restart
    
    다음은 로드 밸런서 전용 IP에 대한 HTTP 액세스를 제한하는 것입니다.다음 방화벽 규칙이 이 점을 실현했다.
    iptables -I INPUT -m state --state NEW -p tcp --dport 80 ! -s 10.130.227.33 -j DROP
    
    이 예시를 부하 평형기의 전용 IP 주소로 대체하고 모든 백엔드 서버에서 이 규칙을 실행합니다.

    테스트 설정


    모든 백엔드 서버 (이 예는 웹1과 웹2)에 PHP 파일을 만듭니다.이것은 테스트에 사용되며, 설치가 완료되면 삭제할 수 있습니다.
    nano /var/www/html/test.php
    
    액세스 도메인 이름, 서버의 IP 주소, 사용자의 IP 주소 및 액세스 포트를 인쇄해야 합니다.
    <?php
        header( 'Content-Type: text/plain' );
        echo 'Host: ' . $_SERVER['HTTP_HOST'] . "\n";
        echo 'Remote Address: ' . $_SERVER['REMOTE_ADDR'] . "\n";
        echo 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n";
        echo 'X-Forwarded-Proto: ' . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "\n";
        echo 'Server Address: ' . $_SERVER['SERVER_ADDR'] . "\n";
        echo 'Server Port: ' . $_SERVER['SERVER_PORT'] . "\n\n";
    ?>
    
    브라우저를 사용하거나 ports.conf 파일을 여러 번 액세스합니다.자체 서명 인증서 설정에서 curl 을 사용하여 curl에서 SSL 오류를 무시합니다.
    curl https://example.com/test.php https://example.com/test.php https://example.com/test.php
    
    출력은 다음과 유사합니다.
       Host: example.com
       Remote Address: 10.130.245.116
       X-Forwarded-For: 117.193.105.174
       X-Forwarded-Proto: https
       Server Address: 10.130.227.11
       Server Port: 80
    
       Host: example.com
       Remote Address: 10.130.245.116
       X-Forwarded-For: 117.193.105.174
       X-Forwarded-Proto: https
       Server Address: 10.130.227.22
       Server Port: 80
    
       Host: example.com
       Remote Address: 10.130.245.116
       X-Forwarded-For: 117.193.105.174
       X-Forwarded-Proto: https
       Server Address: 10.130.227.11
       Server Port: 80
    
    서버 주소는 요청마다 변경됩니다. 이것은 서로 다른 서버가 각 요청에 응답하고 있음을 나타냅니다.

    SSL 구성 강화


    이 섹션에서는 이전 암호와 프로토콜의 빈틈을 없애기 위해 모범 사례에 따라 SSL을 구성합니다.이 절에는 각 줄이 표시되고, 전체 프로필은 이 강좌의 마지막 절에 표시됩니다.
    SSL 세션 캐시를 설정하면 HTTPS 웹 사이트의 성능이 향상됩니다.다음 명령은 curl -k 뒤에 두어야 합니다.이들은 크기가 20MB인 공유 캐시를 지원하며 캐시 생존 기간은 10분입니다.
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;
    
    SSL 연결에 사용할 프로토콜과 암호를 지정합니다.여기에서 SSLv2를 생략하고 MD5와 DSS 등의 비보안 암호를 비활성화합니다.
    ssl_prefer_server_ciphers       on;
    ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    
    a certificate authority 지원되는 모든 웹 브라우저에 HTTPS만 사용하도록 지시합니다.ssl_trusted_certificate 명령을 사용하여 활성화합니다.
    add_header Strict-Transport-Security "max-age=31536000";
    
    구성 오류를 확인하고 Nginx 서비스를 다시 로드합니다.
    service nginx configtest && service nginx reload
    

    전체 구성


    SSL 구성 및 강화가 종료되면 전체 구성 파일은 다음과 같습니다.add_header
    upstream mywebapp1 {
        server 10.130.227.11;
        server 10.130.227.22;
    }
    
    server {
        listen 80;
        listen 443 ssl;
        server_name example.com www.emxaple.com;
    
        ssl on;
        ssl_certificate         /etc/nginx/ssl/example.com/server.crt;
        ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;
        ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
    	
        ssl_session_cache shared:SSL:20m;
        ssl_session_timeout 10m;
    	
        ssl_prefer_server_ciphers       on;
        ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    	
        add_header Strict-Transport-Security "max-age=31536000";
    
        location / {
            proxy_pass http://mywebapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    aStrict Transport Security를 하면 이 설정은 a+등급을 받아야 합니다.curl 테스트를 다시 실행하여 모든 것이 정상인지 확인합니다.
    curl https://example.com/test.php https://example.com/test.php https://example.com/test.php
    

    한층 더 읽다


    부하 균형 알고리즘에 대한 자세한 내용은 SSL Server Test 를 참조하십시오.