¿Cómo le digo a Nginx que espere unos segundos antes de entregar un activo?

¿Cómo le digo a Nginx que espere unos segundos antes de entregar un activo?

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 sleepdeclaració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

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_sleepy echo_execen 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 echoestándar , después de responder con un retraso, así:returnecho_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()

Fuente (gist.github.com)

información relacionada