nginx + php7.0-fpm 502 BAD Gateway

2018년 8월 5일

nginx는 Apache2에 비해서 빠르고 더 많은 트ㄹ픽을 처리할 수 있는 HTTP 처리 능력을 가진 웹서버 데몬입니다.
아울러 PHP와 같이 구동되는 웹 어플리케이션을 사용할 떄는, PHP-fpm을 사용하여 더 빠른 PHP 처리를 이끌어 낼 수 있지요.
하지만, 간혹 nginx + php-fpm 조합을 활용하여 웹 어플리케이션을 구동할 경우, 특정한 상황의의 경우 502 Bad gateway 에러를 내뿜는 경우를 확인할 수 있습니다.

특정상황

  • PHP-fpm으로 처리 해야 되는 자료 중에서 굉장히 크기가 큰 요청을 처리하는 경우
  • 서버 반응속도가 느려 PHP-fpm으로 가는 도중 서버 요청에 긴 시간을 요구하는 경우(php 요청이 timeout이 발생하는 것)

문제점

nginx + php-fpm 간혹 502 Bad gateway error를 보여줌
서버에서 nignx / php-fpm 은 정상적으로 작동되는 됨. php-fpm을 restart 하면 다시 사이트가 오류없이 잘작동되는 것을 알수 있다.

해결책 1: nginx HTTP 부분에서 fastcgi 버퍼 사이즈와 timeout 시간 변경

이 해결방법은 가장 대중적인 해결 방법으로써, nginx가 php-fpm으로 PHP 처리 요청을 보냈을 때, 버퍼의 크기를 늘려 처리 용량을 확대해주고 timeout이 처리되는 시간을 늘려주는 방법

nginx의 HTTP (최근 버전의 nginx에서는 /etc/nginx/sites-available/해당사이트) 안의 PHP소켓 관련 설정에서, 아래와 같은 설정을 추가

	
server {
 (... 중략 ...)
 
     location ~ \.php$ {
           # With php7-fpm:
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 
          # 아래부터 버그 해결을 위해 추가해 주실 옵션입니다.
          # 502 에러를 없애기 위한 proxy 버퍼 관련 설정입니다.
          proxy_buffer_size               128k;
          proxy_buffers                   4 256k;
          proxy_busy_buffers_size         256k;
 
          # 502 에러를 없애기 위한 fastcgi 버퍼 관련 설정입니다.
          fastcgi_buffering               on;
          fastcgi_buffer_size             16k;
          fastcgi_buffers                 16 16k;
 
          # 최대 timeout 설정입니다.
          fastcgi_connect_timeout         600s;
          fastcgi_send_timeout            600s;
          fastcgi_read_timeout            600s;
 
          # 이 아래 설정은 PHP 성능 향상을 위한 옵션입니다. 추가해 주시면 좋습니다.
          sendfile                        on;
          tcp_nopush                      off;
          keepalive_requests              0;
 
 (... 이하 생략 ...)
 

설정후 nginx와 php7.0-fpm을 restart(또는 reload)해주면 된다.
아마 이것으로 대부분의 502 에러는 해결이 된다.

해결책 2 : nginx의 설정 파일과 php-fpm 설정 파일의 소켓 일치시키기

간혹 nginx 의 설정안에서의 ‘fastcgi-pass’ 경로와, php-fpm 설정 파일의 listen 경로가 다른 경우. 502 Bad gateway error 가 나타는 경우가 있다고도 합니다.
이런 경우네느 PHP을 불러오는 대다수의 경우의 에러가 발생하는 경우가 많습니다.

먼저 nginx 설정 파일에서 PHP를 처리하는 부분의,
fastcgi-pass 값을 확인하여 PHP-fpm sock 파일이 정상적으로 위치해 있는지 확인합니다.
(없는 경우에는, sock 파일을 찾아서 적당한 경로로 입력해 주어야 합니다. 많은 경우에는 /var/ 디렉토리 안에서 php 관련 폴더 안에 위치하고 있습니다.)

저는 502 Bad gateway error 문제는해결하기 위해서 구글링하다가 아래 분의 사이트를 참고하고 해결하였습니다 다음에도 이런 경우에 해결방법 1에서 해결되지 못하면 또 다른 방법을 찾아서 실행시켜보고 확인하고 추가적으로 정보를 익히고 적어놓으려고합니다~

참고한 사이트 : 곰곰이오
감사합니다 🙂