Programming

504 게이트웨이 시간 초과를 유발하는 Nginx 역방향 프록시

procodes 2020. 8. 24. 21:35
반응형

504 게이트웨이 시간 초과를 유발하는 Nginx 역방향 프록시


Nginx를 요청을받은 후 proxy_pass를 수행하여 포트 8001에서 실행되는 업스트림 서버에서 실제 웹 응용 프로그램을 가져 오는 역방향 프록시로 사용하고 있습니다.

mywebsite.com으로 이동하거나 wget을 수행하면 60 초 후에 504 Gateway Timeout이 발생합니다. 그러나 mywebsite.com:8001을로드하면 응용 프로그램이 예상대로로드됩니다!

그래서 뭔가 Nginx가 업스트림 서버와 통신하는 것을 방해하고 있습니다.

이 모든 것은 호스팅 회사가 내 물건이 실행 중이던 컴퓨터를 재설정 한 후 시작되었습니다.

내 가상 호스트 서버 블록은 다음과 같습니다.

server {
    listen   80;
    server_name mywebsite.com;

    root /home/user/public_html/mywebsite.com/public;

    access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
    error_log /home/user/public_html/mywebsite.com/log/error.log;

    location / {
        proxy_pass http://xxx.xxx.xxx.xxx:8001;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
} 

내 Nginx 오류 로그의 출력 :

2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"

아마도 몇 줄을 더 추가하여 업스트림에 대한 제한 시간을 늘릴 수 있습니다. 아래 예제는 제한 시간을 300 초로 설정합니다.

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

시간 초과를 늘리면 실제 대상 웹 서버가 정상적으로 응답하기 때문에 문제가 해결되지 않을 가능성이 높습니다.

나는 이와 동일한 문제가 있었고 연결에서 연결 유지를 사용하지 않는 것과 관련이 있음을 알았습니다. 실제로 이것이 왜 그런지 대답 할 수는 없지만 연결 헤더를 지우 면서이 문제를 해결했고 요청이 제대로 프록시 처리되었습니다.

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

더 자세히 설명하는이 게시물을 살펴보십시오. nginx는 Keep-alive 헤더 설명 요청 후 업스트림 연결 닫기 http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive


모든 사이트에 시간 제한을 늘리거나 추가하려면 아래 줄을 nginx.conf파일에 추가 할 수 있습니다 .

http섹션 /usr/local/etc/nginx/nginx.conf또는 /etc/nginx/nginx.conf파일에 아래 행을 추가 하십시오.

fastcgi_read_timeout 600;
proxy_read_timeout 600;

위의 라인이 존재하지 않는 경우 conf, 파일 다음에 추가 달리 증가 fastcgi_read_timeoutproxy_read_timeout의 nginx와 PHP-FPM은 제한하지 않았다 있는지 확인.

한 사이트에 대한 시간 제한을 늘리려면 vim에서 편집 할 수 있습니다. /etc/nginx/sites-available/example.com

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
        fastcgi_pass  unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300; 
}

이 줄을에 추가 한 후 nginx.confnginx를 다시 시작하는 것을 잊지 마십시오.

service php7-fpm reload 
service nginx reload

또는 valet을 사용하는 경우 간단히 입력하십시오 valet restart.


user2540984, as well as many others have pointed out that you can try increasing your timeout settings. I myself faced a similar issue to this one and tried to change my timeout settings in the /etc/nginx/nginx.conf file, as almost everyone in these threads suggest. This, however, did not help me a single bit; there was no apparent change in NGINX' timeout settings. After many hours of searching, I finally managed to solve my issue.

The solution lies in this forum thread, and what it says is that you should put your timeout settings in /etc/nginx/conf.d/timeout.conf (and if this file doesn't exist, you should create it). I used the same settings as suggested in the thread:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

This might not be the solution to your particular problem, but if anyone else notices that the timeout changes in /etc/nginx/nginx.conf don't do anything, I hope this answer helps!


You can also face this situation if your upstream server uses a domain name, and its IP address changes (e.g.: your upstream points to an AWS Elastic Load Balancer)

The problem is that nginx will resolve the IP address once, and keep it cached for subsequent requests until the configuration is reloaded.

You can tell nginx to use a name server to re-resolve the domain once the cached entry expires:

location /mylocation {
    # use google dns to resolve host after IP cached expires
    resolver 8.8.8.8;
    set $upstream_endpoint http://your.backend.server/;
    proxy_pass $upstream_endpoint;
}

The docs on proxy_pass explain why this trick works:

Parameter value can contain variables. In this case, if an address is specified as a domain name, the name is searched among the described server groups, and, if not found, is determined using a resolver.

Kudos to "Nginx with dynamic upstreams" (tenzer.dk) for the detailed explanation, which also contains some relevant information on a caveat of this approach regarding forwarded URIs.


Had the same problem. Turned out it was caused by iptables connection tracking on the upstream server. After removing --state NEW,ESTABLISHED,RELATED from the firewall script and flushing with conntrack -F the problem was gone.

참고URL : https://stackoverflow.com/questions/24453388/nginx-reverse-proxy-causing-504-gateway-timeout

반응형