PHP·WAS와 웹 애플리케이션 실행 계층
웹 서버와 애플리케이션 실행기를 구분하고 요청이 프로그램 코드와 데이터베이스까지 전달되는 흐름을 이해합니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 웹 서버·실행기·코드·DB가 처리하는 요청 단계를 구분한다.
- PHP-FPM의 작업자 풀과 FastCGI 연결을 설명한다.
- 요청 지연과 실패를 소켓·작업자·DB·코드 예외로 나눈다.
01정적 문서와 서버 측 프로그램 실행의 경계
- 정적정적 웹 서버는 저장된 바이트를 선택하여 응답한다.
- 동적동적 애플리케이션에서는 URL·메서드·입력값·사용자 상태를 받아 프로그램이 결과를 계산하고 DB나 외부 API를 호출한 뒤 HTML 또는 JSON을 만든다.
- 클라이언트는 원본 코드를 받아 실행하는 것이 아니라 서버에서 생성한 결과를 받는다. 처리 연결이 잘못되어 원본 파일을 정적으로 내보내면 비밀 코드·설정이 노출될 수 있으므로 확장자 이름만으로 실행을 보장하지 않는다.
- 웹 프레임워크는 ·입력 처리·템플릿·응답 객체를 제공하는 라이브러리 계층이고 애플리케이션 서버는 소켓··프로토콜과 생애를 관리한다.
- ·-FPM 앞단, -FPM 또는 앱 서버, 프레임워크 코드, DB의 각 역할을 나누면 어느 설정이 무엇을 바꾸는지 명확해진다.
- WAS의 역할WAS라는 표현은 애플리케이션 실행 기능을 포함한 서버를 가리키지만 제품과 문맥에 따라 범위가 다르다.
- 언어 실행기와 앱 서버특정 언어의 실행기와 모든 종류의 웹 프로그램을 동일하게 취급하지 않는다.
02CGI와 FastCGI에서 요청 한 건이 실행되는 순서
- 전통적 는 웹 서버가 외부 프로그램을 요청에 맞춰 실행하고 환경 변수와 표준 입력으로 요청 정보를 전달하며 프로그램의 표준 출력에서 응답을 받는 인터페이스다.
- DB프로그램이 끝나면 그 실행 상태도 끝나므로 매 요청 생성 비용이 생기고 메모리 캐시나 DB 연결을 유지하기 어렵다.
- ·는 를 계속 실행하고 소켓을 통해 여러 요청을 전달하여 실행 생애를 요청 한 건보다 길게 유지한다.
- -FPM은 이 풀을 관리한다.
- ·가 같은 파라미터와 요청 정보를 보내면 FPM 가 해당 스크립트를 실행해 응답을 반환한다.
- FPM 소켓의 소유권과 웹 서버 계정, 코드의 읽기 권한, 실행 제한과 풀 크기가 각기 다른 조건이다.
PHP 파일 작성에서 웹 실행·DB 연결까지 경계 나누기
소스 파일 존재, 실행, 애플리케이션의 DB 접속을 서로 다른 단계의 결과로 확인한다.
실습 구성과 전제
- phpinfo. 내용 조회와 WordPress 설치 화면은 서로 다른 구성 사례다. 첫 파일이 두 번째 설치 프로그램으로 바뀐 연속 실행이 아니다.
- 실행기가 준비된 실습 환경을 사용한다. 설정 정보가 많이 노출되는 phpinfo 페이지를 외부에 상시 공개하지 않는다.
파일 내용과 실행 결과를 구별한다
- 첫 사진의 cat은 파일의 텍스트를 읽는다. 여는 태그와 phpinfo()가 보인다는 것은 소스가 저장되었다는 증거이며 웹 서버가 를 실행했다는 증거는 아니다.
- 브라우저가 코드를 그대로 내보낸다면 실행기 연결 문제를 의심해야 한다. 정상 실행에서는 소스 문장 대신 프로그램이 만든 출력이 HTTP 응답 본문이 된다.
<?php header("Content-Type: text/plain; charset=UTF-8"); echo "PHP executed\n";정보 노출을 줄인 재구성 실행 확인 파일이다. 처리 경로가 준비된 로컬 실습에서만 사용한다.
원본 크기로 보기 ↗- cat phpinfo.php 아래에 PHP 태그와 phpinfo() 호출이 그대로 표시된다.
- 이 화면은 터미널의 파일 조회이며 PHP 정보 페이지가 렌더링된 브라우저 화면이 아니다.
확인 기준파일 존재, 문법 검사, CLI 실행, 웹 요청 실행을 각각 확인한다. 이 서로 다른 버전·설정을 사용할 수 있다.
웹 서버와 PHP 실행기의 연결을 검증한다
- 정적 파일 응답이 성공한 뒤 . 요청을 실행기로 전달하는 설정을 확인한다. FPM을 쓴다면 소켓·스크립트 경로·풀의 실행 계정이 연결되어야 한다.
- -l은 소스의 문법을 검사하지만 DB 접속이나 FPM 요청 경로까지 실행해 보지는 않는다. curl 응답 본문에서 재구성한 고정 문자열을 확인하면 웹 실행을 별도 검증할 수 있다.
bashphp -l /srv/lab-web/check.php curl -i http://127.0.0.1/check.php설정된 실습 문서 루트의 파일 문법과 웹 응답을 조회하는 예시다.
확인 기준소스 노출, 404, 502, 오류는 실패 경계가 다르다. 웹 서버 로그와 FPM 상태를 해당 요청 시각에 맞춰 읽는다.
애플리케이션의 DB 설정은 다음 단계다
- WordPress 화면은 DB 이름·사용자·암호·호스트·테이블 접두사를 요구한다. 프로그램이 실행되더라도 올바른 DB 계정과 접속 경로가 없으면 설치가 이어지지 않는다.
- 테이블 접두사는 생성할 테이블 이름의 접두어이며 DB 서버 주소가 아니다. 실제 암호나 운영 계정은 예시 본문에 복사하지 않는다.
원본 크기로 보기 ↗- 설치 화면에 Database name, Username, Password, Database host, Table prefix 입력 항목이 보인다.
- wp-config.php 안내가 있어 애플리케이션이 사용할 DB 연결 설정 단계임을 알 수 있다.
확인 기준이 양식이 보인다는 사실은 DB 인증 성공의 증거가 아니다. 입력 후 연결·권한·테이블 생성 결과를 추가 확인해야 한다.
실습에서 확인한 동작 원리
- 소스 파일을 읽은 결과와 프로그램을 실행한 HTTP 응답은 구별해야 한다.
- 웹 서버→ 실행기→DB의 각 경계마다 경로·신원·오류 로그가 다르다.
설정·출력 추가로 확인하기 23장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 3장
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. phpMyAdmin의 서버 설정에서 auth_type을 http로 지정한 코드 화면이다. 웹 DB 관리 도구의 인증 방식 설정 위치를 보여 준다.
원본 크기로 보기 ↗- 「phpmyadmin」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. PHP 실행 환경을 구성할 때 사용하는 DB 연결 확장·이미지 처리 라이브러리·컴파일 도구 등의 역할을 정리한 화면이다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 「was 설정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
원본 크기로 보기 ↗- 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 04 1장
원본 크기로 보기 ↗- 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
원본 크기로 보기 ↗- 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
원본 크기로 보기 ↗- 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 08 7장
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「CMS : Contents Management System」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「inix」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「mariaDB」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「phpMyAdmin 데이터베이스 관리」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「phpMyAdmin 데이터베이스 관리」에 배치된 그림 또는 화면이다.
실습 화면 묶음 09 1장
원본 크기로 보기 ↗- 학습 원본 · Pydio 웹 서비스 접속의 Pydio에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
원본 크기로 보기 ↗- 학습 원본 · 웹 애플리케이션과 외부 DB 연결의 DB 분산구축에 수록된 화면·도식이다.
실습 화면 묶음 11 3장
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「설치과정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「설치과정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 12 2장
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서
03PHP 요청 변수·출력과 FPM 풀 설정
- GET 입력의 자료형에서 은 쿼리 문자열에서 파싱된 입력이며 입력이 존재하지 않거나 배열 형태일 수 있다는 점까지 처리해야 한다.
- HTML 출력 인코딩문자열을 HTML에 출력할 때 같은 문맥에 맞는 인코딩을 사용하면 <와 & 등이 태그로 해석되는 것을 줄일 수 있다.
- 매개변수화에는 별도의 가 필요하므로 HTML 인코딩이 안전성까지 제공하지 않는다.
- 풀FPM 풀은 실행 사용자·그룹, Unix 소켓 또는 listen, 관리 방식과 최대 자식 수를 정한다.
- ·은 동시 처리 가능한 의 상한과 관련되지만 무조건 크게 하면 메모리와 DB 연결을 소모한다.
- CLI·FPM 설정 차이 CLI의 .ini와 FPM의 설정 경로가 다를 수 있으므로 명령행 -v 결과와 웹 런타임의 설정을 같은 것으로 단정하지 않는다.
- display_errorsdisplay_errors는 응답으로 내부 오류를 노출할지, log_errors는 기록할지의 구분이다.
<?php
$input = $_GET["name"] ?? "learner";
$name = is_string($input) ? $input : "learner";
header("Content-Type: text/html; charset=utf-8");
echo "<p>Hello, " . htmlspecialchars($name, ENT_QUOTES, "UTF-8") . "</p>";
?>교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
04WSGI callable의 입력·헤더·본문
- 는 서버와 동기 애플리케이션 사이의 호출 규약이다.
- ·서버가 과 를 넘겨 호출하고 앱은 상태와 헤더를 로 알린 뒤 바이트열들을 생산하는 iterable을 반환한다.
- 은 요청 메서드·경로·서버 정보 등과 입력 스트림을 담는다.
- 본문문자열 str을 그대로 본문 항목으로 반환하는 것과 로 인코딩된 bytes를 반환하는 것은 다르다.
- 아래 예시는 body 길이를 바이트 수로 계산한다.
- 한글 문자 수와 전송 바이트 수가 같지 않을 수 있으므로 를 len(원문문자열)로 계산하면 잘못된다.
- DB동기 요청이 DB 응답을 기다리는 동안 해당 는 그 일을 처리 중이다.
- 여러 ·스레드 를 둘 수 있지만 각 의 메모리 상태와 DB 연결 수가 늘어난다는 비용도 함께 고려한다.
def application(environ, start_response):
body = "안녕하세요\n".encode("utf-8")
start_response("200 OK", [
("Content-Type", "text/plain; charset=utf-8"),
("Content-Length", str(len(body))),
])
return [body]교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
05ASGI의 이벤트와 await가 동시성을 만드는 위치
- ·scope 애플리케이션은 scope, receive, send를 받는 이다.
- scopescope는 연결이나 요청의 정보이고 receive는 들어오는 이벤트, send는 를 전달한다.
- 헤더·본문HTTP 응답은 시작 이벤트로 상태·헤더를 보내고 본문 이벤트로 내용을 보낸다.
- 같은 인터페이스 계열에서 WebSocket과 lifespan 같은 프로토콜 생애도 표현할 수 있다.
- 는 기다리는 동안 가 다른 작업을 진행할 기회를 준다.
- async·DB하지만 async def 안에서 동기 DB 호출이나 큰 CPU 계산을 그대로 실행하면 그 구간 동안 루프를 막을 수 있다.
- 비동기라는 이름이 모든 코드를 병렬로 빠르게 만들지는 않는다.
- 비동기 드라이버, 제한된 thread pool, CPU 작업 분리를 요구에 맞게 선택한다.
- DB프록시·앱·DB의 timeout과 최대 연결 수도 한 요청 흐름에서 맞물린다.
async def application(scope, receive, send):
if scope["type"] != "http":
return
await send({"type": "http.response.start", "status": 200,
"headers": [(b"content-type", b"text/plain")]})
await send({"type": "http.response.body", "body": b"hello\n"})교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
06FPM 풀의 프로세스 수·동시 요청·대기열
- 풀의 실행 주체FPM pool은 실행 사용자·그룹·listen 소켓· 관리 설정을 함께 묶는다. 웹 서버가 소켓에 연결할 권한과 가 스크립트·자료를 읽는 권한은 다르다.
- 동시 처리 상한은 static의 수 또는 dynamic/ondemand의 최대 자식 수이며 동시에 처리할 요청 수를 제한한다. 웹 서버의 연결 수 자체를 같은 숫자로 제한하는 값은 아니다.
- 관리 방식static은 고정 수, dynamic은 시작·대기 범위 안에서 수를 조절하고 ondemand는 요청에 맞춰 만든다. 생성 비용과 상주 메모리의 균형이 달라진다.
- 대기와 점유가 DB 응답을 기다리는 동안에도 해당 요청을 맡은 자리는 점유될 수 있다. CPU 사용률이 낮아도 풀의 모든 자식이 대기 중이면 새 요청이 밀릴 수 있다.
- 별도 제한는 자식이 일정 요청 수를 처리한 뒤 교체되는 조건이다. 동시 요청의 상한이나 한 요청의 최대 실행 시간을 뜻하는 값과 구분한다.
078개 워커와 0.2초 처리 시간의 용량 계산
- 이상화한 조건 8개가 각각 요청 하나씩 처리하고 모든 요청의 점유 시간이 0.2초이며 다른 병목이 없다고 가정한다. 실제 측정 대신 용량 관계를 설명하는 모델이다.
- 처리율 상한각 는 초당 약 5건, 풀은 8÷0.2=40건/초를 처리할 수 있다. 요청 도착이 50건/초로 지속되면 처리보다 유입이 초당 10건 많아 대기가 늘어난다.
- DB 지연의 효과DB 대기로 점유 시간이 0.8초가 되면 같은 8개로 약 10건/초에 불과하다. CPU가 바쁘지 않아도 응답 시간이 급격히 나빠질 수 있다.
- 메모리 예산자식 한 개의 추가 점유량을 가상으로 70MiB로 잡으면 8개가 약 560MiB다. 실제 RSS의 공유 페이지 단순 합은 과대평가될 수 있어 실측과 다른 구성 요소 공간을 함께 고려한다.
- 상한 확대의 한계max_children을 늘려도 DB의 연결·동시 처리 한계가 그대로면 대기 위치만 옮겨갈 수 있다. 웹·FPM·DB의 처리량과 timeout을 함께 맞춘다.
| 수 | 요청 점유 시간 | 이상화한 처리율 |
|---|---|---|
| 8 | 0.2초 | 40건/초 |
| 8 | 0.8초 | 10건/초 |
08PHP 실행 오류와 WSGI·ASGI 정체를 구별하기
- 소켓 접속 오류웹 서버가 FPM 소켓을 열지 못하면 프로토콜 전달 전 경로·권한·listen 상태 문제다. 코드의 구문을 고쳐도 아직 그 코드가 실행되지 않는다.
- 스크립트 매핑 연결이 돼도 이 의도한 실제 파일을 가리켜야 한다. HTTP URI와 파일 경로를 혼동하면 잘못된 스크립트를 실행하거나 파일 없음 오류가 난다.
- 고갈실행 중 수·대기열·요청 시간과 DB 지연을 대조한다. 가 살아 있다는 상태만으로 새 요청을 즉시 받을 수 있다고 판단하지 않는다.
- 동기 I/O의 위치의 동기 호출이나 async 함수 안의 동기 DB 호출은 해당 실행 흐름을 기다리게 할 수 있다. 라는 키워드 유무보다 실제 호출이 어디서 양보하는지 봐야 한다.
- 출력의 경계앱은 status·헤더·본문을 만들고 서버 인터페이스가 이를 HTTP로 전달한다. 문자 개수와 바이트 길이, 이미 보낸 헤더 뒤 발생한 예외를 구별해야 응답 오류를 설명할 수 있다.
09연결된 계층을 함께 관찰하기
- DB웹 서버에서 보이는 오류가 실행기 연결 실패, 애플리케이션 예외, DB 연결 고갈 중 어디에서 시작됐는지 구분한다.
- timeout·동시 처리 수각 계층의 시간 제한과 동시 처리 수가 어긋나면 대기열과 재시도가 누적될 수 있다.
- 설정·자격증명 분리환경별 설정과 비밀값은 소스 코드와 분리하고, 운영 응답에 상세 예외 화면을 노출하지 않는다.
- 정적배포 후에는 정적 경로뿐 아니라 실제 프로그램 실행과 데이터 접근이 필요한 대표 요청도 확인한다.
10PHP 요청이 DB 결과로 응답되는 과정
- ·가 요청을 -FPM에 전달하는 구성을 가정한다.
- 는 요청 경로와 설정에서 실행할 스크립트 경로 및 매개변수를 만들고 또는 Unix 소켓으로 FPM에 전달한다.
- FPM 실행과 DB 질의FPM의 작업자가 코드를 실행하고, 필요하면 별도 DB 연결을 이용해 매개변수화된 질의를 보낸다.
- DB·본문DB 결과를 받은 코드는 응답 본문과 헤더를 만들고 응답을 통해 웹 서버에 돌려준다.
- 웹 서버와 런타임웹 서버가 소스를 자체적으로 실행하는 구성과 혼동하지 않는다.
- 소켓에 연결할 권한과 작업자가 스크립트·업로드 경로에 접근할 권한은 다른 조건이다.
- 등의 경로 매핑이 잘못되면 파일이 존재해도 실행 대상을 찾지 못할 수 있다.
- 정적소스 파일이 정적 응답으로 노출되는 매핑 오류는 기능 실패보다 큰 정보 노출로 이어질 수 있다.
- 공개 경로와 실행 경로공개 경로와 실행 경로의 관계를 검토하고, 모든 파일 확장자를 무조건 실행기로 넘기는 규칙처럼 예상 범위가 넓은 구성을 피한다.
- HTTP 요청동적 페이지에 해당하는 경로를 요청한다.
- 요청스크립트 경로와 요청 정보를 전달한다.
- 매개변수화 질의 코드가 필요한 데이터를 요청한다.
- 질의 결과행·오류· 결과를 반환한다.
- 실행 응답작업자가 헤더와 본문을 생성해 반환한다.
- HTTP 응답클라이언트에 상태와 본문을 보낸다.
설명과 함께 보는 보조 도식
Nginx → PHP-FPM → DB의 대표 요청
Unix 또는 TCP 소켓의 연결 수립은 축약하고 요청·질의·응답의 역할을 보여 준다.
HTTP 요청
동적 페이지에 해당하는 경로를 요청한다.
- 선택
- 사이트·경로 규칙
전체 단계를 한 번에 읽기
- 01
HTTP 요청
동적 페이지에 해당하는 경로를 요청한다.
- 선택
- 사이트·경로 규칙
- 02
FastCGI 요청
스크립트 경로와 요청 정보를 전달한다.
- 프로토콜
- HTTP와 다른 FastCGI
- 03
매개변수화 질의
PHP 코드가 필요한 데이터를 요청한다.
- 주체
- 애플리케이션 DB 계정
- 04
질의 결과
행·오류·트랜잭션 결과를 반환한다.
- 확인
- 업무 처리 결과
- 05
실행 응답
작업자가 헤더와 본문을 생성해 반환한다.
- 병목 후보
- 작업자·코드·DB
- 06
HTTP 응답
클라이언트에 상태와 본문을 보낸다.
- 관찰
- 응답 코드·처리 시간
11처리량과 대기열을 함께 읽기
- 작업자·DB 연결 예산요청이 느릴 때 웹 서버의 연결 수만 늘리면 실행기나 DB의 병목은 그대로일 수 있다. FPM 작업자가 모두 바쁘면 새 요청이 기다리고, 작업자마다 DB 연결을 요구하면 DB 연결 한도에 먼저 도달할 수도 있다. 작업자 수를 늘릴 때는 작업자당 메모리와 DB 연결 예산을 함께 계산한다.
- 외부 I/O와 대기외부 API나 느린 파일 I/O로 작업자가 붙잡혀 있는 상황과 CPU 계산으로 바쁜 상황도 다른 대책이 필요하다.
- 계층별 오류 연결웹 서버의 502·504, FPM 연결·작업자 로그, 애플리케이션 traceback, DB의 연결·잠금 상태를 같은 요청과 시각으로 연결한다.
- 환경에서도 블로킹 함수를 무심코 호출하면 의 진행을 막을 수 있고, 와 는 단순히 빠른 버전·느린 버전으로 나뉘지 않는다.
- 동시성실행 인터페이스, 서버의 동시성 모델, 코드의 입출력 방식이 함께 처리 특성을 결정한다.
- 상세 오류의 노출진단용 상세 오류는 내부 기록에 남기고 외부 응답에서는 민감한 경로와 질의를 드러내지 않는다.
| 구성·관찰 대상 | 관찰 내용 | 해석 |
|---|---|---|
| 웹 서버 | 경로· 대상·오류 | 잘못된 실행 경로와 연결 실패 |
| 실행기 | 작업자 수·대기·메모리 | 풀 고갈과 처리 지연 |
| 애플리케이션 | 예외·외부 I/O | 코드 오류와 블로킹 |
| DB | 연결 수·잠금·질의 시간 | 실행기 밖의 의존성 병목 |
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
PHP-FPM 풀과 동시 처리 수 설정
List of pool directives에서 listen·user를 확인한 뒤 pm과 ·를 비교한다. 접속 지점, 실행 계정, 동시 수와 누적 교체 수를 같은 설정 파일 안에서 구별한다.
- 가 수를 정하는 방법
- 과 의 다른 단위
- Unix 소켓 접근 권한과 코드 실행 계정의 차이
이해했는지 확인하기
- 웹 서버·실행기·애플리케이션의 역할을 구분한다.
- 실행 사용자와 소켓·파일 접근 권한을 확인한다.
- 요청 시간 제한과 작업자·DB 연결 수의 관계를 확인한다.
