Ricarica nuova configuration Nginx senza tempo di inattività

Ho un server Nginx che si occupa costantemente di un elevato numero di richieste. Voglio essere in grado di modificare il file di configuration del server e ricaricare dynamicmente con zero tempi di inattività.

Sto eseguendo la seguente row nella shell:

  • Come proibire i nomi di file non UTF-8?
  • Come concedere l'accesso temporaneo al server?
  • Imansible ridimensionare il volume root di ec2 ebs
  • Cosa può causare un aumento della memory intriggers e come recuperarla?
  • Come posso disinstallare MySQL completamente?
  • Il saldo-rr di linux (modalità bond = 0) funziona con tutti gli interruttori?
  • httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=1 --num-calls=10 

    E mentre invia le richieste sto ricaricando la mia configuration nginx. Ho provato le due seguenti opzioni:

     sudo nginx -s reload sudo kill -s HUP [pid] 

    Entrambe causano che httperf restituisce alcuni errori. In media, dopo due buone richieste, httperf esce e printing il suo registro con la seguente row:

     Errors: total 1 client-timo 0 socket-timo 0 connrefused 0 connreset 1 

    Ho letto in numerosi luoghi che il reload dovrebbe essere fatto senza problemi senza tempi di inattività, ma dal test che gestisco le cose sembrano diverse.

    Le mie domande sono:

    1. Sto eseguendo i test in modo sbagliato? Perché ho ripristinato questa connessione?
    2. C'è una soluzione a questo problema?
    3. In realtà ho bisogno di un bilanciatore di carico che posso aggiungere dynamicmente e rimuovere i server da esso, quali soluzioni migliori che si adattino al mio problema?

    Grazie in anticipo per l'aiuto, non vediamo l'ora di vedere alcune risposte insightful.

    One Solution collect form web for “Ricarica nuova configuration Nginx senza tempo di inattività”

    Per comprendere la risposta seguente è richiesto un certo livello di background:

    • Che cosa è la connessione persistente HTTP .
    • Le basi del protocollo TCP e in particolare il stream di lavoro di terminazione di connessione .

    Sto eseguendo i test in modo sbagliato?

    Sì, stai eseguendo un test in modo errato. Il problema è che il tuo test utilizza la connessione PERSISTENT per submit 10 richieste. È ansible controllarlo facilmente eseguendo il seguente test e non avrai alcun reset di connessione (perché ti invia una sola richiesta per connessione):

     httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=10 --num-calls=1 

    Perché ho ripristinato questa connessione?

    Se si guarda alla documentazione di nginx , trovenetworking questo:

    I vecchi processi di lavoratori, che ricevono un command per arrestare, smettono di accettare nuove connessioni e continuano a gestire le richieste correnti fino a quando non vengono eseguite tutte le richieste. Successivamente, il vecchio lavoratore esegue l'output.

    Quello è vero, ma la documentazione non menziona ciò che accade con connessioni persistenti. Ho trovato risposta nella vecchia mailing list . Dopo che la richiesta corrente è in esecuzione, nginx avvia una connessione persistente chiusa inviando [FIN, ACK] al client.

    Per controllarlo, ho usato WireShark e configurato il server con un semplice lavoratore, che su richiesta dorme 5 secondi e poi risponde. Ho usato il seguente command per submit la richiesta:

     httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=1 --num-calls=2 

    Dopo aver rilasciato il command precedentemente citato ho ricaricato il nginx (mentre gestiva la prima richiesta). Qui sono i pacchetti sniffati da WireShark:

    traffico wireshark

    • 3892-3894 – la connessione di TCP tradizionale.
    • 3895 – il client ha inviato la prima richiesta.
    • 3896 – il server riconosce 3895.
    • qui il nginx reload stato eseguito.
    • 4089 – risposta inviata dal server.
    • 4090 – il server ha inviato un segnale di connessione chiuso.
    • 4091 – il cliente riconosce 4089.
    • 4092 – il cliente riconosce 4090.
    • 4093 – il client ha inviato la seconda richiesta ( WTF? )
    • 4094 – il client ha inviato un segnale di connessione chiuso.
    • 4095 – il server riconosce 4093.
    • 4096 – il server riconosce 4094.

    Ecco che il server non ha inviato alcuna risposta alla seconda richiesta. Secondo la terminazione di connessione TCP :

    Il lato che ha terminato non può più submit alcun dato alla connessione, ma l'altro lato può. Il lato di terminazione dovrebbe continuare a leggere i dati finché l'altro lato termina pure.

    La prossima domanda è perché 4093 è accaduto dopo che il cliente ha ricevuto un segnale di connessione vicino dal server?

    Probabilmente questa è la risposta :

    Vorrei dire che il POST accade contemporaneamente alla FIN, cioè il client ha inviato il POST poiché il suo stack TCP non ha ancora elaborato la FIN dal server. Si noti che la cattura dei pacchetti avviene prima che i dati vengano elaborati dal sistema.

    Non posso commentare questo perché non sono un esperto di networking. Forse qualcun altro può dare una risposta più approfondita per cui è stata inviata la seconda richiesta.

    UPD La domanda correlata precedentemente non è rilevante. Ha chiesto una domanda distinta sul problema.

    C'è una soluzione a questo problema?

    Come accennato alla mailing list :

    I client HTTP / 1.1 sono tenuti a gestire la connessione keepalive, quindi questo non dovrebbe essere un problema.

    Penso che dovrebbe essere gestito sul lato client. E se la connessione è chiusa dal server, il client deve aprire nuove connessioni e richiedere nuovamente la richiesta.

    Ho effettivamente bisogno di un bilanciatore di carico che posso aggiungere dynamicmente e rimuovere i server da esso, qualunque migliore soluzione che si adatta al mio problema?

    Non so di altri server, quindi non posso consigliare qui.

    Non appena i tuoi clienti possono gestire la connessione in modo corretto, non ci dovrebbe essere alcun motivo che impedisca di utilizzare la nginx.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.