[Nginx 트러블슈팅] 웹 서버 ‘502 Bad Gateway’ 에러 완벽 해결 가이드: 원인부터 PHP-FPM 설정까지

    웹사이트를 운영하다 보면 마주치는 수많은 에러 코드 중, 관리자의 등골을 가장 서늘하게 만드는 에러가 하나 있습니다. 하얀 바탕에 굵은 글씨로 덩그러니 적힌 **’502 Bad Gateway’**입니다.

    접속자가 몰리는 이벤트 기간이나 중요한 업데이트 직후 이 에러가 발생하면, 비즈니스 수익과 직결되는 치명적인 장애가 됩니다. 구글 검색 엔진 역시 접속 불량인 사이트에 SEO(검색 엔진 최적화) 페널티를 부여하므로 신속한 조치가 필수적입니다. 오늘은 Nginx와 PHP-FPM(주로 워드프레스 환경) 조합에서 발생하는 502 Bad Gateway 에러의 근본적인 원인과 실무에서 즉시 적용할 수 있는 단계별 해결 방법을 완벽하게 정리해 드리겠습니다.


    1. ‘502 Bad Gateway’ 에러의 진짜 의미는?

    에러를 해결하려면 먼저 이 에러가 왜 발생하는지 구조를 이해해야 합니다.

    최신 웹 서버 아키텍처는 대부분 프론트(앞단)에 Nginx를 두고, 백엔드(뒷단)에 PHP-FPM, Node.js, Tomcat 등을 두는 ‘리버스 프록시(Reverse Proxy)’ 구조를 사용합니다.

    • Nginx (문지기): 사용자의 요청(트래픽)을 가장 먼저 받아 뒷단으로 넘겨줍니다.
    • PHP-FPM (실무자): Nginx로부터 넘겨받은 요청(DB 조회, 연산 등)을 실제로 처리하여 다시 Nginx에게 돌려줍니다.

    502 Bad Gateway 에러는 ‘문지기(Nginx)’는 정상적으로 살아있는데, ‘실무자(PHP-FPM)’가 죽어있거나 응답을 주지 않을 때 발생합니다. 즉, Nginx 자체의 문제라기보다는 그 뒤에 연결된 백엔드 애플리케이션에 문제가 생겼다는 명백한 신호입니다.

    2. 에러가 발생하는 3가지 핵심 원인

    실무에서 502 에러를 유발하는 범인은 십중팔구 아래 3가지 중 하나입니다.

    1. PHP-FPM 프로세스 중지: 서버 재부팅, 메모리 부족(OOM) 등으로 인해 PHP-FPM 데몬 자체가 아예 꺼져있는 경우입니다.
    2. 소켓(Socket) 통신 경로 불일치: Nginx는 A라는 문(경로)으로 데이터를 넘겨주려 하는데, PHP-FPM은 B라는 문에서 기다리고 있어 서로 연결(통신)이 어긋난 경우입니다.
    3. 타임아웃(Timeout) 및 자원 고갈: 동시 접속자가 너무 많거나, 무거운 DB 쿼리 연산으로 인해 PHP-FPM이 정해진 시간 내에 Nginx로 응답을 주지 못한 경우입니다.

    3. Nginx / PHP-FPM 실전 해결 방법 (트러블슈팅)

    원인을 알았으니, 이제 터미널(SSH)에 접속하여 순서대로 범인을 잡아낼 차례입니다. 우분투(Ubuntu) 환경을 기준으로 설명합니다.

    [Step 1] PHP-FPM 서비스 상태 확인 및 재시작

    가장 먼저 백엔드 프로세스가 살아있는지 확인해야 합니다. (PHP 버전은 본인 서버 환경에 맞게 숫자 8.1 등을 변경하세요.)

    Bash

    # 상태 확인
    sudo systemctl status php8.1-fpm
    

    만약 상태가 inactive (dead) 또는 failed로 나온다면, 데몬이 죽어있는 것입니다. 아래 명령어로 서비스를 재시작해 줍니다.

    Bash

    sudo systemctl restart php8.1-fpm
    sudo systemctl restart nginx
    

    단순한 일시적 오류였다면 이 명령어 두 줄로 사이트가 다시 정상적으로 열릴 것입니다.

    [Step 2] 에러 로그(Log) 확인 (가장 중요)

    재시작을 해도 여전히 502 에러가 뜬다면, Nginx가 남긴 에러 로그를 읽어 정확한 원인을 파악해야 합니다.

    Bash

    sudo tail -f /var/log/nginx/error.log
    

    에러 로그를 보면 다음과 같은 핵심 단서들이 영어로 기록되어 있습니다.

    • connect() to unix:/run/php/php8.1-fpm.sock failed (2: No such file or directory) -> 소켓 경로 불일치 오류 (Step 3 참조)
    • upstream timed out (110: Connection timed out) -> 타임아웃 오류 (Step 4 참조)

    [Step 3] 소켓(Socket) 경로 일치시키기

    에러 로그에 No such file이 떴다면, Nginx 설정과 PHP-FPM 설정의 통신 주소가 서로 다르게 세팅되어 있는 것입니다.

    1. Nginx 설정 확인

    Bash

    sudo nano /etc/nginx/sites-available/default
    

    파일 내에서 fastcgi_pass 항목이 어떻게 적혀있는지 확인합니다.

    • 예시: fastcgi_pass unix:/run/php/php8.1-fpm.sock; (유닉스 소켓 방식) 또는 fastcgi_pass 127.0.0.1:9000; (TCP 방식)

    2. PHP-FPM 설정 확인

    Bash

    sudo nano /etc/php/8.1/fpm/pool.d/www.conf
    

    파일 내에서 listen = 항목을 찾습니다. 이 주소가 방금 확인한 Nginx의 fastcgi_pass 주소와 글자 하나 틀리지 않고 100% 동일해야 합니다. 다르게 적혀있다면 둘 중 하나를 수정하여 맞춰준 뒤, 두 서비스를 모두 재시작합니다.

    [Step 4] 타임아웃 및 프로세스 제한(Max Children) 늘리기

    트래픽이 몰렸을 때만 502 에러가 뜬다면, 서버가 감당할 수 있는 작업량(프로세스 수)을 늘려주고 기다려주는 시간(타임아웃)을 연장해야 합니다.

    1. PHP-FPM 작업자 수 늘리기 www.conf 파일을 다시 열고 아래 설정값들을 서버의 RAM 용량에 맞게 상향 조정합니다. (1GB RAM 기준 권장값 예시)

    Ini, TOML

    pm.max_children = 50
    pm.start_servers = 10
    pm.min_spare_servers = 5
    pm.max_spare_servers = 20
    

    2. Nginx 대기 시간 늘리기 Nginx 설정 파일(nginx.conf 또는 default)을 열고 location ~ \.php$ 블록 안에 아래 코드를 추가하여 대기 시간을 늘려줍니다.

    Nginx

    fastcgi_read_timeout 300;
    fastcgi_send_timeout 300;
    

    설정을 저장한 후 sudo nginx -t 로 문법 오류를 체크하고 서버를 재시작합니다.


    결론: 당황하지 말고 ‘로그(Log)’부터 읽는 습관

    ‘502 Bad Gateway’ 에러는 겉보기에는 치명적인 고장 같지만, 사실 Nginx가 “내 뒤에 있는 친구가 응답이 없어요!”라고 친절하게 알려주는 아주 명확한 시스템 메시지입니다.

    서버에 장애가 발생했을 때 인터넷 검색부터 하기보다는, tail -f /var/log/nginx/error.log 명령어를 쳐서 서버가 남긴 로그 기록을 먼저 읽어보는 습관을 들이는 것이 중요합니다. 이 트러블슈팅 가이드를 통해 트래픽 폭주 상황에서도 당황하지 않고 안정적으로 대처하는 훌륭한 시스템 엔지니어로 성장하시기를 응원합니다.

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

    광고보고 콘텐츠 계속 읽기
    원치않으시면 뒤로가기를 해주세요

    광고 차단 알림

    광고 클릭 제한을 초과하여 광고가 차단되었습니다.

    단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.

    광고보고 콘텐츠 계속 읽기
    원치않으시면 뒤로가기를 해주세요