Поэтому, когда я локально тестирую такие вещи, как 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()