시스템 · 서버핵심 · 19분 읽기

PHP·WAS와 웹 애플리케이션 실행 계층

웹 서버와 애플리케이션 실행기를 구분하고 요청이 프로그램 코드와 데이터베이스까지 전달되는 흐름을 이해합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 웹 서버·실행기·코드·DB가 처리하는 요청 단계를 구분한다.
  2. PHP-FPM의 작업자 풀과 FastCGI 연결을 설명한다.
  3. 요청 지연과 실패를 소켓·작업자·DB·코드 예외로 나눈다.

01정적 문서와 서버 측 프로그램 실행의 경계

  • 정적 웹 서버는 저장된 바이트를 선택하여 응답한다.
  • 동적 애플리케이션에서는 URL·메서드·입력값·사용자 상태를 받아 프로그램이 결과를 계산하고 DB나 외부 API를 호출한 뒤 HTML 또는 JSON을 만든다.
  • 클라이언트는 원본 코드를 받아 실행하는 것이 아니라 서버에서 생성한 결과를 받는다. 처리 연결이 잘못되어 원본 파일을 정적으로 내보내면 비밀 코드·설정이 노출될 수 있으므로 확장자 이름만으로 실행을 보장하지 않는다.
  • 웹 프레임워크는 ·입력 처리·템플릿·응답 객체를 제공하는 라이브러리 계층이고 애플리케이션 서버는 소켓··프로토콜과 생애를 관리한다.
  • 앞단, -FPM 또는 앱 서버, 프레임워크 코드, DB의 각 역할을 나누면 어느 설정이 무엇을 바꾸는지 명확해진다.
  • WAS라는 표현은 애플리케이션 실행 기능을 포함한 서버를 가리키지만 제품과 문맥에 따라 범위가 다르다.
  • 특정 언어의 실행기와 모든 종류의 웹 프로그램을 동일하게 취급하지 않는다.

02CGI와 FastCGI에서 요청 한 건이 실행되는 순서

  • 전통적 는 웹 서버가 외부 프로그램을 요청에 맞춰 실행하고 환경 변수와 표준 입력으로 요청 정보를 전달하며 프로그램의 표준 출력에서 응답을 받는 인터페이스다.
  • 프로그램이 끝나면 그 실행 상태도 끝나므로 매 요청 생성 비용이 생기고 메모리 캐시나 DB 연결을 유지하기 어렵다.
  • 는 를 계속 실행하고 소켓을 통해 여러 요청을 전달하여 실행 생애를 요청 한 건보다 길게 유지한다.
    • -FPM은 이 풀을 관리한다.
  • 가 같은 파라미터와 요청 정보를 보내면 FPM 가 해당 스크립트를 실행해 응답을 반환한다.
  • FPM 소켓의 소유권과 웹 서버 계정, 코드의 읽기 권한, 실행 제한과 풀 크기가 각기 다른 조건이다.
LEARN THROUGH PRACTICE

PHP 파일 작성에서 웹 실행·DB 연결까지 경계 나누기

소스 파일 존재, 실행, 애플리케이션의 DB 접속을 서로 다른 단계의 결과로 확인한다.

