Как заставить Nginx ждать несколько секунд перед обработкой ресурса?

Как заставить Nginx ждать несколько секунд перед обработкой ресурса?

Поэтому, когда я локально тестирую такие вещи, как Ajax в приложениях, которые я пишу, я часто добавляю задержку в скрипты на стороне сервера с помощью оператора sleep. Это помогает имитировать медленные соединения и т. д.

Есть ли способ указать аналогичное поведение задержки непосредственно в конфигурации Nginx, которое работало бы для обслуживаемых им простых HTML-файлов?

Я знаю, что вы можете провести аналогичную симуляцию задержки на сетевом уровне (см.здесь), но это кажется довольно запутанным и никогда не работало у меня хорошо.

решение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

Я хотел бы добавить кответ астлокачто если вы хотите ответить простым текстом 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 хорошо сработал у меня и, на мой взгляд, заслуживает того, чтобы им поделиться.

#!/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)

Связанный контент