[Nginx] Πώς να νικήσετε το answer_status = 0

Ένα άρθρο από την κατηγορία των “sidenotes”.

TL: DR:

http2_max_field_size 8k; # всех спасет!

Σε ένα από τα έργα, αφού άλλαξα κάποια εσωτερική λογική του backend, άρχισα να παρατηρώ έναν περίεργο answer_code στα αρχεία καταγραφής, δηλαδή 0. Στα αρχεία καταγραφής μοιάζει κάπως έτσι:

{
  "timestamp": "2020-01-17T08:41:51+00:00",
  "remote_addr": "zzz.zzz.zzz.zzz",
  "request_time": 0,
  "upstream_response_time": "",
  "upstream_header_time": "",
  "http_accept_language": "-language",
  "response_status": 0,
  "request": "",
  "host": "example.com",
  "upstream_addr": "",
  "http_referrer": "",
  "request_length": 5854,
  "bytes_sent": 0,
  "http_user_agent": ""
}


Η ανάγνωση της τεκμηρίωσης και το γκουγκλάρισμα σε αυτό το θέμα δεν απέδωσε απολύτως τίποτα - γιατί... Αναφέρεται ότι αυτή η συμπεριφορά παρουσιάζεται όταν ο πελάτης έκλεισε τη σύνδεση χωρίς να περάσει τις κεφαλίδες. Λοιπόν, και διάφορα εξωτικά πράγματα με το μέγεθος buffer για το wsgi_, που στην περίπτωσή μας δεν ταίριαζε στη λέξη "με κανέναν τρόπο".

Γενικά, αποφασίσαμε ότι το πρόβλημα δεν είναι πρόβλημα, λαμβάνοντας υπόψη το γεγονός ότι στους τόμους μας δεν είναι καθόλου κρίσιμο.

Ακριβώς μέχρι να προβληματιστώ από το εξής πρόβλημα: σε ορισμένες περιπτώσεις, οι σύνδεσμοι ανοίγουν χωρίς προβλήματα μέσω http, αλλά αρνούνται εντελώς να εργαστούν μέσω https, δημιουργώντας το υπέροχο: Η σύνδεση #0 στον κεντρικό υπολογιστή example.com έμεινε ανέπαφη
curl: (52) Κενή απάντηση από τον διακομιστή

Στα αρχεία καταγραφής, μπορέσαμε να παρακολουθήσουμε αυτό το πράγμα μόνο μέσω IP - δεν υπήρχε αίτημα ή άλλα δεδομένα, όπως φαίνεται από το παραπάνω παράδειγμα. Μόνο το notorious status είναι 0, αλλά ξέρω ότι δεν διέκοψα το αίτημα! Άρχισα να καταλαβαίνω τι μπορεί να πάει στραβά. Και όλα αποδείχθηκαν πολύ απλά:

ακούστε το 443 ssl http2 backlog=8192;

Λοιπόν, εάν χρησιμοποιείτε το http2 για συνδέσεις ssl, τότε δεν αρκεί μόνο να ρυθμίσετε τις παραμέτρους των buffer αιτημάτων, αλλά πρέπει επίσης να ρυθμιστούν στο ngx_http_v2_module, δηλαδή:

Синтаксис:	http2_max_field_size размер;
Умолчание:	http2_max_field_size 4k;
Контекст:	http, server

Περιορίζει το μέγιστο μέγεθος μιας κεφαλίδας αιτήματος που συμπιέζεται με χρήση HPACK. Ο περιορισμός ισχύει εξίσου τόσο για το όνομα όσο και για την τιμή. Εάν χρησιμοποιείται κωδικοποίηση Huffman, το πραγματικό μέγεθος των συμβολοσειρών ονομάτων και τιμών που δεν έχουν συσκευαστεί μπορεί να είναι μεγαλύτερο. Το προεπιλεγμένο όριο είναι κατάλληλο για τα περισσότερα ερωτήματα.

Σε γενικές γραμμές, αυτό είναι. Και γιατί όλα; Επειδή το μήκος του συνδέσμου ήταν μεγάλο - μεγαλύτερο από τα ίδια 4k.

Ρυθμίζοντας το, για παράδειγμα, στα 8kb (ή όσο είναι πιθανό να είναι αρκετό), λύνουμε το πρόβλημα.
Τέτοια πράγματα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο