Como digo ao Nginx para esperar alguns segundos antes de servir um ativo?

Como digo ao Nginx para esperar alguns segundos antes de servir um ativo?

Portanto, quando estou testando localmente coisas como Ajax em aplicativos que estou escrevendo, geralmente gosto de adicionar um atraso nos scripts do lado do servidor usando uma sleepinstrução. Ajuda a simular conexões lentas, etc.

Existe uma maneira de especificar um comportamento de atraso semelhante diretamente na configuração do Nginx que funcionaria para os arquivos HTML simples que ele está servindo?

Estou ciente de que você pode fazer uma simulação de atraso semelhante no nível da rede (consulteaqui), mas parece muito confuso e nunca funcionou muito bem para mim.

Responder1

Responder2

Dando uma explicação mais detalhada de como você pode usar o módulo echo:

Se você está começando com uma configuração básica, que carrega arquivos estáticos e arquivos PHP, com algo assim:

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass php;
}

Isso pode então ser convertido para algo assim para adicionar um atraso às solicitações estáticas e 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, isso pode ser modificado para o que você quiser. Basicamente, mova cada bloco de localização para um @location nomeado. Em seguida, use echo_sleepe echo_execno bloco de localização original.

Responder3

Eu gostaria de adicionarresposta de astlockque se você quiser responder de forma simples return, observe que há uma ressalva: vocêprecisause , não uma diretiva echopadrão , depois de responder com atraso, assim: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';
}

(Testado em openresty/1.7.10.2)

Responder4

O script python a seguir funcionou bem para mim e, IMHO, vale a pena compartilhar.

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

Fonte (gist.github.com)

informação relacionada