이 글에서는 nginx 서버가 http 및 기타 요청에 응답하고 처리하는 방법을 자세히 설명하고, 필요한 친구들이 참고할 수 있는 nginx 가상 호스트 구성 방법을 설명합니다.
1. nginx 이름 기반 가상 호스트
Nginx는 먼저 요청을 처리할 가상 호스트를 선택합니다.
간단한 구성으로 시작하세요(3개의 가상 호스트가 모두 *:80 포트에서 수신 대기하는 경우).
코드 복사 코드 예:
서버 {
듣기 80;
server_name jbxue.org www.jbxue.org;
...
}
서버 {
Listen 80;
server_name jbxue.net www.jbxue.net;
...
}
server {
Listen 80;
server_name jbxue.com www.jbxue .com;
...
}
이 구성에서 nginx는 요청을 처리해야 하는 가상 호스트를 결정하기 위해 요청의 "Host" 헤더만 확인합니다. Host 헤더가 가상 호스트와 일치하지 않거나 요청에 Host 헤더가 전혀 포함되어 있지 않으면 nginx는 이 포트에 정의된 기본 가상 호스트에 요청을 배포합니다. 위 구성에서 나열된 첫 번째 가상 호스트는 nginx의 기본 가상 호스트입니다. 이는 nginx의 기본 동작입니다. 또한 호스트를 기본 가상 호스트로 명시적으로 설정할 수 있습니다. 즉, "listen" 지시문에 "default_server" 매개변수를 설정할 수 있습니다.
코드 복사 코드 예:
서버 {
Listen 80 default_server;
server_name jbxue.net www.jbxue.net;
...
}
"default_server "매개변수는 버전 0.8.21부터 사용할 수 있습니다. 이전 버전에서는 "default" 매개변수를 대신 사용해야 했습니다.
"default_server"는 호스트 이름이 아닌 수신 대기 포트의 속성입니다. 이에 대해서는 나중에 자세히 설명합니다.
호스트 이름이 정의되지 않은 요청 처리를 방지하는 방법
요청에 "Host" 헤더가 허용되지 않는 경우 다음 호스트를 정의하고 해당 요청을 삭제할 수 있습니다.
코드 복사코드 예:
server {
listening 80;
server_name "";
return 444;
}
여기서 호스트 이름은 "Host" 헤더가 정의되지 않은 요청과 일치하도록 빈 문자열로 설정되며, nginx 관련 비HTTP 표준 반환 코드 444가 반환됩니다. 연결을 닫는 데 사용됩니다.
0.8.48 버전부터는 이것이 호스트 이름의 기본값이 되었기 때문에 server_name ""은 생략 가능합니다. 이전 버전에서는 시스템의 호스트 이름을 기본 호스트 이름으로 사용했습니다.
도메인 이름과 IP가 혼합된 가상 호스트
이 구성에는 여러 개의 가상 호스트가 서로 다른 주소를 수신합니다.
코드 복사코드 예:
server {
Listen 192.168.1.1:80;
server_name jbxue.org www.jbxue.org
...
}
서버 {
듣기 192.168.1.1:80;
server_name jbxue.net www.jbxue.net;
...
}
서버 {
듣기 192.168.1.2:80;
server_name jbxue.com www.jbxue.com;
...
}
이에 구성에서 nginx는 먼저 요청된 IP 주소와 포트가 특정 서버 구성 블록의 Listen 지시문 구성과 일치하는지 테스트합니다. 그런 다음 nginx는 요청의 Host 헤더가 이 서버 블록의 특정 server_name 값과 일치하는지 계속 테스트합니다. 호스트 이름을 찾을 수 없으면 nginx는 요청을 기본 가상 호스트로 전달합니다. 예를 들어, 포트 192.168.1.1:80에서 수신된 www.jbxue.com에 대한 액세스 요청은 포트 192.168.1.1:80에서 수신 대기하는 기본 가상 호스트에 의해 처리됩니다. 이 경우에는 정의가 없기 때문에 첫 번째 서버입니다. www.jbxue.com이라는 가상 호스트.
기본 서버는 수신 포트의 속성이므로 서로 다른 수신 포트에 대해 서로 다른 기본 서버를 설정할 수 있습니다.
코드 복사코드 예:
서버 {
듣기 192.168.1.1:80;
server_name jbxue.org www.jbxue.org;
...
}
서버 {
듣기 192.168.1.1:80 default_Server
Server_name jbxue.net
...
}
듣기 192.168.2:80 default_serverver ; 🎜 > 서버_이름 jbxue.com www.jbxue.com;
...
}
두 번째, 간단한 PHP 사이트 구성
일반적인 간단한 PHP 사이트에서 nginx가 요청을 처리할 위치를 선택하는 방법:
코드 복사 코드 예:
server {
Listen 80;
server_name jbxue.org www.jbxue.org;
root /data/www;
위치 / {
index index.html index.php;
}
위치 ~* .(gif|jpg|png)$ {
만료 30일 ;
}
위치 ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name; > }
}
그런 다음 Nginx는 계속해서 구성의 순서대로 정규식 위치를 일치시키고 첫 번째 정규식을 일치시킨 후 검색을 중지합니다.
일치된 위치가 사용됩니다. 정규식과 일치하는 위치가 없으면 방금 찾은 접두사와 가장 정확하게 일치하는 위치가 사용됩니다.
모든 위치 일치 테스트는 매개변수 부분이 아닌 요청의 URI 부분만 사용한다는 점에 유의하세요. 이는 다음과 같이 매개변수를 작성하는 방법이 다양하기 때문입니다.
/index.php?user=john&page=1
/index.php?page=1&user=john
또한 누구나 요청 문자열에 어떤 문자열이든 추가할 수 있습니다:
/index.php?page=1&something+else&user=john 위 구성을 사용하여 요청이 어떻게 처리되는지 살펴보겠습니다:
Request "/logo. gif"는 먼저 "/" 위치와 일치한 다음 정규식 ".(gif|jpg|png)$"와 일치합니다. 따라서 후자에 의해 처리됩니다. "root /data/www" 명령에 따라 nginx는 요청을 /data/www/logo.gif 파일에 매핑하고 이 파일을 클라이언트에 보냅니다.
요청 "/index.php" 또한 첫 번째 위치 "/"와 일치하고 정규 표현식 ".(php)$"와 일치합니다. 따라서 후자에 의해 처리된 다음 fastcgi_param 지시문이 설정됩니다. FastCGI 매개변수 SCRIPT_FILENAME 값은 "/data/www/index.php"로 설정되며, FastCGI 서버는 이 파일을 실행합니다. $document_root 변수는 루트 지시문에 의해 설정된 값과 동일하며, 해당 변수의 값은 다음과 같습니다. $fastcgi_script_name은 요청된 URI "/index.php"입니다. >
그런 다음 index 명령은 해당 매개변수와 "root /data/www" 명령으로 구성된 파일 경로를 사용하여 여부를 감지합니다. 해당 파일이 존재합니다.
/data/www/index.html 파일이 존재하지 않고, /data/www/index.php가 존재하는 경우, 이 명령은 "/index.php"로 내부 리디렉션을 수행합니다. 그런 다음 nginx는 이 요청이 클라이언트에서 온 것처럼 "/index.php"와 일치하는 위치를 다시 검색합니다.앞서 본 것처럼 리디렉션된 이 요청은 궁극적으로 FastCGI 서버에 의해 처리됩니다.
이상에서는 관련 측면을 포함하여 nginx의 요청 응답 및 처리 방법에 대한 자세한 설명을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.