Omówiliśmy kluczowe ustawienia Nginx, takie jak kompresja gzip, konfiguracja proxy_buffer, ustawienia procesów worker i keep-alive, które pozwalają zoptymalizować wydajność serwera WWW.
W szczególności podkreśliliśmy znaczenie kompresji gzip i buforowania proxy_buffer w celu zmniejszenia ilości przesyłanych danych i zminimalizowania obciążenia serwera, a także zarządzania połączeniami za pomocą ustawień procesów worker i keep-alive.
Zaprezentowaliśmy różne testy i wskazówki dotyczące wdrażania optymalnych ustawień dostosowanych do środowiska serwera oraz zapewnienia stabilnej pracy.
Nginx to open-source'owe oprogramowanie, często używane jako serwer WWW lub serwer proxy WWW.
Przy odpowiedniej konfiguracji może wydajnie dostarczać zawartość statyczną.
Chcę tutaj zapisać kilka kluczowych ustawień.
Kilka kluczowych ustawień związanych z wydajnością
1. Kompresja gzip
Podczas ładowania strony internetowej, pobieramy z serwera WWW wiele plików, takich jak JavaScript, obrazy, HTML i CSS.
Zamiast przesyłać te treści w oryginalnej postaci, możemy wykorzystać kompresję gzip, co znacznie zmniejszy ilość przesyłanych danych.
Oznacza to, że po zastosowaniu:
- Zmniejszy się ilość danych, co zaowocuje oszczędnością przepustowości.
- Można zaoszczędzić zasoby serwera.
- Z punktu widzenia użytkownika, rzeczywista prędkość ładowania wzrośnie.
Z drugiej strony, ponieważ serwer musi wykonać kompresję gzip przed wysłaniem odpowiedzi, może to prowadzić do wzrostu obciążenia procesora.
Przed zastosowaniem na poziomie produkcyjnym konieczne jest przeprowadzenie testów, aby określić, które typy plików mają być kompresowane, jaki poziom kompresji zastosować i jak duże pliki kompresować.
Poniżej przedstawiono kilka ustawień związanych z gzip.
gzip on; # Włącza kompresję gzip.
gzip_vary on; # Dodaje nagłówek Vary: Accept-Encoding.
gzip_proxied any; # Jeśli nginx jest używany jako serwer proxy, kompresuje odpowiedzi otrzymane od zaplecza. (kompresja żądań pośredniczących)
gzip_min_length 256; # Kompresuje tylko pliki o rozmiarze co najmniej 256 bajtów
gzip_comp_level 5; # Ustawia poziom kompresji od 1 do 9. Im wyższy poziom, tym większe zużycie procesora. Poziom 5 zapewnia około 50% kompresji.
gzip_types text/plain text/css text/xml application/json application/javascript;
// Ustawia typy zawartości do kompresji.
* gzip_vary instruuje, aby serwer wysyłał skompresowaną i nieskompresowaną wersję zawartości, odpowiednio, w zależności od tego, czy klient obsługuje gzip. (informuje, że w zależności od nagłówka żądania klienta (Accept-Encoding) może zostać dostarczona inna wersja zawartości).
2. Ustawienie proxy_buffer
Nginx buforuje odpowiedzi przed wysłaniem ich do klienta.
Gdy serwer WWW wysyła odpowiedź do klienta, a klient jest powolny, serwer musi czekać na wysłanie danych. (wąskie gardło sieci)
W tym czasie serwer zużywa zasoby, dlatego używamy bufora do tymczasowego przetwarzania odpowiedzi niezależnie od szybkości przetwarzania klienta. Dzięki temu uzyskujemy następujące korzyści:
- Optymalizacja obciążenia serwera
- Zmniejszenie wąskiego gardła sieci
location / {
proxy_pass adres_serwera;
# Ustawienia bufora proxy
proxy_buffering on; # Włącza buforowanie.proxy_buffer_size 4k; # Ustawia rozmiar bufora.(głównie nagłówki).proxy_buffers8 4k; # Liczba i rozmiar buforów dla każdego połączenia(8 buforów po 4 kB) proxy_busy_buffers_size 8k; # Maksymalny rozmiar bufora dostępny podczas wysyłania odpowiedzi do klienta
}
Uwaga: Zbyt duży rozmiar bufora może opóźnić przesyłanie strumieniowe tekstu w czasie rzeczywistym, dlatego konieczne są testy. Szczególnie w przypadku wielu nowych usług związanych z AI, jeśli strumieniowanie tekstu nie działa, należy sprawdzić to ustawienie.
3. Ustawienia worker i http
Procesy worker przetwarzają żądania klientów, a ich liczbę można skonfigurować dla każdego rdzenia procesora serwera.
HTTP to zazwyczaj żądanie - połączenie - odpowiedź - zamknięcie połączenia, ale aby zmniejszyć zasoby używane do nawiązywania połączeń dla wielu żądań, można utrzymywać połączenia klienta. Jest to ustawienie keep alive.
worker_processes auto; # Automatyczne ustawienie w zależności od liczby dostępnych rdzeni CPU
worker_connections 1024; # Liczba połączeń, które każdy proces worker może obsługiwać jednocześnie
# Ustawienia keep-alive
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
proxy_pass adres_serwera;
}
}
Powodem grupowania tych dwóch ustawień jest to, że:
Jeśli serwer ma 4 rdzenie, teoretycznie maksymalna liczba połączeń wynosi 1024 * 4 = 4096.
(Może być niedokładne w zależności od zasobów i warunków ruchu sieciowego)
Gdy 4096 klientów łączy się jednocześnie i zajmuje wszystkie keepalive przez 65 sekund,
4097. użytkownik próbujący się połączyć może napotkać opóźnienia w odpowiedzi, ponieważ nie będzie mógł nawiązać połączenia.
Zatem, zakładając stabilne zasoby serwera dzięki automatycznej skalowalności, jeśli występują opóźnienia w odpowiedzi podczas zdarzeń, powyższe ustawienia mogą mieć pośredni wpływ.
4. Inne - blok location
Niektóre ustawienia, takie jak bufor proxy, można zastosować do poszczególnych adresów URL żądań.
* Niektóre ustawienia, takie jak keep-alive, są stosowane na poziomie HTTP/serwera i nie można ich ustawiać dla poszczególnych bloków.
Powyższe ustawienia pozwalają na optymalizację wydajności sieci web. Po przeprowadzeniu testów z uwzględnieniem wielu przypadków testowych, zoptymalizuj wydajność serwera!
* Zmiany w konfiguracji nginx można zastosować bez przestojów serwera, więc w większości przypadków jest to bezpieczne.