Optymalna konfiguracja modułu Apache mod_http2 w celu uzyskania maksymalnej wydajności HTTP/2

Konfiguruję serwer Apache mod_http2 tak, aby wydajność HTTP/2 była od razu odczuwalna: prawidłowe negocjowanie protokołu, odpowiednie wątki MPM i poprawne ustawienia TLS. Dzięki jasnym wytycznym dotyczącym strumieni, rozmiarów okien i Keep-Alive uzyskuję stabilną Czasy ładowania ze stron o dużej liczbie odwiedzin.

Punkty centralne

  • Wydarzenie MPM wdrożyć i odpowiednio skonfigurować Keep-Alive
  • Protokoły h2 http/1.1 z opcją ProtocolsHonorOrder włączoną
  • H2WindowSize umiarkowanie zwiększać i ograniczać strumienie
  • Pracownik sterować za pomocą H2MinWorkers/H2MaxWorkers
  • TLS/ALPN optymalizacja i udoskonalenie rejestrowania

Włączanie mod_http2: podstawy i wymagania wstępne

Zaczynam od aktywacji mod_http2 oraz negocjacji protokołu. Moduł jest ładowany za pomocą funkcji LoadModule, a następnie ustawiam opcję „Protocols h2 http/1.1”, aby protokół HTTP/2 miał pierwszeństwo, a HTTP/1.1 był nadal oferowany. W przypadku wdrożenia produkcyjnego sprawdzam poprawność TLS, aktualne zestawy szyfrów oraz wyłączone starsze wersje, takie jak SSLv2/SSLv3. Bez prawidłowo skonfigurowanego TLS i ALPN nowoczesne przeglądarki nie wykorzystują w pełni możliwości protokołu. W przypadku dużej liczby jednoczesnych połączeń planuję z wyprzedzeniem zastosowanie MPM, ponieważ prefork znacznie spowalnia HTTP/2.

LoadModule http2_module modules/mod_http2.so
Protocols h2 http/1.1

Prawidłowe włączenie protokołu HTTP/2 w VirtualHostach

Włączam protokół HTTP/2 tylko w vHost na porcie 443 i ustalam stałą kolejność. W ten sposób wymuszam, aby Apache najpierw oferował protokół HTTP/2, a dopiero w razie potrzeby przechodził na HTTP/1.1. Szybki test za pomocą Curl potwierdza to zachowanie komunikatem „HTTP/2 200“. Dyrektywa Protokoły, Odznaczenia, Ordery Ustawiam opcję na „On”, aby kolejność protokołów była wiążąca. W ten sposób uzyskuję przejrzystą i przewidywalną kolejność dostarczania danych dla każdego hosta.

Protocols h2 http/1.1
  ProtocolsHonorOrder On
  SSLEngine on
  # certyfikaty, szyfry, OCSP itp.

Precyzyjne dostrojenie opcji MPM i Keep-Alive

Aby zapewnić wysoką równoczesność, stawiam na mpm_event, ponieważ wątki i zdarzenia efektywnie obsługują dużą liczbę połączeń. Wartości parametrów StartServers, ThreadsPerChild i MaxRequestWorkers dobieram w oparciu o dostępną pamięć RAM, aby uniknąć ryzyka wyładowania pamięci. W przypadku HTTP/2 zwiększam wartość KeepAliveTimeout, aby trwałe połączenia miały wystarczająco dużo czasu na obsługę kilku żądań. Jednocześnie ograniczam wartość MaxKeepAliveRequests, aby cyklicznie zwalniać zasoby. Osoby, które chcą pogłębić swoją wiedzę na temat różnic między modułami MPM, znajdą szczegółowe informacje w mojej notatce dotyczącej event vs worker MPM, który w praktyczny sposób ułatwia wybór.

Strumienie, multipleksowanie i kontrola przepływu

