웹사이트 검색

Ubuntu 22.04에서 Nginx를 리버스 프록시로 구성하는 방법


소개

리버스 프록시는 응용 프로그램 서버를 인터넷에 노출하는 데 권장되는 방법입니다. 프로덕션 환경에서 Node.js 애플리케이션을 실행하든 Flask와 함께 최소한의 기본 제공 웹 서버를 실행하든 이러한 애플리케이션 서버는 종종 TCP 포트를 사용하여 localhost에 바인딩됩니다. 이는 기본적으로 응용 프로그램이 상주하는 컴퓨터에서만 로컬로 액세스할 수 있음을 의미합니다. 인터넷을 통해 강제로 액세스하기 위해 다른 바인드 지점을 지정할 수 있지만 이러한 애플리케이션 서버는 프로덕션 환경에서 역방향 프록시 뒤에서 제공되도록 설계되었습니다. 이것은 직접 인터넷 액세스로부터 응용 프로그램 서버를 격리하는 보안 이점, 방화벽 보호를 중앙 집중화하는 기능 및 서비스 거부 공격과 같은 일반적인 위협에 대한 최소화된 공격 평면을 제공합니다.

클라이언트의 관점에서 리버스 프록시와 상호 작용하는 것은 애플리케이션 서버와 직접 상호 작용하는 것과 다르지 않습니다. 기능적으로 동일하며 클라이언트는 차이점을 구분할 수 없습니다. 클라이언트는 리소스를 요청한 다음 클라이언트에서 요구하는 추가 구성 없이 리소스를 받습니다.

이 튜토리얼은 널리 사용되는 웹 서버이자 리버스 프록시 솔루션인 Nginx를 사용하여 리버스 프록시를 설정하는 방법을 보여줍니다. Nginx를 설치하고 proxy_pass 지시문을 사용하여 리버스 프록시로 구성하고 클라이언트 요청에서 적절한 헤더를 전달합니다. 테스트할 애플리케이션 서버가 없는 경우 선택적으로 WSGI 서버 Gunicorn을 사용하여 테스트 애플리케이션을 설정합니다.

전제 조건

