Apache vs nginx: czym się różnią i jak przetłumaczyć konfigurację
Apache vs nginx
Apache vs nginx: procesy, .htaccess i tłumaczenie konfiguracji | We.Inc
Apache vs nginx porównane pod kątem obsługi połączeń, plików .htaccess dla katalogów kontra centralnej konfiguracji, przeładowań i proxy, z translatorem popularnych reguł rewrite.
Oba to dojrzałe serwery WWW open source. Apache ładuje moduły do wybranego modelu procesów (prefork, worker lub event) i pozwala każdemu katalogowi nadpisywać ustawienia plikami .htaccess. nginx uruchamia jeden proces master i kilka workerów opartych na zdarzeniach, czyta tylko swoją centralną konfigurację i często stoi przed serwerami aplikacji jako reverse proxy.
Apache i nginx obok siebie
Temat
Apache httpd 2.4
Obsługa połączeń
Wybierz MPM: prefork, worker lub event (event to zwykle domyślny wybór na nowoczesnym Uniksie)
Jeden proces master plus procesy worker działające w modelu opartym na zdarzeniach
Konfiguracja per katalog
Pliki .htaccess, jeśli pozwala na to AllowOverride (domyślnie None)
Brak: wszystko znajduje się w głównych plikach konfiguracyjnych
upstream: round robin, least_conn, ip_hash, hash, random
Test i przeładowanie
apachectl configtest, potem apachectl graceful
nginx -t, potem nginx -s reload
Wybór między nimi sprowadza się głównie do tego, gdzie żyje konfiguracja i kto może ją zmieniać. Ta strona pomija deklaracje z benchmarków, które całkowicie zależą od obciążenia i strojenia, i skupia się na różnicach, z którymi spotykasz się przy prowadzeniu strony: jak każdy serwer obsługuje połączenia, po co istnieje .htaccess i jak przetłumaczyć reguły rewrite, które już masz. Użyj translatora, aby zobaczyć wersję nginx znanej reguły Apache.
Wybierz zadanie w translatorze, na przykład wymuszenie HTTPS albo kierowanie każdej nieznanej ścieżki do index.html.
Wpisz własną domenę, aby obie wersje były gotowe do wklejenia.
Wstaw wersję Apache do virtual hosta lub .htaccess, a wersję nginx do odpowiedniego bloku server.
Przetestuj przed przeładowaniem: apachectl configtest dla Apache, nginx -t dla nginx.
W Apache, jeśli kontrolujesz maszynę, wybieraj główną konfigurację serwera zamiast .htaccess. Dokumentacja Apache mówi to wprost, bo zezwolenie na .htaccess sprawia, że httpd szuka tego pliku w każdym katalogu na ścieżce każdego żądania.
W nginx blok if sprawdzający host prawie zawsze lepiej zapisać jako osobny blok server z return 301.
Zastąp łańcuchy sprawdzeń plików RewriteCond jedną linią try_files; nginx sprawdza wymienione ścieżki po kolei.
Pamiętaj, że linie add_header w nginx nie są dziedziczone do bloku, który definiuje własne add_header. Powtarzaj nagłówki bezpieczeństwa w każdym location, które ustawia jakikolwiek nagłówek.
Uruchamianie obu jest częste: nginx na brzegu obsługuje TLS i pliki statyczne, przekazując dynamiczne żądania do Apache na lokalnym porcie.
Najczęściej zadawane pytania
Czy nginx jest szybszy niż Apache?
To zależy od zadania i strojenia, więc uważaj na każdą pojedynczą liczbę. Workery nginx oparte na zdarzeniach są zaprojektowane tak, by tanio utrzymywać wiele bezczynnych połączeń. MPM event w Apache zmniejszył tę różnicę, również korzystając z bezpiecznego wątkowo pollingu. Zmierz własne obciążenie, zanim zmienisz serwer wyłącznie dla szybkości.
Czy nginx obsługuje pliki .htaccess?
Nie. nginx nie ma plików nadpisujących ustawienia per katalog, więc reguły z .htaccess trzeba przenieść do konfiguracji serwera i przeładować nginx. To świadomy kompromis: brak wyszukiwania plików przy każdym żądaniu, ale reguły mogą zmieniać tylko osoby z dostępem do głównej konfiguracji.
Czy mogę automatycznie przekonwertować .htaccess na nginx?
Proste przekierowania i fallbacki tłumaczą się czysto, co pokazuje translator na tej stronie. Długie łańcuchy RewriteCond z flagami takimi jak [P] lub zmiennymi środowiskowymi musi przeczytać człowiek, bo nginx wyraża ten sam zamiar innymi elementami.
Który wybrać dla strony WordPress lub PHP?
Jeśli hosting daje Ci tylko dostęp do plików, to Apache z .htaccess w ogóle pozwala zmieniać reguły. Na serwerze, który kontrolujesz, oba działają z PHP-FPM; w nginx fallback dla ładnych adresów URL piszesz raz, przez try_files w bloku server.
Jak przeładować konfigurację bez zrywania połączeń?
W nginx uruchom nginx -s reload: master sprawdza nową konfigurację, uruchamia nowe workery i prosi stare o łagodne zakończenie pracy. W Apache apachectl graceful robi to samo dla jego procesów potomnych.
Modele procesów w prostych słowach
Apache przekazuje obsługę połączeń do modułu Multi-Processing Module. prefork używa jednego procesu na połączenie i nie potrzebuje wątków. worker uruchamia kilka procesów z wieloma wątkami każdy. event bazuje na worker i używa bezpiecznego wątkowo pollingu, aby bezczynne połączenia keep-alive nie blokowały wątku. Na obecnych systemach Linux i BSD domyślnie wybierany jest event.
nginx ma jeden proces master, który czyta konfigurację i zarządza workerami, oraz niewielką liczbę procesów worker, z których każdy obsługuje wiele połączeń przez pętlę zdarzeń.
Dlaczego .htaccess ma znaczenie
.htaccess pozwala osobie bez dostępu root zmieniać reguły dla jednego katalogu, dlatego hostingi współdzielone na nim polegają. Ceną jest to, że przy każdym żądaniu Apache sprawdza, czy plik istnieje w każdym katalogu nadrzędnym, nawet gdy go nie ma. Przy AllowOverride None, co jest ustawieniem domyślnym, te pliki są całkowicie ignorowane.
Ta sama strona w obu serwerach
Virtual host w Apache
Pliki statyczne z jednego folderu plus fallback dla SPA, skonfigurowane w vhoście, więc .htaccess nie jest potrzebny.
Blok server w nginx
To samo zachowanie: folder root, fallback przez try_files i własna strona błędu.
Wymuś HTTPS
Apache sprawdza flagę HTTPS; nginx używa osobnego serwera na porcie 80, który tylko przekierowuje.
Przekieruj domenę bez www na www
Dokumentacja nginx zaleca osobny blok server z return zamiast if na hoście.
Fallback dla aplikacji single-page
Serwuj prawdziwe pliki, gdy istnieją, a index.html dla każdej innej ścieżki.
Przekieruj jedną starą stronę
Redirect z mod_alias nie potrzebuje silnika rewrite; nginx dopasowuje dokładną ścieżkę przez location =.
Własna strona 404
Oba kierują błąd na stronę w tej samej witrynie.
Proxy /api do serwera aplikacji
Apache wymaga załadowanych mod_proxy i mod_proxy_http oraz zgodnych końcowych ukośników w obu argumentach; proxy w nginx jest wbudowane.
Blokuj ukryte pliki, takie jak .git
Uniemożliwia serwowanie plików, których nazwy zaczynają się od kropki.
Dodaj nagłówek bezpieczeństwa
Z always oba serwery dodają nagłówek także do odpowiedzi z błędem, nie tylko do udanych.