nginx에서 504 Gateway Time-out 오류가 발생할 경우는 리버스 프록시에서의 응답이 지정 시간보다 늦어질 경우다.
접속이 지연되는 경우는 서버의 부하 문제나 WAS의 오류로 인한 것이니 nginx가 아닌 WAS 쪽에서 해결해야하는 것이 맞을 것이다.
간혹 특수한 경우에 WAS 쪽의 처리가 오랜 시간을 필요로 하는 경우 어쩔 수 없이 timeout을 늘려야 하는 경우가 있을 수 있다. 이런 경우라면 proxy_connect_timeout, proxy_send_timeout, proxy_read_timeout 등을 사용해서 시간을 늘려줄 수 있다(기본은 60초다).
server {
...
location / {
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
}
}
사실 이런 경우는 서비스 중에는 발생해서는 안된다. 사용자가 이렇게 오랜 시간을 기다려줄 리가 없기 때문이다. 이런 기능이 필요하다면 Job Queue를 이용하거나 사용자에게 안내 메시지를 보내고 백그라운드에서 계속 실행되도록 하는 것이 맞을 것이다.
php 에서는 이런 경우에 대비해서 fastcgi_finish_request를 제공한다. 이 함수를 실행하면 사용자에게는 프로세스가 종료된 것처럼 response를 보내고 남은 작업을 계속 실행한다.
다른 방법은 ob_flush와 flush를 이용해서 response를 지속적으로 보내서 timeout이 발생하지 않도록 하는 것이다.