이 자습서를 완료하려면 다음이 필요합니다.

  • Ubuntu 22.04용 초기 서버 설정 가이드에 따라 설정된 Ubuntu 22.04 서버,
  • 프록시하려는 애플리케이션 서버의 주소입니다. 이 주소는 자습서 전체에서 app_server_address라고 합니다. TCP 포트가 있는 IP 주소(예: http://127.0.0.1:8000의 Gunicorn 기본값) 또는 유닉스 도메인 소켓(예: http://unix :/tmp/pgadmin4.sock(pgAdmin용). 테스트할 애플리케이션 서버가 설정되어 있지 않은 경우 http://127.0.0.1:8000에 바인딩되는 Gunicorn 애플리케이션을 설정하는 과정이 안내됩니다.
  • 서버의 공개 IP를 가리키는 도메인 이름. 애플리케이션 서버를 프록시하도록 Nginx로 구성됩니다.

1단계 - Nginx 설치

Nginx는 기본 리포지토리를 통해 apt로 설치할 수 있습니다. 리포지토리 인덱스를 업데이트한 다음 Nginx를 설치합니다.

  1. sudo apt update
  2. sudo apt install nginx

Y를 눌러 설치를 확인합니다. 서비스를 다시 시작하라는 메시지가 표시되면 ENTER를 눌러 기본값을 적용합니다.

방화벽을 통해 Nginx에 대한 액세스를 허용해야 합니다. 초기 서버 전제 조건에 따라 서버를 설정했으면 ufw와 함께 다음 규칙을 추가합니다.

  1. sudo ufw allow 'Nginx HTTP'

이제 Nginx가 실행 중인지 확인할 수 있습니다.

  1. systemctl status nginx
Output
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-08-29 06:52:46 UTC; 39min ago Docs: man:nginx(8) Main PID: 9919 (nginx) Tasks: 2 (limit: 2327) Memory: 2.9M CPU: 50ms CGroup: /system.slice/nginx.service ├─9919 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" └─9920 "nginx: worker process

다음으로 도메인 및 앱 서버 프록시와 함께 사용자 지정 서버 블록을 추가합니다.

2단계 - 서버 블록 구성

기본 구성을 직접 편집하는 대신 새 서버 블록 추가를 위한 사용자 지정 구성 파일을 생성하는 것이 좋습니다. nano 또는 원하는 텍스트 편집기를 사용하여 새 Nginx 구성 파일을 만들고 엽니다.

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

새 파일에 다음을 삽입하고 your_domainapp_server_address를 교체해야 합니다. 테스트할 애플리케이션 서버가 없는 경우 기본적으로 3단계에서 선택적 Gunicorn 서버 설정에 대해 http://127.0.0.1:8000을 사용합니다.

server {
    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain;
        
    location / {
        proxy_pass app_server_address;
        include proxy_params;
    }
}

nano를 사용하여 저장하고 종료합니다. CTRL+O를 누른 다음 CTRL+X를 눌러 이 작업을 수행할 수 있습니다.

이 구성 파일은 Nginx가 포트 80에서 수신하고 your_domainwww.your_domain. 리버스 프록시 기능은 Nginx의 proxy_pass 지시문을 통해 활성화됩니다. 이 구성을 사용하면 로컬 웹 브라우저에서 your_domain으로 이동하는 것이 원격 시스템에서 app_server_address를 여는 것과 동일합니다. 이 튜토리얼에서는 단일 애플리케이션 서버만 프록시하지만 Nginx는 한 번에 여러 서버의 프록시 역할을 할 수 있습니다. 필요에 따라 더 많은 위치 블록을 추가하면 단일 서버 이름이 프록시를 통해 여러 애플리케이션 서버를 하나의 응집력 있는 웹 애플리케이션으로 결합할 수 있습니다.

모든 HTTP 요청에는 요청을 보낸 클라이언트에 대한 정보가 포함된 헤더가 있습니다. 여기에는 IP 주소, 캐시 기본 설정, 쿠키 추적, 인증 상태 등과 같은 세부 정보가 포함됩니다. Nginx는 proxy_params로 포함한 몇 가지 권장 헤더 전달 설정을 제공하며 자세한 내용은 /etc/nginx/proxy_params에서 확인할 수 있습니다.

proxy_set_header Host $http_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는 proxy_set_header 지시문을 사용합니다.

기본적으로 Nginx는 리버스 프록시로 작동할 때 두 개의 헤더를 변경하고 빈 헤더를 모두 제거한 다음 요청을 전달합니다. 두 개의 변경된 헤더는 HostConnection 헤더입니다. 사용할 수 있는 많은 HTTP 헤더가 있으며 각 목적에 대한 자세한 내용은 이 HTTP 헤더의 세부 목록을 확인할 수 있습니다. 리버스 프록시에 대한 관련 헤더는 나중에 여기서 다루게 됩니다.

다음은 proxy_params가 전달하는 헤더와 데이터를 저장하는 변수입니다.

  • Host: 이 헤더에는 클라이언트가 요청한 원래 호스트(웹 사이트 도메인 및 포트)가 포함됩니다. Nginx는 이것을 $http_host 변수에 보관합니다.
  • X-Forwarded-For: 이 헤더에는 원래 요청을 보낸 클라이언트의 IP 주소가 포함되어 있습니다. 또한 IP 주소 목록을 포함할 수 있습니다. 원래 클라이언트 IP가 먼저 나온 다음 요청을 통과한 리버스 프록시 서버의 모든 IP 주소 목록이 있습니다. Nginx는 이것을 $proxy_add_x_forwarded_for 변수에 보관합니다.
  • X-Real-IP: 이 헤더에는 항상 원격 클라이언트에 속하는 단일 IP 주소가 포함됩니다. 이는 주소 목록을 포함할 수 있는 유사한 X-Forwarded-For와 대조됩니다. X-Forwarded-For가 없으면 X-Real-IP와 동일합니다.
  • X-Forwarded-Proto: 이 헤더에는 원래 클라이언트가 연결하는 데 사용하는 프로토콜(HTTP 또는 HTTPS)이 포함되어 있습니다. Nginx는 이것을 $scheme 변수에 보관합니다.

다음으로 Nginx가 시작할 때 읽는 sites-enabled 디렉토리에 대한 링크를 생성하여 이 구성 파일을 활성화합니다.

  1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

이제 구성 파일에서 구문 오류를 테스트할 수 있습니다.

  1. sudo nginx -t

보고된 문제가 없으면 Nginx를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo systemctl restart nginx

Nginx는 이제 애플리케이션 서버의 리버스 프록시로 구성되었으며 애플리케이션 서버가 실행 중인 경우 로컬 브라우저에서 Nginx에 액세스할 수 있습니다. 원하는 애플리케이션 서버가 있지만 실행 중이 아닌 경우 원하는 애플리케이션 서버 시작으로 진행할 수 있습니다. 이 자습서의 나머지 부분은 건너뛸 수 있습니다.

그렇지 않으면 다음 단계에서 Gunicorn을 사용하여 테스트 애플리케이션 및 서버 설정을 진행합니다.

3단계 - Gunicorn으로 역방향 프록시 테스트(선택 사항)

이 자습서를 시작하기 전에 응용 프로그램 서버를 준비하고 실행했다면 지금 브라우저에서 방문할 수 있습니다.

your_domain

그러나 리버스 프록시를 테스트할 애플리케이션 서버가 없는 경우 다음 단계를 수행하여 테스트 애플리케이션과 함께 Gunicorn을 설치할 수 있습니다. Gunicorn은 종종 Nginx 리버스 프록시와 페어링되는 Python WSGI 서버입니다.

apt 리포지토리 인덱스를 업데이트하고 gunicorn을 설치합니다.

  1. sudo apt update
  2. sudo apt install gunicorn

Python 가상 환경과 페어링할 수 있는 최신 버전의 PyPI를 사용하여 pip를 통해 Gunicorn을 설치할 수도 있지만 여기에서는 apt가 빠른 테스트 베드로 사용됩니다. .

다음으로 "Hello World!\를 반환하는 Python 함수를 작성합니다. 웹 브라우저에서 렌더링할 HTTP 응답으로 nano 또는 선호하는 텍스트 편집기를 사용하여 test.py를 만듭니다.

  1. nano test.py

다음 Python 코드를 파일에 삽입합니다.

def app(environ, start_response):
    start_response("200 OK", [])
    return iter([b"Hello, World!"])

이는 웹 브라우저에서 텍스트 문자열을 렌더링하는 HTTP 응답을 시작하기 위해 Gunicorn에서 필요한 최소 코드입니다. 코드를 검토한 후 파일을 저장하고 닫습니다.

이제 Gunicorn 서버를 시작하고 그 안에 test Python 모듈과 app 함수를 지정합니다. 서버를 시작하면 터미널이 인계됩니다.

  1. gunicorn --workers=2 test:app
Output
[2022-08-29 07:09:29 +0000] [10568] [INFO] Starting gunicorn 20.1.0 [2022-08-29 07:09:29 +0000] [10568] [INFO] Listening at: http://127.0.0.1:8000 (10568) [2022-08-29 07:09:29 +0000] [10568] [INFO] Using worker: sync [2022-08-29 07:09:29 +0000] [10569] [INFO] Booting worker with pid: 10569 [2022-08-29 07:09:29 +0000] [10570] [INFO] Booting worker with pid: 10570

출력은 Gunicorn이 http://127.0.0.1:8000의 기본 주소에서 수신하고 있음을 확인합니다. 이는 이전에 Nginx 구성에서 프록시로 설정한 주소입니다. 그렇지 않은 경우 /etc/nginx/sites-available/your_domain 파일로 돌아가 proxy_pass와 연결된 app_server_address를 편집합니다. 지시어.

웹 브라우저를 열고 Nginx로 설정한 도메인으로 이동합니다.

your_domain

Nginx 리버스 프록시가 이제 Gunicorn 웹 애플리케이션 서버에 서비스를 제공하며 "Hello World!\를 표시합니다.

결론

이 튜토리얼을 통해 Nginx를 역방향 프록시로 구성하여 로컬에서만 사용할 수 있는 애플리케이션 서버에 액세스할 수 있도록 했습니다. 또한 클라이언트의 헤더 정보를 전달하여 요청 헤더의 전달을 구성했습니다.

Nginx를 리버스 프록시로 사용하는 완벽한 솔루션의 예는 Ubuntu 22.04에서 InstantSearch를 사용하여 Meilisearch 프런트엔드를 실행하는 방법을 확인하세요.