웹사이트 검색

일반적인 Nginx 구문 오류


소개

Nginx는 인터넷에서 트래픽이 많은 대규모 사이트를 많이 호스팅할 수 있는 인기 있는 웹 서버입니다. Nginx 웹 서버를 설정할 때 일반적으로 사이트에서 들어오는 요청을 처리할 수 있도록 구성 세부 정보가 포함된 도메인 블록을 생성하여 수행합니다. Nginx를 설정할 때 발생하는 일반적인 오류 중 하나는 구성 파일의 구문과 그것이 유효한지 확인하는 것과 관련됩니다.

이 가이드의 예제는 Ubuntu 22.04 서버에서 테스트되었지만 대부분 표준화된 구성 파일 내에서 처리하므로 대부분의 Nginx 설치에 적용할 수 있습니다. 디렉토리와 경로는 약간 다를 수 있습니다.

이 튜토리얼에서는 Nginx 구성 파일에서 발생할 수 있는 구문 오류, 이를 확인하는 방법 및 수정하는 방법에 대해 알아봅니다.

Nginx 오류 로그 검사

이 자습서에 제시된 오류 및 해결 방법은 일반적인 경우이지만 완전하지는 않습니다. Nginx가 유효한 문장으로 인식하는 구조를 깨뜨리는 구문 오류의 특성으로 인해 다음 오류는 Nginx가 응답하는 방법에 대한 지침일 뿐입니다. 종종 하나의 오류가 다른 오류로 연쇄될 수 있으며 오류는 더 크거나 별도의 문제를 나타낼 수 있습니다. 특정 상황과 설정은 다를 수 있습니다.

항상 Nginx 오류 로그를 참조하여 실행 중인 목록을 볼 수 있습니다.

  1. sudo cat /var/log/nginx/error.log

이 튜토리얼은 나중에 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

오류가 있는 경우 오류가 발생한 정확한 파일과 코드 줄, 해결해야 할 특정 구문 문제를 식별하는 메시지를 받게 됩니다.

구조적 구문 오류 식별 — Nginx 구성 파일의 세미콜론, 중괄호 및 매개변수

Nginx에서 발생할 수 있는 일반적인 오류 중 하나는 누락된 문자 또는 잘못된 구문 구조와 관련이 있습니다. Nginx의 구성 파일은 디렉티브에 초점을 맞추고 있으며 이러한 디렉티브는 특정 방식으로 선언되어야 합니다. 그렇지 않으면 구성 파일이 구조적으로 유효하지 않습니다.

지시문은 각각에 대한 특정 구문이 있는 두 가지 유형으로 나눌 수 있습니다. 세미콜론으로 끝나는 지시문의 이름과 매개변수를 포함하는 단순 지시문이 있을 수 있습니다. 단일 지시어와 유사한 블록 지시어도 있을 수 있지만 중괄호 { }로 구분되며 그 안에 다른 블록을 포함할 수도 있습니다.

디렉티브가 적절하게 구성되지 않은 경우 Nginx는 이를 의도한 디렉티브로 인식하지 못하고 다음과 같은 오류가 발생할 수 있습니다.

Nginx의 잘못된 매개변수 오류

Nginx 구성 파일은 적절한 구조 및 구문과 관련하여 매우 특별합니다. 실제로 구문에서 발생할 수 있는 한 가지 문제는 세미콜론 ;와 관련이 있습니다. 예를 들어 다음 오류 메시지를 고려하십시오.

[emerg] invalid parameter "root" in /etc/nginx/sites-enabled/example.com:5
nginx: configuration file /etc/nginx/nginx.conf test failed

이 예제에서 문제를 해결하기 전에 Nginx 오류 메시지의 구성 요소를 이해해야 합니다. 오류 메시지에는 오류의 원인을 식별하는 데 도움이 되는 특정 힌트가 있습니다. 이 경우 [emerg]는 "emergency\를 나타내며 시스템이 불안정한 것과 관련된 오류 메시지를 나타냅니다. 이 컨텍스트에서 이것은 Nginx가 다음과 같은 문제에 부딪쳤다는 것을 의미합니다. 작동하지 못하게 합니다.

이 오류 메시지는 이 오류를 찾을 수 있는 위치를 추가로 식별합니다. Nginx 설정에서 /etc/nginx/nginx.conf에 심볼릭 링크된 사용자 정의 구성 파일이 있다는 점에 유의하십시오. 예를 들어 Ubuntu 22.04에 Nginx를 설치하는 방법에 대한 가이드를 따랐다면 5단계에서 이를 구체적으로 보여줍니다. 오류가 있는 구성 파일의 정확한 줄은 /etc/nginx/sites-enabled/example.com:5입니다. 또한 해당 파일에 잘못된 매개변수 \root\가 있음을 알게 됩니다.