Steruję równoległymi Strumienie za pomocą H2MaxSessionStreams i zapobiegam sytuacji, w której klient zajmuje zbyt wiele zasobów. Wartości z przedziału od 100 do 200 często sprawdzają się dobrze, w zależności od liczby zasobów i zachowania serwera. Aby zwiększyć przepustowość, dostosowuję parametr H2WindowSize i umiarkowanie powiększam okno strumienia, często do 256 KB. W ten sposób ograniczam liczbę aktualizacji okna bez nadmiernego obciążania pamięci. Jeśli chcesz zrozumieć, jak to działa, zapoznaj się z moim artykułem na temat Multipleksowanie HTTP/2, który w przystępny sposób wyjaśnia priorytety i przeszkody.

Wątki robocze, limity czasu i push

Dimensionuję H2MinWorkers oraz H2MaxWorkers dostosowane do sprzętu i MPM, aby szczyty obciążenia nie powodowały szczytów opóźnień. Dodatkowo ustawiam H2Timeout i H2KeepAliveTimeout tak, aby zawieszone sesje nie zajmowały zasobów niepotrzebnie długo. Dyrektywę H2Direct pomijam w witrynach publicznych, ponieważ h2c z Prior Knowledge nie odgrywa tam praktycznie żadnej roli. Jeśli chodzi o funkcję Push, zachowuję ostrożność i włączam H2Push dopiero po przeprowadzeniu dokładnych pomiarów. W wielu konfiguracjach niezawodniejsze wyniki zapewniają prawidłowe buforowanie, krytyczne pliki CSS oraz skrypty asynchroniczne. Przyspieszenie.

Prawidłowe skonfigurowanie TLS, ALPN i zestawów szyfrów

Włączam TLS tylko w vHoste HTTPS i usuwam stare Protokoły Konsekwentnie. Aby zapewnić sprawny przebieg negocjacji, korzystam z ALPN, dzięki czemu klient przechodzi bezpośrednio na HTTP/2 bez dodatkowych rund. Krótki łańcuch certyfikatów, OCSP-Stapling i wznowienie sesji zmniejszają obciążenie podczas uzgadniania połączenia. W ten sposób oszczędzam milisekundy, co ma zauważalny wpływ na czas ładowania i przepustowość. Więcej szczegółów przedstawiam w moim przewodniku po ALPN i HTTP/2 razem, aby wybór szyfrów i opcji był precyzyjny.

Rejestrowanie, testy i diagnostyka błędów

Podbijam LogLevel W przypadku protokołu HTTP/2 najpierw przechodzę do sekcji „info”, aby obserwować nawiązywanie połączenia, strumienie i kontrolę przepływu. W ten sposób wcześnie wykrywam wąskie gardła i mogę stopniowo dostosowywać wartości. Za pomocą curl sprawdzam nagłówki, protokół i odpowiedzi serwera bezpośrednio z konsoli. W testach obciążeniowych mierzę czasy odpowiedzi, przepustowość i wskaźniki błędów oddzielnie dla tras statycznych i dynamicznych. Każdą zmianę popieram danymi pomiarowymi, aby optymalizacje przynosiły niezawodne efekty.

LogLevel http2:info


Krótki test #:
# curl -v --http2 -I https://example.com/

Przykład: Zwięzła konfiguracja HTTP/2

Pokażę jedną Konfiguracja, która sprawdziła się w wielu projektach i zapewnia dobry punkt wyjścia. Event-MPM obsługuje wiele jednoczesnych połączeń bez przeciążania procesów. Dyrektywy HTTP/2 ograniczają strumienie, umiarkowanie zwiększają okno i zapewniają wystarczającą liczbę procesów roboczych. Keep-Alive pozostaje ustawione na wysoką wartość, ale MaxKeepAliveRequests zapewnia cykliczne zwalnianie połączeń. Precyzyjne dostrojenie zależy od pamięci RAM, procesora, stosu aplikacji i profilu ruchu, dlatego po każdej zmianie ponownie przeprowadzam pomiary.

Zdarzenie # MPM

  StartServers 2
  MinSpareThreads 25
  MaxSpareThreads 75
  ThreadsPerChild 25
  MaxRequestWorkers    150
  MaxConnectionsPerChild 1000