실습 구성과 전제

  • phpinfo. 내용 조회와 WordPress 설치 화면은 서로 다른 구성 사례다. 첫 파일이 두 번째 설치 프로그램으로 바뀐 연속 실행이 아니다.
  • 실행기가 준비된 실습 환경을 사용한다. 설정 정보가 많이 노출되는 phpinfo 페이지를 외부에 상시 공개하지 않는다.
  1. 파일 내용과 실행 결과를 구별한다

    • 첫 사진의 cat은 파일의 텍스트를 읽는다. 여는 태그와 phpinfo()가 보인다는 것은 소스가 저장되었다는 증거이며 웹 서버가 를 실행했다는 증거는 아니다.
    • 브라우저가 코드를 그대로 내보낸다면 실행기 연결 문제를 의심해야 한다. 정상 실행에서는 소스 문장 대신 프로그램이 만든 출력이 HTTP 응답 본문이 된다.
    <?php
    header("Content-Type: text/plain; charset=UTF-8");
    echo "PHP executed\n";

    정보 노출을 줄인 재구성 실행 확인 파일이다. 처리 경로가 준비된 로컬 실습에서만 사용한다.

    5/26 - php, mariaDB · 명령·상태 출력 5원본 크기로 보기 ↗
    • cat phpinfo.php 아래에 PHP 태그와 phpinfo() 호출이 그대로 표시된다.
    • 이 화면은 터미널의 파일 조회이며 PHP 정보 페이지가 렌더링된 브라우저 화면이 아니다.
    확인 기준

    파일 존재, 문법 검사, CLI 실행, 웹 요청 실행을 각각 확인한다. 이 서로 다른 버전·설정을 사용할 수 있다.

  2. 웹 서버와 PHP 실행기의 연결을 검증한다

    • 정적 파일 응답이 성공한 뒤 . 요청을 실행기로 전달하는 설정을 확인한다. FPM을 쓴다면 소켓·스크립트 경로·풀의 실행 계정이 연결되어야 한다.
    • -l은 소스의 문법을 검사하지만 DB 접속이나 FPM 요청 경로까지 실행해 보지는 않는다. curl 응답 본문에서 재구성한 고정 문자열을 확인하면 웹 실행을 별도 검증할 수 있다.
    bash
    php -l /srv/lab-web/check.php
    curl -i http://127.0.0.1/check.php

    설정된 실습 문서 루트의 파일 문법과 웹 응답을 조회하는 예시다.

    확인 기준

    소스 노출, 404, 502, 오류는 실패 경계가 다르다. 웹 서버 로그와 FPM 상태를 해당 요청 시각에 맞춰 읽는다.

  3. 애플리케이션의 DB 설정은 다음 단계다

    • WordPress 화면은 DB 이름·사용자·암호·호스트·테이블 접두사를 요구한다. 프로그램이 실행되더라도 올바른 DB 계정과 접속 경로가 없으면 설치가 이어지지 않는다.
    • 테이블 접두사는 생성할 테이블 이름의 접두어이며 DB 서버 주소가 아니다. 실제 암호나 운영 계정은 예시 본문에 복사하지 않는다.
    PHP·MariaDB·CMS · CMS : Contents Management System (8)원본 크기로 보기 ↗
    • 설치 화면에 Database name, Username, Password, Database host, Table prefix 입력 항목이 보인다.
    • wp-config.php 안내가 있어 애플리케이션이 사용할 DB 연결 설정 단계임을 알 수 있다.
    확인 기준

    이 양식이 보인다는 사실은 DB 인증 성공의 증거가 아니다. 입력 후 연결·권한·테이블 생성 결과를 추가 확인해야 한다.

실습에서 확인한 동작 원리

  • 소스 파일을 읽은 결과와 프로그램을 실행한 HTTP 응답은 구별해야 한다.
  • 웹 서버→ 실행기→DB의 각 경계마다 경로·신원·오류 로그가 다르다.

설정·출력 추가로 확인하기 23장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 3장
5/26 - php, mariaDB · 실습·개념 참고 화면 20원본 크기로 보기 ↗
  • 에 삽입된 원본 학습 화면이다. phpMyAdmin의 서버 설정에서 auth_type을 http로 지정한 코드 화면이다. 웹 DB 관리 도구의 인증 방식 설정 위치를 보여 준다.
5/26 - php, mariaDB · 실습·개념 참고 화면 21원본 크기로 보기 ↗
  • 「phpmyadmin」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
5/26 - php, mariaDB · 실습·개념 참고 화면 6원본 크기로 보기 ↗
  • 에 삽입된 원본 학습 화면이다. PHP 실행 환경을 구성할 때 사용하는 DB 연결 확장·이미지 처리 라이브러리·컴파일 도구 등의 역할을 정리한 화면이다.
실습 화면 묶음 02 1장
7/31 - WAS · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 「was 설정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
Flask 실행과 웹 응답원본 크기로 보기 ↗
  • 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 04 1장
Flask 실행과 웹 응답원본 크기로 보기 ↗
  • 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
