[Linux] Nginx FastCGI 에 대한 설명

[Linux] Nginx FastCGI 에 대한 설명 updated_at: 2023-06-21 15:08

Nginx FastCGI

FastCGI모듈은 엔진엑스 기본 빌드에 포함되므로 컴파일때 수작업으로 설정할 필요는 없다. 다음 지시어들은 엔진엑스가 FastCGI어플리케이션에 요청을 넘겨주는 방법에 관한 환경을 설정한다. 엔진엑스 환경설정 폴더에 있는 fastcgi_params파일에는 대부분의 상황에서 유효한 지시어 값들이 정의돼 있음에 유의한다.

주요지시어

지시어 설명 문맥 구문 기본값 사용예
fastcgi_pass 위치를 명시해 요청이 FastCGI서버에 전달되게 지정한다. location, if TCP 소켓일 때의 구문: fastcgi_pass hostname:port;
유닉스도메인소켓일떄의 구문: fastcgi_pass unix:/path/to/fastcgi.socket;
업스트림블록을 지정할수 있다: fastcgi_pass myblock;
fastcgi_pass localhost:9000;
fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;
  • 업스트림 블록을 사용하는 경우
upstream fastcgi {
  server 127.0.0.1:9000;
  server 127.0.0.1:9001;
}

location ~* \.py$ {
  fastcgi_pass fastcgi;
}
fastcgi_param 요청이 FastCGI에 전달되게 환경을 설정한다. 모든 FastCGI에 대해 두개의 매개변수 SCRIPT_FILENAME과 QUERY_STRING이 반드시 필요하다. http, server, location fastcgi_param PARAM value; fastcgi_param SCRIPT_FILENAME /home/website.com/www$fastcgi_script_name;

fastcgi_param QUERY_STRING $qeury_string;

POST요청은 REQUEST_METHOD, CONTENT_TYPE, CONTENT_LENGTH매개변수를 추가로 요구한다.

fastcgi_param REQUEST_METHOD $request_method;

fastcgi_param CONTENT_TYPE $content_type;

fastcgi_param CONTENT_LENGTH $content_length;

엔진엑스 환경설정 폴더에 있는 fastcgi_params파일은 필요한 모든 매개변수 정의를 이미 포함하고 있다. 단, 각 FastCGI환경설저에 대해 따로 지정해야 하는 SCRIPT_FILENAME매개변수만 제외돼 있다.

fastcgi_pass_header FastCGI 서버로 넘겨주는 추가적인 헤더를 지정한다. http, server, location fastcgi_pass_header headername; fastcgi_pass_header Authorization;
fastcgi_hide_header FastCGI에게 숨겨야 하는 헤더를 지정한다.(Nginx가 전달하지 않는 헤더) http, server, location fastcgi_hide_header headername; fastcgi_hide_header X-Forwarded-For;
fastcgi_ignore_client_abort 이 지시어는 클라이언트가 웹 서버로 보낸 요청을 중단시킬 때의 처리방법을 정의한다. 지시어가 on으로 설정되어 있으면 엔진엑스는 중단 요청을 무시하고 요청을 계속 처리해 마친다. off로 설정돼있으면 엔진엑스는 중단 요청을 무시하지 않는다. 요청처리를 즉각 중단하고 FastCGI서버와의 통신을 끝낸다.

http, server, location on | off off
fastcgi_intercept_errors Nginx가 Gateway로부터 회신된 에러를 처리할것인지, 아니면 에러페이지를 직접 클라이언트에게 보낼것인지를 정의한다.

(유의사항: 에러처리는 엔진엑스의 error_page지시어를 통해 수행된다.)

http, server, location on | off off
fastcgi_read_timeout FastCGI로부터의 응답제한시간을 정의한다. 이 시간이 초과되도 Nginx가 응답을 받지 못하면 504 Gateway Timeout HTTP에러를 리턴한다. http, server, location 숫자 값(초) 60초
fastcgi_connect_timeout 백엔드 서버 접속 제한시간을 정의한다. 이 값은 읽기/보내기 제한 시간과는 다르다. Nginx가 이미 백엔드 서버에 접속된 상태면 fastcgi_connect_timeout은 적용할수 없다. http, server, location 숫자 값(초) 60초
fastcgi_send_timeout 백엔드서버에 데이터를 보낼때의 제한시간이다. 이 제한시간은 전체 응답지연에 적용되는게 아니라 두개의 쓰기 작업사이에 적용된다. http, server, localtion 숫자 값(초) 60초
fastcgi_split_path_info http://website.com/page.php/param1/param2와 같은 형태의 URL일 때 특히 유용한 지시어다.

