자산을 제공하기 전에 몇 초 동안 기다리도록 Nginx에 어떻게 지시합니까?

자산을 제공하기 전에 몇 초 동안 기다리도록 Nginx에 어떻게 지시합니까?

그래서 내가 작성 중인 앱에서 Ajax와 같은 것을 로컬에서 테스트할 때 명령문을 사용하여 서버 측 스크립트에 지연을 추가하는 것을 좋아하는 경우가 많습니다 sleep. 느린 연결 등을 시뮬레이션하는 데 도움이 됩니다.

제공되는 플랫 HTML 파일에 대해 작동하는 Nginx 구성에서 직접 유사한 지연 동작을 지정하는 방법이 있습니까?

네트워크 수준에서 유사한 지연 시뮬레이션을 수행할 수 있다는 것을 알고 있습니다(참조여기) 하지만 그것은 꽤 지저분해 보이고 나에게는 결코 잘 작동하지 않았습니다.

답변1

답변2

echo 모듈을 사용하는 방법에 대한 더 자세한 설명을 제공합니다:

기본 구성에서 시작하는 경우 다음과 같이 정적 파일과 PHP 파일을 로드합니다.

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass php;
}

그런 다음 정적 요청과 PHP 요청 모두에 지연을 추가하기 위해 다음과 같이 변환할 수 있습니다.

# Static files
location / {
    echo_sleep 5;
    echo_exec @default;
}
location @default {}

# PHP files
location ~ \.php$ {
    echo_sleep 5;
    echo_exec @php;
}
location @php {
    include fastcgi.conf;
    fastcgi_pass php;
}

이것은 분명히 원하는 대로 수정될 수 있습니다. 기본적으로 각 위치 블록을 @location이라는 이름으로 이동합니다. 그런 다음 원래 위치 블록에서 echo_sleep및를 사용합니다 .echo_exec

답변3

나는에 추가하고 싶습니다Astlock의 답변만약 당신이 단순하게 대답하고 싶다면 return다음과 같은 주의 사항이 있다는 점에 유의하세요.~해야 한다다음과 같이 지연으로 응답하려면 echo표준 return지시어 가 아닌 를 사용하세요 .echo_sleep

location = /slow-reply {
  echo_sleep 5.0;
  #return 200 'this response would NOT be delayed!';      
  echo 'this text will come in response body with HTTP 200 after 5 seconds';
}

(openresty/1.7.10.2에서 테스트됨)

답변4

다음 Python 스크립트는 저와 공유할 가치가 있는 IMHO에게 잘 작동했습니다.

#!/usr/bin/env python

# Includes
import getopt
import sys
import os.path
import subprocess
from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler
import socketserver
import time

########  Predefined variables #########
helpstring = """Usage: {scriptname} args...
    Where args are:
        -h, --help
            Show help
        -p PORTNUMBER
            Port number to run on
        -d delay-in-seconds
            How long to wait before responding
"""

helpstring = helpstring.format(scriptname=sys.argv[0])

def beSlow(seconds):
    time.sleep(float(seconds))


########  Functions and classes #########
class SlowserverRequestHandler(BaseHTTPRequestHandler):
    def do_GET(s):
        if s.path == "/slow":
            # Check status
            # Assume fail
            code = 200
            status = ""

            # Be slow for a while
            beSlow(seconds)

            s.send_response(200)
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write(b"I'm a slow response LOL\n")

        else:
            s.send_response(200)
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write(b"slowserver - reporting for duty. Slowly...\n")


# Parse args
try:
    options, remainder = getopt.getopt(sys.argv[1:], "hp:d:", ['help'])
except:
    print("Invalid args. Use -h or --help for help.")
    raise
    sys.exit(1)

HTTPPORT = 8000
for opt, arg in options:                                                  
    if opt in ('-h', '--help'):                                           
        print(helpstring)                                                 
        sys.exit(0)                                                       
    elif opt in ('-p'):                                                   
        HTTPPORT = int(arg)                                               
    elif opt in ('-d'):                                                
        seconds = arg                                                  
                                                                       
# Start HTTP service                                                   
server_class=HTTPServer                                                
handler_class=SlowserverRequestHandler               
server_address = ('', HTTPPORT)                      
httpd = server_class(server_address, handler_class)
try:                                               
    httpd.serve_forever()                          
except KeyboardInterrupt:                          
    pass                                           
httpd.server_close()

출처 (gist.github.com)

관련 정보