Flask 실행과 웹 응답원본 크기로 보기 ↗
  • 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
Flask 실행과 웹 응답원본 크기로 보기 ↗
  • 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
Flask 실행과 웹 응답원본 크기로 보기 ↗
  • 학습 원본 · Flask 실행과 웹 응답의 flask에 수록된 화면·도식이다.
실습 화면 묶음 08 7장
Joomla 관리자 계정 입력 양식원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치.
MariaDB 실습 계정의 인증 저장 값원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치.
PHP·MariaDB·CMS · CMS : Contents Management System (7)원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「CMS : Contents Management System」에 배치된 그림 또는 화면이다.
PHP·MariaDB·CMS · inix (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「inix」에 배치된 그림 또는 화면이다.
PHP·MariaDB·CMS · mariaDB (2)원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「mariaDB」에 배치된 그림 또는 화면이다.
PHP·MariaDB·CMS · phpMyAdmin 데이터베이스 관리 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「phpMyAdmin 데이터베이스 관리」에 배치된 그림 또는 화면이다.
PHP·MariaDB·CMS · phpMyAdmin 데이터베이스 관리 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · PHP 환경·데이터베이스 관리·WordPress·Joomla 설치. 원문에서 「phpMyAdmin 데이터베이스 관리」에 배치된 그림 또는 화면이다.
실습 화면 묶음 09 1장
Pydio 웹 서비스 접속원본 크기로 보기 ↗
  • 학습 원본 · Pydio 웹 서비스 접속의 Pydio에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
웹 애플리케이션과 외부 DB 연결 · DB 분산구축원본 크기로 보기 ↗
  • 학습 원본 · 웹 애플리케이션과 외부 DB 연결의 DB 분산구축에 수록된 화면·도식이다.
실습 화면 묶음 11 3장
웹 하드 - own cloud · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
웹 하드 - own cloud · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「설치과정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
웹 하드 - own cloud · 실습·개념 참고 화면 3원본 크기로 보기 ↗
  • 「설치과정」 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 12 2장
웹하드 - pydio · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
웹하드 - pydio · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. PHP·WAS와 웹 애플리케이션 실행 계층 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서

03PHP 요청 변수·출력과 FPM 풀 설정

  • 에서 은 쿼리 문자열에서 파싱된 입력이며 입력이 존재하지 않거나 배열 형태일 수 있다는 점까지 처리해야 한다.
  • 문자열을 HTML에 출력할 때 같은 문맥에 맞는 인코딩을 사용하면 <와 & 등이 태그로 해석되는 것을 줄일 수 있다.
  • 에는 별도의 가 필요하므로 HTML 인코딩이 안전성까지 제공하지 않는다.
  • FPM 풀은 실행 사용자·그룹, Unix 소켓 또는 listen, 관리 방식과 최대 자식 수를 정한다.
  • 은 동시 처리 가능한 의 상한과 관련되지만 무조건 크게 하면 메모리와 DB 연결을 소모한다.
  • CLI의 .ini와 FPM의 설정 경로가 다를 수 있으므로 명령행 -v 결과와 웹 런타임의 설정을 같은 것으로 단정하지 않는다.
  • display_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 연결 수가 늘어난다는 비용도 함께 고려한다.
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, receive, send를 받는 이다.
  • scope는 연결이나 요청의 정보이고 receive는 들어오는 이벤트, send는 를 전달한다.
  • HTTP 응답은 시작 이벤트로 상태·헤더를 보내고 본문 이벤트로 내용을 보낸다.
    • 같은 인터페이스 계열에서 WebSocket과 lifespan 같은 프로토콜 생애도 표현할 수 있다.
  • 는 기다리는 동안 가 다른 작업을 진행할 기회를 준다.
  • 하지만 async def 안에서 동기 DB 호출이나 큰 CPU 계산을 그대로 실행하면 그 구간 동안 루프를 막을 수 있다.
    • 비동기라는 이름이 모든 코드를 병렬로 빠르게 만들지는 않는다.
    • 비동기 드라이버, 제한된 thread pool, CPU 작업 분리를 요구에 맞게 선택한다.
  • 프록시·앱·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 대기로 점유 시간이 0.8초가 되면 같은 8개로 약 10건/초에 불과하다. CPU가 바쁘지 않아도 응답 시간이 급격히 나빠질 수 있다.
  • 자식 한 개의 추가 점유량을 가상으로 70MiB로 잡으면 8개가 약 560MiB다. 실제 RSS의 공유 페이지 단순 합은 과대평가될 수 있어 실측과 다른 구성 요소 공간을 함께 고려한다.
  • max_children을 늘려도 DB의 연결·동시 처리 한계가 그대로면 대기 위치만 옮겨갈 수 있다. 웹·FPM·DB의 처리량과 timeout을 함께 맞춘다.
수요청 점유 시간이상화한 처리율
80.2초40건/초
80.8초10건/초
검증·예외

08PHP 실행 오류와 WSGI·ASGI 정체를 구별하기

  • 웹 서버가 FPM 소켓을 열지 못하면 프로토콜 전달 전 경로·권한·listen 상태 문제다. 코드의 구문을 고쳐도 아직 그 코드가 실행되지 않는다.
  • 연결이 돼도 이 의도한 실제 파일을 가리켜야 한다. HTTP URI와 파일 경로를 혼동하면 잘못된 스크립트를 실행하거나 파일 없음 오류가 난다.
  • 실행 중 수·대기열·요청 시간과 DB 지연을 대조한다. 가 살아 있다는 상태만으로 새 요청을 즉시 받을 수 있다고 판단하지 않는다.
  • 의 동기 호출이나 async 함수 안의 동기 DB 호출은 해당 실행 흐름을 기다리게 할 수 있다. 라는 키워드 유무보다 실제 호출이 어디서 양보하는지 봐야 한다.
  • 앱은 status·헤더·본문을 만들고 서버 인터페이스가 이를 HTTP로 전달한다. 문자 개수와 바이트 길이, 이미 보낸 헤더 뒤 발생한 예외를 구별해야 응답 오류를 설명할 수 있다.

09연결된 계층을 함께 관찰하기

  • 웹 서버에서 보이는 오류가 실행기 연결 실패, 애플리케이션 예외, DB 연결 고갈 중 어디에서 시작됐는지 구분한다.
  • 각 계층의 시간 제한과 동시 처리 수가 어긋나면 대기열과 재시도가 누적될 수 있다.
  • 환경별 설정과 비밀값은 소스 코드와 분리하고, 운영 응답에 상세 예외 화면을 노출하지 않는다.
  • 배포 후에는 정적 경로뿐 아니라 실제 프로그램 실행과 데이터 접근이 필요한 대표 요청도 확인한다.

10PHP 요청이 DB 결과로 응답되는 과정

  • 가 요청을 -FPM에 전달하는 구성을 가정한다.
  • 는 요청 경로와 설정에서 실행할 스크립트 경로 및 매개변수를 만들고 또는 Unix 소켓으로 FPM에 전달한다.
  • FPM의 작업자가 코드를 실행하고, 필요하면 별도 DB 연결을 이용해 매개변수화된 질의를 보낸다.
  • DB 결과를 받은 코드는 응답 본문과 헤더를 만들고 응답을 통해 웹 서버에 돌려준다.
  • 웹 서버가 소스를 자체적으로 실행하는 구성과 혼동하지 않는다.
  • 소켓에 연결할 권한과 작업자가 스크립트·업로드 경로에 접근할 권한은 다른 조건이다.
  • 등의 경로 매핑이 잘못되면 파일이 존재해도 실행 대상을 찾지 못할 수 있다.
  • 소스 파일이 정적 응답으로 노출되는 매핑 오류는 기능 실패보다 큰 정보 노출로 이어질 수 있다.
  • 공개 경로와 실행 경로의 관계를 검토하고, 모든 파일 확장자를 무조건 실행기로 넘기는 규칙처럼 예상 범위가 넓은 구성을 피한다.
  1. 동적 페이지에 해당하는 경로를 요청한다.
  2. 스크립트 경로와 요청 정보를 전달한다.
  3. 코드가 필요한 데이터를 요청한다.
  4. 행·오류· 결과를 반환한다.
  5. 작업자가 헤더와 본문을 생성해 반환한다.
  6. 클라이언트에 상태와 본문을 보낸다.

설명과 함께 보는 보조 도식

메시지 순서

Nginx → PHP-FPM → DB의 대표 요청

Unix 또는 TCP 소켓의 연결 수립은 축약하고 요청·질의·응답의 역할을 보여 준다.

브라우저NginxPHP-FPM데이터베이스1. HTTP 요청2. FastCGI 요청3. 매개변수화 질의4. 질의 결과5. 실행 응답6. HTTP 응답
전체 단계를 한 번에 읽기
  1. 01

    HTTP 요청

    동적 페이지에 해당하는 경로를 요청한다.

    선택
    사이트·경로 규칙
  2. 02

    FastCGI 요청

    스크립트 경로와 요청 정보를 전달한다.

    프로토콜
    HTTP와 다른 FastCGI
  3. 03

    매개변수화 질의

    PHP 코드가 필요한 데이터를 요청한다.

    주체
    애플리케이션 DB 계정
  4. 04

    질의 결과

    행·오류·트랜잭션 결과를 반환한다.

    확인
    업무 처리 결과
  5. 05

    실행 응답

    작업자가 헤더와 본문을 생성해 반환한다.

    병목 후보
    작업자·코드·DB
  6. 06

    HTTP 응답

    클라이언트에 상태와 본문을 보낸다.

    관찰
    응답 코드·처리 시간
학습 모식도. 하나의 대표 요청을 설명하며 연결 수립·세부 메시지와 오류 분기는 필요한 부분만 표시한다.

11처리량과 대기열을 함께 읽기

  • 요청이 느릴 때 웹 서버의 연결 수만 늘리면 실행기나 DB의 병목은 그대로일 수 있다. FPM 작업자가 모두 바쁘면 새 요청이 기다리고, 작업자마다 DB 연결을 요구하면 DB 연결 한도에 먼저 도달할 수도 있다. 작업자 수를 늘릴 때는 작업자당 메모리와 DB 연결 예산을 함께 계산한다.
  • 외부 API나 느린 파일 I/O로 작업자가 붙잡혀 있는 상황과 CPU 계산으로 바쁜 상황도 다른 대책이 필요하다.
  • 웹 서버의 502·504, FPM 연결·작업자 로그, 애플리케이션 traceback, DB의 연결·잠금 상태를 같은 요청과 시각으로 연결한다.
  • 환경에서도 블로킹 함수를 무심코 호출하면 의 진행을 막을 수 있고, 와 는 단순히 빠른 버전·느린 버전으로 나뉘지 않는다.
  • 실행 인터페이스, 서버의 동시성 모델, 코드의 입출력 방식이 함께 처리 특성을 결정한다.
  • 진단용 상세 오류는 내부 기록에 남기고 외부 응답에서는 민감한 경로와 질의를 드러내지 않는다.
구성·관찰 대상관찰 내용해석
웹 서버경로· 대상·오류잘못된 실행 경로와 연결 실패
실행기작업자 수·대기·메모리풀 고갈과 처리 지연
애플리케이션예외·외부 I/O코드 오류와 블로킹
DB연결 수·잠금·질의 시간실행기 밖의 의존성 병목
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

공식 가이드

PHP-FPM 풀과 동시 처리 수 설정

List of pool directives에서 listen·user를 확인한 뒤 pm과 ·를 비교한다. 접속 지점, 실행 계정, 동시 수와 누적 교체 수를 같은 설정 파일 안에서 구별한다.

읽으면서 확인할 것
  • 가 수를 정하는 방법
  • 과 의 다른 단위
  • Unix 소켓 접근 권한과 코드 실행 계정의 차이
학습 확인

이해했는지 확인하기

  • 웹 서버·실행기·애플리케이션의 역할을 구분한다.
  • 실행 사용자와 소켓·파일 접근 권한을 확인한다.
  • 요청 시간 제한과 작업자·DB 연결 수의 관계를 확인한다.

함께 확인할 공식 자료