Wie weise ich Nginx an, eine bestimmte Anzahl von Sekunden zu warten, bevor ein Asset bereitgestellt wird?

Wie weise ich Nginx an, eine bestimmte Anzahl von Sekunden zu warten, bevor ein Asset bereitgestellt wird?

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 sleepAnweisung 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

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_sleepund echo_execim 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 echokeine Standarddirektive return, um echo_sleepmit 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()

Quelle (gist.github.com)

verwandte Informationen