Jądro # HTTP/2
Protocols h2 http/1.1
ProtocolsHonorOrder On

Optymalizacja mod_http2 w #
H2MaxSessionStreams   150
H2WindowSize 262144
H2MinWorkers 10
H2MaxWorkers 75
H2KeepAliveTimeout    30
H2Timeout 60
# Wyłącz H2Push   # pozostaw opcjonalnie

# TLS (przykład)
SSLProtocol all -SSLv2 -SSLv3
# Wybierz zestaw szyfrów SSL (SSLCipherSuite) nowoczesny i zgodny z przeglądarkami
# Włącz OCSP Stapling / wznowienie sesji

Tabela wartości orientacyjnych dotyczących optymalizacji mod_http2

Korzystam z tego Wartości standardowe jako punkt wyjścia i dostosowuję je na podstawie pomiarów ruchu, sprzętu i aplikacji. Tabela zawiera typowe wartości początkowe oraz zalecane przedziały. Zbyt duże okna lub liczba strumieni obciążają pamięć RAM, a zbyt małe ograniczają przepustowość. Sztuka polega na zharmonizowaniu tych parametrów z ustawieniem MaxRequestWorkers i wydajnością backendu. Testuję każdy poziom osobno, aby wyraźnie dostrzec związek przyczynowo-skutkowy.

Wytyczna/Ustawienie wartość początkowa Zakres regulacji Wskazówka
H2MaxSessionStreams 100 120–200 Nie więcej niż pozwala na to budżet przeznaczony na pracowników
H2WindowSize 65535 B 256 KB – 1 MB Większy = mniej aktualizacji systemu Windows, ale więcej pamięci RAM
H2MinWorkers 10 10–25 Małe systemy zapewniają obciążenie podstawowe
H2MaxWorkers 50 50–75+ Amortyzowanie szczytów obciążenia, monitorowanie pamięci RAM
KeepAliveTimeout 15 s 20–30 s Protokół HTTP/2 czerpie korzyści z dłuższych połączeń
MaxKeepAliveRequests 100 100–500 Regularne udostępnianie zasobów
Wydarzenie MPM: MaxRequestWorkers 150 150–300 Obliczać z uwzględnieniem budżetu pamięci RAM

Realistyczne testy obciążeniowe i strategia pomiarowa

Sprawdzam Czasy reakcji oddzielnie dla HTML, zasobów statycznych i dynamicznych tras API. Następnie oceniam przepustowość i wskaźniki błędów przy rosnącej liczbie jednoczesnych połączeń, aby zidentyfikować punkty krytyczne. Potem stopniowo dostosowuję H2WindowSize, strumienie i Keep-Alive oraz porównuję wyniki testów A/B. Ponadto monitoruję obciążenie procesora, pamięć RAM, sieć oraz czasy uzgadniania TLS, aby żadne przesunięcie wąskiego gardła nie pozostało niezauważone. W ten sposób uzyskuję konfigurację dostosowaną do aplikacji i zapewniającą rezerwy na okresy szczytowego obciążenia.

Uwzględnienie kwestii infrastruktury i konfiguracji hostingu

Stawiam na aktualne Apacz-aktualne wersje oprogramowania, zadbany stos TLS oraz wydajny sprzęt, dzięki czemu optymalizacje przynoszą efekty. W przypadku dużych sklepów i portali opartych na WordPressie warto wybrać dostawcę, który standardowo oferuje moduł Event-MPM, protokół HTTP/2 oraz sprawną obsługę certyfikatów. W testach porównawczych webhoster.de okazał się niezawodnym dostawcą takich konfiguracji. Łączę tam nowoczesne konfiguracje z fachowym wsparciem technicznym. Ta podstawa pozwala mi szybciej testować wartości orientacyjne i płynnie wdrażać je do działania.

HTTP/2 za modułami równoważenia obciążenia i jako serwer proxy odwrotny

