모든 페이지, 대부분의 페이지에서 발생한다면 2,3 번 해결책을 시도해 보고
특정한 상황에서 뜬다면 1번 해결책을 권장한다. (이 경우 문제는 버퍼 타임아웃이다. 라즈베리같은데서 서버 구동하다봄면 잘 뜨는 듯)
출처 :: https://blog.gomgom.io/502-bad-gateway-solution-on-nginx-php_fpm/
해결책 1 : nginx HTTP 부분에서 fastcgi 버퍼 사이즈와 timeout 시간 변경
– 이 해결 방법은 가장 대중적인 해결 방법으로써, nginx가 php-fpm으로 PHP 처리 요청을 보냈을 때, 버퍼의 크기를 늘려 처리 용량을 확대해주고 timeout이 처리되는 시간을 늘려주는 방법임
(참고 : 502 Bad Gateway on Nginx with BuddyPress)
– nginx의 HTTP(최근 버전의 nginx에서는 /etc/nginx/sites-available/default 등) 안의 php 소켓 관련 설정에서, 아래와 같은 설정을 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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 에러는 해결이 됩니다.
| $ sudo service nginx restart $ sudo service php7.0-fpm restart |
해결책 2 : nginx의 설정 파일과 php-fpm 설정 파일의 소켓 일치시키기
– 간혹 nginx의 설정 안에서의 ‘fastcgi-pass’ 경로와, php-fpm 설정 파일의 listen 경로가 다른 경우, 502 Bad gateway 에러가 나타나는 경우가 있다고도 합니다. 이런 경우에는 PHP를 불러오는 대다수의 경우의 에러가 발생하는 경우가 많습니다.
– 먼저 nginx 설정 파일에서 PHP를 처리하는 부분의, fastcgi-pass 값을 확인하여 PHP-fpm sock 파일이 정상적으로 위치해 있는지 확인합니다. (없는 경우에는, sock 파일을 찾아서 적당한 경로로 입력해 주어야 합니다. 많은 경우에는 /var/ 디렉토리 안에서 php 관련 폴더 안에 위치하고 있습니다.)
| # nginx 설정 파일 내 PHP 처리 부분(저의 경우는 /etc/nginx/sites-available/default 내)에서, # location ~ \.php$ { 부분으로 시작하는 곳을 찾습니다. location ~ \.php$ { # 안에서, fastcgi_pass unix:/your/php/sample/php7.0-fpm.sock; # 부분의 경로에 sock 파일이 있는지 확인합니다. ------------------------- $ ls -al /your/php/sample/ -rw-r--r-- 1 root root 4 1월 8 12:34 php7.0-fpm.pid |
– sock 파일이 있는 것을 확인했다면, PHP-fpm 설정 파일에서 listen 부분의 sock 파일이 경로가 동일한지 확인합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $ sudo nano /etc/php/7.0/fpm/pool.d/www.conf (PHP 버전 및 설치 방법에 따라 설정파일 경로가 다를 수 있음) [www] (중에서, ) ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. listen = /your/php/sample/php7.0-fpm.sock (listen 부분의 경로가 nginx 설정 파일의 경로와 일치하게 수정) |
설정이 끝난 이후, nginx와 php-fpm을 재시작(또는 reload) 해 줍니다.
| $ sudo service nginx restart $ sudo service php7.0-fpm restart |
해결책 3 : php-fpm 설치 후 php-fpm을 실행하지 않은 경우 (…)
– 매우 드문 경우이긴 합니다만, php-fpm 을 설치한 이후 실행하지 않아서 작동하지 않는 경우가 있을 수도 있습니다. (…) service 명령어를 이용해 아래와 같은 명령어들을 실행해 봅니다.
| $ sudo service php-fpm start $ sudo service php5-fpm start $ sudo service php7.0-fpm start |
– 혹은 그저, 프로세스의 문제로 재시작을 하여 문제가 해결되는 경우도 있다고 합니다.
| $ sudo service php-fpm restart $ sudo service php5-fpm restart $ sudo service php7.0-fpm restart |
끝마치며
nginx와 php-fpm은 간혹 다양한 문제를 내뿜기도 합니다만, 확실히 Apache2 + PHP 조합보다 더 나은 성능과, 복합적인 처리 능력을 자랑하는 만큼, 다양한 에러를 해결해 나가면서 점점 nginx가 최적화 될 수 있도록 설정하실 수 있으실 것이라고 확신합니다.
502 Bad gateway 또한 다양한 이유에 의해 문제가 발생하고 있기도 하고, 또 다양한 방법으로 해결되기도 합니다. 그런 만큼, 포기하지 마시고 해결하실 수 있으시면 좋겠습니다.