이제 오류를 찾을 수 있는 위치에 대한 정보가 있으므로 선호하는 텍스트 편집기로 파일을 열 수 있습니다. 여기서는 nano를 사용합니다.

참고: 확실하지 않은 경우 일반적으로 /etc/nginx/ 디렉토리에서 모든 구성 파일을 찾을 수 있습니다. 알아야 할 다른 중요한 Nginx 파일 및 디렉토리에 대한 자세한 내용은 자습서를 읽어보십시오.

  1. sudo nano /etc/nginx/sites-available/example.com

안에 들어가면 오류 메시지가 참조한 줄 5를 찾습니다. 다음에서 줄이 강조 표시됩니다.

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

       root /var/www/example.com/html
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

이제 여기서 발생하는 오류는 분명하지 않을 수 있습니다. 오류 메시지를 기억해 보면 잘못된 매개변수가 있습니다. 매개변수는 Nginx의 지시문에 제공하는 인수입니다. /var/www/example.com/html은 이 시나리오에서 제공된 매개변수이지만 유효하지 않습니다. 구문 구조에서 누락된 문자가 있습니다. 이 경우 행 끝에 누락된 세미콜론이 있습니다.

이 파일의 다른 많은 줄도 세미콜론으로 끝나는 것을 알 수 있습니다. 줄에 지시어가 포함되어 있으면 언제든지 세미콜론이 필요합니다. 이 특정 예는 파일을 검색할 때 사용할 루트 디렉토리를 지정하는 root 지시문입니다. Nginx가 특정 URL 경로를 찾을 수 있으려면 이 루트 지시어가 있어야 합니다. 디렉티브의 중요성은 이후 섹션에서 논의할 것입니다.

즉, 지시문이 유효한지 확인하기 위해 이 줄 끝에 세미콜론을 추가하여 이 오류를 수정할 수 있습니다. 귀하의 업데이트는 다음과 같습니다.

…

       root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

…

업데이트가 완료되면 파일을 저장하고 닫습니다. nano를 사용하는 경우 CTRL + X, Y, ENTER를 차례로 누르면 됩니다.

sudo nginx -t 명령을 실행하여 구문 오류가 수정되었는지 확인할 수 있습니다.

Nginx의 예상치 못한 \}\ 오류

Nginx 구문 구조에서 발생할 수 있는 또 다른 일반적인 오류는 중괄호 { }입니다. 잘못된 매개변수를 수정하는 방법을 지정하지 않은 이전 오류와 달리 이 오류는 오류에 대한 이유를 명시적으로 제공합니다.

nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/example.com:15
nginx: configuration file /etc/nginx/nginx.conf test failed

이 오류 메시지는 다른 [emerg] 유형이며 15 줄에 이전과 동일한 구성 파일에 예기치 않은 중괄호가 있음을 나타냅니다. 원하는 텍스트 편집기를 사용하여 이 파일을 열면 내용은 다음과 같습니다.

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

       root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
       }

이 파일의 끝에 강조 표시된 것은 중괄호 }입니다. 언뜻 보기에는 예기치 않은 \}\이(가) 있는 것처럼 보이기 때문에 문제가 무엇인지 명확하지 않을 수 있습니다. 자세히 살펴보면 실제로 그 뒤에 누락된 중괄호가 있습니다. 적절한 양의 중괄호는 특정 블록의 열기 및 닫기를 나타내기 때문에 Nginx 구성 파일에서 중요합니다. 초점을 맞추면 파일 끝에 있는 중괄호가 실제로 다음 중첩 location 블록에 대한 닫는 중괄호라는 것을 알 수 있습니다.

…

 location / {
                try_files $uri $uri/ =404;
       }

구성 파일의 내용을 더 자세히 검토하면 닫는 중괄호가 누락된 것은 server 블록입니다. Nginx 서버 블록은 Nginx가 수신하는 다양한 요청을 처리할 가상 서버를 인식하는 데 필요한 구성 세부 정보를 제공하기 때문에 중요합니다. 들어오는 요청을 처리할 때 서버 블록이 우선하므로 위치 블록이 서버 블록 내에 중첩된다는 점에 유의해야 합니다. 이 모든 것을 염두에 두고 파일 끝에 닫는 중괄호를 추가하여 서버 블록을 완성할 수 있습니다. 이제 이 파일의 내용은 다음과 같습니다.

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

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

