Entonces, cuando pruebo localmente cosas como Ajax en aplicaciones que estoy escribiendo, a menudo me gusta agregar un retraso en los scripts del lado del servidor usando una sleep
declaración. Ayuda a simular conexiones lentas, etc.
¿Hay alguna manera de especificar un comportamiento de retraso similar directamente en la configuración de Nginx que funcione para los archivos HTML planos que sirve?
Soy consciente de que puedes hacer una simulación de retraso similar a nivel de red (veraquí) pero parece bastante complicado y nunca me ha funcionado muy bien.
Respuesta1
Deberías probar un módulo de eco.
Respuesta2
Dando una explicación más detallada de cómo podría utilizar el módulo de eco:
Si estás comenzando desde una configuración básica, que carga archivos estáticos y archivos PHP, con algo como esto:
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php;
}
Luego se puede convertir a algo como esto para agregar un retraso tanto a las solicitudes estáticas como a las de 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;
}
Obviamente, esto se puede modificar para lo que quieras. Básicamente, mueva cada bloque de ubicación a una @ubicación con nombre. Luego use echo_sleep
y echo_exec
en el bloque de ubicación original.
Respuesta3
Me gustaría agregar ala respuesta de astlockque si quieres responder de forma sencilla return
, ten en cuenta que hay una advertencia:tengo queuse , no una directiva echo
estándar , después de responder con un retraso, así: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';
}
(Probado en openresty/1.7.10.2)
Respuesta4
El siguiente script de Python funcionó bien para mí y, en mi humilde opinión, vale la pena compartirlo.
#!/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()