Sprawdzam, czy przed serwerem Apache znajduje się plik Load balancer lub zakończone przez CDN. Najważniejsze jest, aby protokół ALPN został poprawnie wynegocjowany, a HTTP/2 pozostawał aktywny aż do krawędzi sieci. Po zakończeniu połączenia TLS serwer Apache działający jako backend nadal widzi tylko HTTP/1.1 – nie stanowi to problemu, o ile klient jest obsługiwany przez h2 aż do krawędzi sieci. Jeśli sam uruchamiam serwer Apache jako Odwrotne proxy w przypadku serwerów upstream (np. serwerów aplikacji), świadomie decyduję, czy chcę również korzystać z protokołu HTTP/2 do Korzystam z backendu. W przypadku wielu backendów protokół HTTP/1.1 jest wystarczająco stabilny i łatwy do zmierzenia; w przypadku usług o dużym opóźnieniu lub odległych protokół HTTP/2 może zmniejszyć opóźnienie w kierunku upstream dzięki multipleksowaniu. Ważne jest, aby odpowiednio zbilansować budżety współbieżności między frontendem, warstwą proxy a backendem, w przeciwnym razie wąskie gardło przeniesie się po prostu o jeden poziom dalej.

PHP-FPM, serwer aplikacji i limity współbieżności

Głosuję MaxRequestWorkers w serwerze Apache zależy od liczby procesów/wątków w warstwie aplikacji (np. pm.max_children w przypadku PHP-FPM, liczba workerów w przypadku Node/Java). HTTP/2 może otwierać wiele równoczesnych strumieni na jedno połączenie. Jeśli serwer WWW przyjmuje znacznie więcej równoczesnych żądań, niż backend jest w stanie przetworzyć równolegle, wydłużają się kolejki i wzrastają opóźnienia. Dlatego dostosowuję wartości H2MaxSessionStreams, MaxRequestWorkers oraz liczbę pracowników backendowych w taki sposób, aby korzyści wynikające z multipleksowania nie zostały zniwelowane przez blokowanie backendowe. W przypadku stron dynamicznych ustalam sztywny limit górny, natomiast zasoby statyczne agresywnie obsługuję z pamięci podręcznej.

Ekonomia nagłówków, HPACK i strategia zarządzania zasobami

HTTP/2 kompresuje nagłówki za pomocą HPACK. Niemniej jednak duże nagłówki plików cookie, rozbudowane ciągi znaków User-Agent lub wiele zbędnych niestandardowych nagłówków obciążają procesor i pamięć. Oczyszczam pliki cookie, ograniczam liczbę domen i subdomen z nagłówkiem Set-Cookie oraz grupuję tylko to, co jest naprawdę potrzebne. Po stronie dostarczania ustawiam poprawne nagłówki pamięci podręcznej, ETags lub Last-Modified oraz jasną wersjonowanie zasobów. W protokole HTTP/2 podchodzę z dystansem do shardingu domen i sztucznego grupowania: dzięki multipleksowaniu wiele małych plików nie stanowi już problemu – o ile backend nadąża. Zwracam uwagę na zachowanie równowagi: zbyt duża liczba żądań na stronę zwiększa obciążenie związane z planowaniem; zbyt duże pakiety zmniejszają liczbę trafień w pamięci podręcznej i blokują renderowanie.

Kompresja, rozmiary i formaty odpowiedzi

W przypadku zasobów tekstowych korzystam z wydajnych Kompresja (gzip lub brotli) i zwracam uwagę na rozsądne minimalne rozmiary, aby nie kompresować każdego najmniejszej pliku. W protokole HTTP/2 skompresowane, niewielkie zasoby zachowują wysoką wydajność, ponieważ są przesyłane równolegle. Jednocześnie minimalizuję zbyt duże odpowiedzi HTML, ponieważ mają one decydujący wpływ na czas pierwszego bajtu. Obrazy dostarczam w odpowiednich formatach i rozmiarach; unikam niepotrzebnego ponownego kodowania lub konwersji po stronie serwera bezpośrednio w ścieżce żądania, aby wygładzić skoki obciążenia procesora.