이 지시어는 지정한 정규표현식에 따라 경로 정보를 분할한다.

location 정규표현식 fastcgi_split_path_info ^(.+\.php)(.*) $;

이것은 두개의 변수에 영향을 준다.

$fastcgi_script_name: 실제 실행되는 스크립트의 파일명(앞 예에서는 page.php)

$fastcgi_path_info: 스크립트명 다음에 오는 URL부분(앞의 예에서는 /param1/param2/)

이 두변수는 이후의 매개변수 정의에서 사용될수 있다.

fastcgi_param SCRIPT_FILENAME /home/website.com/www$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

fastcgi_store FastCGI어플리케이션으로부터의 응답을 저장 장치의 파일에 저장하는 간단한 캐시 저장소를 사용한다. 동일한 URI가 다시 요청될경우 요청을 FastCGI어플리케이션에 전달하는 대신 캐시저장소로부터 직접 읽어 문서를 서비스한다.

이 지시어는 캐시 저장소를 사용하거나 해제한다.

http, server, location on | off
fastcgi_store_access 이 지시어는 캐시저장소의 사용으로 생성되는 파일에 적용할 접근권한을 정의한다. http, server, location fastcgi_store_access [user:r|w|rw] [group:r|w|rw] [all:r|w|rw] fastcgi_store_access user:rw;
fastcgi_temp_path 임시 파일이나 캐시저장파일의 경로를 설정한다. http, server, location 파일경로 fastcgi_temp_path /tmp/nginx_fastcgi;
fastcgi_max_temp_file_size 이 지시어값을 0으로 설정하면 FastCGI요청용 임시파일을 사용하지 않는다 그렇지 않으면 최대 임시파일크기를 의미한다. http, server, location 크기 값 1GB fastcgi_max_temp_file_size 5m;
fastcgi_temp_file_write_size 임시 파일을 저장장치에 저장할때 쓰기버퍼크기를 설정한다. http, server, location 크기 값 2*proxy_buffer_size
fastcgi_buffers FastCGI어플리케이션으로부터 응답데이터를 읽을때 사용할 버퍼의 수와 크기를 설정한다. http, server, location fastcgi_buffers amount size; 8버퍼, 각기 4K이거나 8K(플래폼에 따라 다름) fastcgi_buffers 8 4k;
fastcgi_buffer_size FastCGI어플리케이션의 응답의 시작부분(보통은 간단한 헤더데이터를 포함)을 읽기 위한 버퍼크기를 설정한다. http, server, location 크기 값 fastcgi_buffers지시어에 의해 정의된 버퍼한개의 크기 fastcgi_buffer_size 4k;
fastcgi_send_lowat FreeBSD전용의 TCP소켓용 SO_SNDLOWAT플래그를 사용할수 있게 하는 옵션이다. 이 값은 출력작업용 버퍼에서의 최소 바이트수를 정의한다. http, server, location 숫자 값(크기) 0
fastcgi_pass_request_body 각각 요청 바디와 추가적인 요청 헤더를 백엔드서버에 전달해야하는지 여부를 정의한다. http, server, location n | off on
fastcgi_pass_request_headers
fastcgi_ignore_headers 백엔드 서버 응답에서 X-Accel_Redirect, X-Accel-Expires, Expires, Cache-Control의 네 가지 헤더를 엔진엑스가 처리하지 않게 한다. http, server, location fastcgi_ingore_headers header1 [header2...];
fastcgi_next_upstream fastcgi_pass가 업스트림 블록에 접속될때 이 지시어는 요청을 포기하고 다음 업스트림서버로 보내야하는 경우를 정의한다. 이 지시어의 값은 다음을 조합해 사용한다.

  • error: 서버와 통신하고 있는 중이거나 통신을 시도하려고 할때 에러가 발생한다.
  • timeout: 전송이나 접속시도를 하는동안 제한시간이 초과된 경우
  • invalid_header: 백엔드서버가 빈 응답이나 유효하지 않은 응답을 회신한 경우
  • http_500, http_502, http_503, http_504, http_404: 이런 HTTP에러가 발생한 경우 Nginx는 다음 업스트림으로 전환한다.
  • off: 다음 업스트림서버의 사용을 금지한다.
