Wenn ich also Dinge wie Ajax in Apps, die ich schreibe, lokal teste, füge ich häufig gerne eine Verzögerung in serverseitigen Skripten mithilfe einer sleep
Anweisung hinzu. Dies hilft, langsame Verbindungen usw. zu simulieren.
Gibt es eine Möglichkeit, ein ähnliches Verzögerungsverhalten direkt in der Nginx-Konfiguration anzugeben, das für die bereitgestellten flachen HTML-Dateien funktionieren würde?
Ich bin mir bewusst, dass Sie eine ähnliche Verzögerungssimulation auf Netzwerkebene durchführen können (sieheHier), aber es scheint ziemlich chaotisch zu sein und hat bei mir nie besonders gut funktioniert.
Antwort1
Sie sollten ein Echomodul ausprobieren.
Antwort2
Eine detailliertere Erklärung, wie Sie das Echo-Modul verwenden können:
Wenn Sie mit einer Basiskonfiguration beginnen, die statische Dateien und PHP-Dateien lädt, etwa so:
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php;
}
Dies kann dann in etwa wie folgt umgewandelt werden, um sowohl statischen als auch PHP-Anfragen eine Verzögerung hinzuzufügen:
# 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;
}
Dies kann natürlich beliebig geändert werden. Verschieben Sie grundsätzlich jeden Standortblock in einen benannten @location. Verwenden Sie dann echo_sleep
und echo_exec
im ursprünglichen Standortblock.
Antwort3
Ich möchte hinzufügenAstlocks Antwortdass, wenn Sie mit einem einfachen antworten möchten return
, dann beachten Sie, dass es eine Einschränkung gibt: SiemüssenVerwenden Sie danach echo
keine Standarddirektive return
, um echo_sleep
mit einer Verzögerung zu antworten, etwa so:
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';
}
(Getestet auf openresty/1.7.10.2)
Antwort4
Das folgende Python-Skript hat bei mir gut funktioniert und ist meiner Meinung nach das Teilen wert.
#!/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()