Eksploatacja, limity i planowanie zasobów

Planuję wystarczająco Deskryptory plików oraz limity procesów, aby duża liczba jednoczesnych połączeń nie napotykała ograniczeń ulimit. Moduł Event-MPM skutecznie utrzymuje otwarte połączenia, jednak każde z nich zajmuje pewną ilość pamięci. Suma wartości MaxRequestWorkers, okna Keep-Alive i H2MaxSessionStreams ustalam w taki sposób, aby cały system nie przechodził w tryb swapowania podczas szczytów obciążenia. W przypadku wdrożeń typu rolling deploy stawiam na wdzięczny Odświeżanie; parametr `MaxConnectionsPerChild` zapewnia aktualność procesów i zapobiega stopniowemu powstawaniu wycieków. Regularnie mierzę zajmowaną pamięć sterty przez procesy robocze i odpowiednio dostosowuję czas ich działania.

Przykłady usterek z praktyki i ukierunkowana diagnostyka

Znam typowe Błędy HTTP/2: Duża liczba ramek GOAWAY wskazuje na przerwy w połączeniu lub twarde limity. Częste występowanie ramek RST_STREAM może wskazywać na przekroczenie limitu czasu, przerwanie żądania przez klienta lub błędy po stronie dostawcy. Jeśli podczas testów obciążeniowych coraz częściej pojawiają się kody 4xx/5xx, najpierw sprawdzam serwery backendowe i bazy danych, zanim zacznę modyfikować ustawienia okna lub strumieni. W celu diagnozy tymczasowo podnoszę poziom logowania http2 do debug, izoluję ścieżki o nietypowym zachowaniu i dokonuję pomiarów za pomocą narzędzi obsługujących protokół h2. Ważne: Zmieniam zawsze tylko a Śruba regulacyjna na każdy przebieg testowy, aby przyczyna i skutek pozostały przejrzyste.

Wczesne wskazówki, motywowanie i ustalanie priorytetów w codziennej pracy

Polegam na Wczesne wskazówki (103) jako prostą metodę wstępnego ładowania, zanim rozważę zastosowanie funkcji HTTP/2 Push. Funkcja Early Hints zapewnia przeglądarce przewagę w ładowaniu kluczowych zasobów bez konieczności ich trwałego duplikowania. Funkcja „Push” pozostaje ukierunkowana i oparta na pomiarach, na przykład w przypadku bardzo małych, niezmiennych fragmentów kodu CSS lub czcionek, o ile korzyści są potwierdzone wskaźnikami. Jeśli chodzi o ustalanie priorytetów, polegam przede wszystkim na prawidłowej kolejności elementów HTML, wskazówkach dotyczących wstępnego ładowania oraz jasnej strategii ścieżki krytycznej aplikacji – takie podejście doskonale współgra z nowoczesnymi przeglądarkami.

Limity czasu, ponowne próby i komfort użytkowania

Kalibruję Limity czasu tak, aby legalni, ale wolni klienci nie byli zbyt wcześnie odłączani, podczas gdy zawieszone strumienie są szybko usuwane. Parametry H2Timeout i H2KeepAliveTimeout uzupełniam odpowiednimi limitami czasu na serwerze proxy i backendzie, aby uniknąć sprzecznych kryteriów przerywania połączeń. Podczas optymalizacji zwracam uwagę, aby ponowne próby (po stronie klienta lub serwera proxy) nie powodowały efektu kaskadowego – w przeciwnym razie przyniesie to więcej obciążenia niż korzyści. Celem są mierzalne, dobre czasy ładowania, a nie maksymalna surowa współbieżność za wszelką cenę.

Bezpieczeństwo, dopracowanie protokołu TLS i stabilność