완료되면 파일을 저장하고 닫는 것을 잊지 마십시오. sudo nginx -t를 실행하여 이 구문 오류가 해결되었는지 확인합니다.

Nginx의 잘못된 호스트 오류

이 다음 오류는 지시문에 지정된 형식이 잘못된 매개변수에서 오류가 발생하기 때문에 이전 두 오류와 다릅니다. 줄을 세미콜론 ;으로 끝내고 모든 중괄호 {}로 닫는 것은 구성 파일의 전체 구조를 처리하지만 매개변수는 사용자 지정 입력입니다. 설정 요구 사항에 따라 달라질 수 있습니다.

host는 이 시나리오에서 영향을 받는 지시어이지만 잘못된 매개변수가 제공된 경우 모든 지시어에 이 오류가 발생할 수 있습니다. 그에 따라 오류 메시지가 변경됩니다. 유효한 매개변수를 제공하면 다음 시나리오와 같은 오류를 피할 수 있습니다.

[emerg] invalid host in "[::]80" of the "listen" directive in /etc/nginx/sites-enabled/example.com:3
nginx: configuration file /etc/nginx/nginx.conf test failed

이 예의 비상 오류는 호스트에 대해 설정된 포트 80 지시문이 유효하지 않음을 설명합니다. 이 오류 메시지는 이 오류를 찾을 수 있는 위치와 구성 파일의 정확한 줄을 식별합니다: /etc/nginx/sites-enabled/example.com:3. 이제 오류를 찾을 수 있는 위치에 대한 정보가 있으므로 선호하는 텍스트 편집기로 파일을 열 수 있습니다. 안에 들어가면 오류 메시지가 참조한 줄 3을 찾습니다. 다음에서 줄이 강조 표시됩니다.

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

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

대괄호 안의 두 콜론은 IPv6 표기법 또는 0.0.0.0을 나타내며 대괄호 뒤에 추가 콜론이 없으면 80 포트에 바인딩할 수 없습니다. 결과적으로 listen 지시문은 작동하지 않습니다. 콜론이 없으면 서버에서 수신하려는 포트가 명확하지 않기 때문입니다.

요컨대 여기서 발생하는 특정 구문 오류는 대괄호 [::] 뒤에 누락된 콜론이 있어 매개변수 자체를 유효하지 않게 만드는 것입니다. 누락된 콜론을 추가하면 파일의 코드 스니펫이 다음과 같이 표시됩니다.

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

이 행을 업데이트한 후 파일을 저장하고 닫은 다음 sudo nginx -t를 실행하여 이 구문 오류가 수정되었는지 확인하십시오.

전반적으로 매개 변수, 세미콜론 ; 또는 중괄호 { }와 관련된 이러한 구문 오류를 수신할 때 제공된 정확한 위치 및 세부 정보에 주의를 기울이는 것이 좋습니다. [emerg] 메시지에서.

디렉티브 오용 식별 — Nginx 구성 파일의 키워드

누락된 콜론 또는 중괄호로 인해 발생할 수 있는 구문 오류 외에도 구성 파일의 지시문과 관련된 철자가 틀린 키워드와 같은 오류 가능성이 있습니다. 이전 섹션에서 디렉티브에 대해 간략하게 언급했지만 여기에서 다시 살펴보겠습니다.

Nginx의 알 수 없는 지시어 오류

앞에서 언급했듯이 Nginx 구성 파일의 기초는 지시문을 기반으로 합니다. Nginx에는 선택할 수 있는 많은 지시어가 있지만 구성 파일에는 몇 가지 주요 지시어가 필요합니다. 그러나 지시문 자체에 오류가 발생할 수 있습니다. 특히 키워드가 정확하게 작성되지 않은 경우에 그렇습니다. 다음은 표시될 수 있는 오류 메시지의 예입니다.

nginx: [emerg] unknown directive "serve_name" in /etc/nginx/sites-enabled/example.com:8
nginx: configuration file /etc/nginx/nginx.conf test failed

이 오류는 8행의 구성 파일에서 알 수 없는 지시문 serve_name을 식별합니다. 원하는 텍스트 편집기로 구성 파일을 열면 내용이 다음과 같이 나열됩니다.

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

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        serve_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

