nginx 가상 호스트에서 재사용 포트를 사용하는 올바른 방법

nginx 가상 호스트에서 재사용 포트를 사용하는 올바른 방법

나는 nginx를 gunicorn 애플리케이션 서버(Django 앱)와 함께 역방향 프록시로 사용합니다.

내 nginx 가상 호스트 파일에는 두 개의 블록이 있습니다 server. 전자는 www트래픽을 후자(트래픽을 처리하는)로 non-www리디렉션 합니다 https.

구체적으로 이전 위치 블록은 다음과 같습니다.

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

후자의 위치 블록은 다음과 같습니다.

server {

    server_name example.com;
    listen 443 ssl http2 reuseport;
    listen [::]:443 ssl http2 reuseport;

    # other directives here
}

reuseport후자 블록의 사용에 주목하세요 .

두 블록을 모두 넣으면 reuseport오류가 발생합니다: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62.

이전 블록에만 삽입하면 작동합니다. 전자 블록인지 후자인지 정확히 어디에 배치해야 할지 고민입니다. 누군가 명확히 할 수 있습니까?


reuseport매개변수가 nginx에 각 작업자 프로세스에 대한 개별 수신 소켓을 생성하도록 지시하여 커널이 작업자 프로세스 간에 들어오는 연결을 분산할 수 있도록(클라이언트와 서버 간에 전송되는 여러 패킷을 처리하기 위해) 이해합니다 .

하지만 이는 앞서 언급한 두 블록 모두에서 왜 사용할 수 없는지 reuseport또는 어느 블록에서 사용해야 하는지(한 블록에서만 사용할 수 있다는 점을 고려하면) 이해하는 데 도움이 되지 않습니다.

답변1

NGINX에서는 네트워크 소켓의 청취 옵션을 구성에서 한 번만 지정하고 server동일한 소켓(포트)에서 청취하는 다른 모든 구성된 에 "적용"됩니다. 인용문서:

Listen 지시문에는 소켓 관련 시스템 호출과 관련된 여러 추가 매개변수가 있을 수 있습니다. 이러한 매개변수는 모든 Listen 지시문에 지정할 수 있지만 지정된 주소:포트 쌍에 대해 한 번만 지정할 수 있습니다.

따라서 오류 메시지에서 해독해야 할 것은 reuseport모든 고유 listen주소+포트에 대해 한 번만 지정해야 한다는 것입니다.

이를 수행하는 방법은 server선호도에 따라 다릅니다. 그러나 원칙적으로 명확성을 위해 다음과 같은 지시문을 server사용하여 s 중 하나를 지정하는 것이 좋습니다 default_server.

있는 경우 서버는 지정된 주소:포트 쌍에 대한 기본 서버가 됩니다. default_server 매개변수가 있는 지시문이 없으면 주소:포트 쌍이 있는 첫 번째 서버가 이 쌍의 기본 서버가 됩니다.

그런 다음 해당 서버 블록(지정한 위치 default_server)에 청취 옵션을 배치합니다.

예:

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

server {

    server_name example.com;
    listen 443 ssl http2 default_server reuseport;
    listen [::]:443 ssl http2 default_server reuseport;

    # other directives here
}

관련 정보