Uważam, że stos TLS szczupły: krótkie łańcuchy, OCSP z możliwością nakładania, wznowienie sesji oraz nowoczesne algorytmy szyfrujące z ECDHE. Renegocjacja jest wykluczona, a rozmiary nagłówków celowo ograniczam (np. w przypadku plików cookie). Przekłada się to na stabilność i przewidywalność, ponieważ minimalizuję obciążenie związane z uzgodnieniem połączenia. Aby spełnić wymogi zgodności, planuję czas życia biletów, pamięć podręczną sesji i zestawy szyfrów w taki sposób, aby zapewnić rozsądną równowagę między bezpieczeństwem a wydajnością. Zmiany popieram danymi pomiarowymi uzyskanymi u docelowych klientów, a nie tylko w warunkach laboratoryjnych.

Monitorowanie, wskaźniki i ciągła optymalizacja

Obserwuję, co się dzieje w zakładzie Udział h2, rozkłady opóźnień (p50/p95/p99), wskaźniki błędów, otwarte połączenia oraz zużycie pamięci RAM na proces. Mod_status i zewnętrzne wskaźniki pokazują, czy okna Keep-Alive i strumienie są odpowiednio skalowane. Jeśli opóźnienia p95 ulegają odchyleniom, najpierw sprawdzam backend i ścieżki sieciowe, a dopiero potem okna/strumienie. Dodatkowo sprawdzam czasy uzgadniania TLS; jeśli rosną, przyczyna często leży przed serwerem Apache (stan certyfikatu, entropia, kryptografia sprzętowa). Dzięki temu cyklowi informacji zwrotnej utrzymuję konfigurację zbliżoną do rzeczywistych warunków i dostosowuję ją do wzorców ruchu oraz nowych wersji oprogramowania.

Kwestie związane z aktualizacją i kompatybilnością

Planuję Regularne aktualizacje Apache i mod_http2, ponieważ poprawę stabilności, kontroli przepływu i obsługi błędów można bezpośrednio zmierzyć. Przed aktualizacją przeprowadzam testy pod obciążeniem przy użyciu reprezentatywnych danych i porównuję krzywe z danymi produkcyjnymi. W przypadku zróżnicowanej populacji klientów (starsze przeglądarki, boty, urządzenia) celowo pozostawiam HTTP/1.1 jako opcję rezerwową, sprawdzam jednak, czy boty nie nawiązują nadmiernej liczby połączeń, angażując w ten sposób procesy robocze. W takich przypadkach ustalam limity lub segreguję ruch, aby prawdziwi użytkownicy Mają pierwszeństwo.

Ścieżka skalowania i modele operacyjne

Definiuję ścieżka skalowania: w pionie (więcej pamięci RAM/procesora, większe pule workerów) lub w poziomie (więcej frontendów za load balancerem). HTTP/2 dobrze skaluje się w poziomie, o ile nie jest wymagana afynicja sesji. W przypadku komponentów stanowych (np. sesji po stronie serwera) planuję, ile równoległych strumieni na węzeł jest sensowne i czy naprawdę potrzebuję sesji przypisanych (sticky sessions). W ten sposób unikam sytuacji, w której jeden węzeł jest nadmiernie obciążony zbyt dużą liczbą długotrwałych strumieni, podczas gdy inne pozostają niewykorzystane.

Moje krótkie podsumowanie

Aktywuję HTTP/2 W vHost należy wybrać Event-MPM, zwiększyć wartość Keep-Alive i precyzyjnie skonfigurować protokoły. Następnie dostosowuję strumienie, rozmiary okien i liczbę procesów roboczych tak, aby pamięć RAM i procesor działały w równowadze. TLS z ALPN, krótkimi łańcuchami i wznowieniem połączeń pozwala zaoszczędzić cenne milisekundy podczas nawiązywania połączenia. Rejestrowanie danych w http2:info oraz systematyczne testy obciążeniowe pozwalają w sposób przejrzysty udokumentować każdą zmianę. W ten sposób wydajność rośnie krok po kroku, a użytkownicy mogą cieszyć się szybkim działaniem stron bez żadnych zakłóceń.

Artykuły bieżące