워드프레스 사용시 502 Bad Gateway 문제 발생했을 때 해결방법

2022. 5. 10. 21:38개발을 파헤치다/서버 인프라

반응형

 

먼저 502 Bad Gateway 에러가 언제 발생하는지 파악하는 것이 좋습니다.
이 에러는 특히 Nginx와 php-fpm 조합에서 흔히 발생하는 에러로 알려져 있는데요.

  1. php-fpm에서 처리해야 하는 자료 중에서 굉장히 크기가 큰 요청을 처리하는 경우
  2. 서버 반응속도가 느려서 php-fpm으로 요청이 전달되는 와중에 서버에서 긴 시간을 요구하는 경우

이렇게 원인을 찾아볼 수 있습니다. 정확이 어떤 에러가 발생하는지 파악하기 위해 먼저 nginx의 error log를 보는 게 좋겠죠.

putty로 aws의 bitnami 인스턴스에 접속한 뒤 아래 명령어를 통해 로그를 확인합니다.

cd /opt/bitnami/nginx/logs
sudo tail ./error.log

 

2022/05/10 10:33:39 [error] 1089#1089: *242 upstream sent too big header while reading response header from upstream, client: 172.31.7.175, server: _, request: "GET /wp-json/jejuand-rest/v1/product/wishlist?page=1 HTTP/1.1", upstream: "fastcgi://unix:/opt/bitnami/php/var/run/www.sock:", host: "jejuand-dev.link"


위와 같은 에러가 떠있네요. 예상했던 대로 php-fpm에서 Nginx에 응답으로 준 header의 크기가 너무 커서 요청에 대한 응답이 지연되면서 502 에러가 발생하게 된 것입니다.
이럴 경우 해결책은 두 가지 방법이 있는데요.

  1. 응답이 길어지는 원인 제거 → 보통 로직상 문제가 있는 경우가 있습니다. 예를 들어, 내부적으로 에러가 발생해서 php-fpm으로부터 응답을 받지 못한 상황이라던가, 무한 루프에 빠진다던가 하는 경우입니다.

  2. nginx의 timeout과 response 버퍼 사이즈를 변경 → 정말로 크기가 너무 커서 발생한 경우라면 nginx의 설정에서 timeout 시간을 늘리고 버퍼의 사이즈를 늘려 처리 용량을 늘려주는 것으로 해결할 수 있습니다.

 

2022/05/10 10:52:04 [error] 1089#1089: *621 FastCGI sent in stderr: 
"PHP message: name was called incorrectly. 제품 속성에 직접 접근해서는 안 됩니다. 
Backtrace: require('wp-blog-header.php'), wp, WP->main, WP->parse_request,
 do_action_ref_array('parse_request'), WP_Hook->do_action, WP_Hook->apply_filters, rest_api_loaded, WP_REST_Server->serve_request, WP_REST_Server->dispatch, 
 WP_REST_Server->respond_to_request, ProductController->get_product_review, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.PHP. 
 message: name was called incorrectly. 제품 속성에 직접 접근해서는 안 됩니다. Backtrace: require('wp-blog-header.php'), wp, WP->main, WP->parse_request, do_action_ref_array('parse_request'), 
 WP_Hook->do_action, WP_Hook->apply_filters, rest_api_loaded, WP_REST_Server->serve_request, WP_REST_Server->dispatch, WP_REST_Server->respond_to_request, ProductController->get_product_review, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0". 
 while reading response header from upstream, client: 172.31.16.197, server: _, request: "GET /wp-json/jejuand-rest/v1/product/review?product_id=3661&page=1&per_page=4 HTTP/1.1", upstream: "fastcgi://unix:/opt/bitnami/php/var/run/www.sock:", host: "jejuand-dev.link"


이런 에러가 발생했는데 살펴보니 Woocommerce의 REST API를 커스텀하는 과정에서 Product 인스턴스의 필드에 직접 접근하는 것이 문제였습니다. 해당 인스턴스에서는 get 메서드를 지원하고 있었고 로직을 직접 접근에서 get 메서드로 모두 바꿔주니 에러가 해결되면서 502 에러도 사라졌습니다.
만약 이렇게 해도 해결이 안 됐다면 Nginx의 설정에서 timeout과 buffer size를 늘려주는 방식으로 해결했을 것 같습니다.

반응형