이 예에서 트리거되는 오류는 server_name 지시문에 대한 "server\의 철자가 잘못된 결과입니다. 이 경우 누락된 "r\이 있으며 이러한 이유로 이 단일 지시문을 인식할 수 없습니다. server_name 지시문이 요청이 주어졌을 때 서버 블록이 참조할 특정 서버 이름을 제공하기 때문에 이것은 중요한 오류입니다. 이 지시문이 올바르게 작동하지 않으면 요청을 이행할 수 없습니다. 이것은 겉보기에 작은 오타 오류일 수 있지만 구문을 방해하고 오류를 발생시킵니다. 구성 파일에서 이 코드 스니펫을 다음으로 업데이트할 수 있습니다.

server_name example.com www.example.com;

…

이 파일을 저장하고 닫은 후 sudo nginx -t 명령으로 작동하는지 확인할 수 있습니다.

여기서 Nginx의 지시어는 허용되지 않습니다. 오류

이제 동일한 지시문에 오류가 발생했지만 이번에는 메시지가 다음과 같이 읽힌다고 가정해 보겠습니다.

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/example.com:8
nginx: configuration file /etc/nginx/nginx.conf test failed

이 오류가 이전 오류와 동일한 위치에서 발생하더라도 이 메시지에 문제의 원인이 자세히 설명되어 있음을 알 수 있습니다. 따라서 오류 메시지가 나타내는 내용을 이해하는 것이 중요합니다. "알 수 없는 지시어\에 관한 이전 오류 메시지와 달리 이 오류는 \서버\ 지시어가 허용되지 않음을 나타냅니다. 선호하는 텍스트 편집기로 구성 파일을 열어 검사할 수 있습니다. 내용물:

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

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

여기서 "server\라는 단어의 철자는 정확하지만 지시문 자체는 밑줄 구분이 누락된 server_name 지시문의 정확한 표현이 아닙니다. 따라서 server는 다음과 같이 인식됩니다. 오류 메시지에 명시된 대로 허용되지 않는 중복 이것은 앞에서 논의한 단일 지시문과 블록 지시문의 구분과 관련이 있습니다.

여기에서 발생하는 오류는 단일 지시문 server nameserver를 읽기만 하기 때문에 시작 부분에서 첫 번째 server 블록 지시문과 충돌하기 때문입니다. 파일. 구성 파일의 Nginx 계층 구조로 인해 블록 지시문과 중첩된 단일 지시문 사이에서 발생할 수 있는 까다로운 구문 오류입니다. server_name에 대한 정확한 지시문 키워드를 올바르게 나타내기 위해 밑줄 _을 추가하여 이 오류를 수정할 수 있습니다.

…

        server_name example.com www.example.com;

…

수정했으면 파일을 저장하고 닫습니다. 그런 다음 sudo nginx -t로 구문이 유효한지 확인합니다. 구성 파일에 다른 오류가 없는 한 구문은 정상입니다 메시지를 반환해야 합니다.

참고: Nginx 구성 파일의 경우 오류를 유발하지 않는 줄 간격 또는 구분에 약간의 유연성이 있습니다. 그러나 지시문과 명시적으로 관련된 모든 항목은 제대로 작동하려면 정확한 단어 또는 구문 구조가 필요하므로 오류를 반환합니다.

기억해야 할 마지막 알림은 구성 파일에 여러 오류가 포함된 경우 받은 오류 메시지가 한 번에 하나씩만 연속 순서로 반환된다는 것입니다. 즉, 한 가지 문제에 대한 오류 메시지를 수신하고 이를 수정한 다음 구문 검사 명령을 다시 실행하면 다음 오류가 출력에 반환됩니다. 이것은 모든 오류가 수정될 때까지 계속 발생합니다.

이제 구성 파일의 특정 지시문에서 발생할 수 있는 다른 구문 오류에 대해 배웠습니다. 이러한 모든 예는 터미널 환경에서 표현된다는 점에 유의하는 것이 중요합니다. 원하는 경우 여러 오류 메시지를 트리거하지 않고 코드의 오류를 확인하고 강조 표시할 수 있는 Visual Studio Code와 같은 코드 편집기를 사용하여 오류를 한 번에 모두 수정하거나 조기에 모두 방지할 수 있는 옵션이 있습니다.

결론

이 튜토리얼에서는 Nginx의 일반적인 구문 오류와 이를 수정하는 방법에 대해 배웠습니다. 많은 Nginx 구문 오류가 발생할 수 있지만 이러한 예제는 가장 일반적인 오류에 대한 몇 가지 가능성과 솔루션을 제공했습니다. Nginx 구성 파일에 대해 자세히 알아보려면 Ubuntu 22.04에 Nginx를 설치하는 방법을 참조하십시오.