http, server, location
  • fastcgi_next_upstream error timeout http_504;
  • fastcgi_next_upstream timeout invalid_header;
fastcgi_catch_stderr stderr(표준 에러 스트림)로 출력되는 에러메시지의 일부를 중간에 가로채 Nginx에러로그에 저장한다. http, server, location fastcgi_catch_stderr filter; fastcgi_catch_stderr "PHP Fatal error:";

FastCGI캐싱

일단 Nginx가 FastCGI어플리케이션과 잘 연동되게 정확한 환경설정을 했다면 다음 지시어들을 선택적으로 사용해 캐시시스템을 구성함으로서 서버의 전체적인 성능을 개선할수 있다.

지시어 설명 문맥 구문 사용예
fastcgi_cache http, server, location 캐시 존(zone)을 정의한다. 준에 부여한 실벽자는 이후의 지시어에서 재사용된다. fastcgi_cache zonename; fastcgi_cache cache1;
fastcgi_cache_key 이 지시어는 캐시 항목들을 서로 구분하는 캐시 키(key)를 정의한다.
캐시 키가 $uri로 설정돼 있으면 $uri가 같은 모든 요청은 같은 캐시 항목에 대응된다.
대부분 동적웹사이트에서는 그정도로는 충분하지 않으므로 /index.php와 /index.php?page=contact가 같은 캐시 항목을 가리키지 않게 캐시 키에 질의문자열 인자를 포함할 필요가 있다.
http, server, location fastcgi_cache_key key; fastcgi_cache_key "$scheme$host$request_uri$cookie_user";
fastcgi_cache_methods 캐싱을 적용할 HTTP메소드를 정의한다. GET과 HEAD는 기본으로 포함되며 캐싱을 해제할수 없다.
예를 들면 POST같은 요청을 캐싱하게 설정할수 있다.
http, server, location fastcgi_cache_methods METHOD; fastcgi_cache_methods POST;
fastcgi_cache_min_uses 요청을 캐싱하는데 필요한 최소 히트수를 정의한다.
기본으로 요청 응답은 한번의 히트후에 캐시된다.(같은 캐시 키를 갖는 이후의 요청은 캐시된 응답으로 수신된다.)
http, server, location 숫자 값 fastcgi_cache_min_uses 1;
fastcgi_cache_path 캐시된 파일과 매개변수를 저장하기 위한 디렉토리를 지정한다. http, server, location fastcgi_cache_path path [levels=numbers keys_zone=name:size inactive=time max_size=size];
다음과 같은 매개변수를 추가할수 있다.
  • levels: 하위 디렉토리의 깊이를 나타낸다(보통은 1:2면 충분하다)

  • keys_zone: 앞서 fastcgi_cache지시어로 선언한 존을 이용할수 있게 하며, 차지하는 메모리의 크기를 나타낸다.

  • inactive: 캐시된 응답이 지정한 시간만큼 사용되지 않으면 캐시로부터 제거된다.

  • max_size: 전체 캐시의 최대 크기를 정의한다.

fastcgi_cache_path /tmp/nginx_cahce levels=1:2 zone=zone1:10m inactive=10m max_size=200M;
fastcgi_cache_use_stale Nginx가 Gateway와 관련한 특정 상황에서 오래된 캐시데이터를 사용할지 여부를 정의한다.
fastcgi_cache_use_stale timeout을 사용하고 Gateway가 제한시간을 초과하면 Nginx는 캐시된 데이터로 서비스한다.
http, server, location fastcgi_cache_use_stale [updating] [errors] [timeout] [invalid_header] [http_500]; fastcgi_cache_use_stale error timeout;
fastcgi_cache_valid 이 지시어는 여러 종류의 응답코드에 대해 각 캐시시간을 정한다
404에러코드와 연관된 응답은 1분동안 캐시하고 반대로 200 OK 응답은 10분 이상 캐시하게 할수 있다.
이 지시어는 한번 이상 사용할수도 있다.
http, server, location fastcgi_cache_valid code1 [code2...] time;
  • fastcgi_cache_valid 404 1m;

  • fastcgi_cache_valid 500 502 504 5m;

  • fastcgi_cache_valid 200 10;

  • 평점을 남겨주세요
    평점 : 5.0
    총 투표수 : 1

    질문 및 답글