Konfigurowanie wydajnego serwera WWW na NGINX + PHP-FPM

PHP-FPM (Fast Process Manager) - Jest to osobna implementacja modułu obsługi FastCGI do wykonywania skryptów PHP. Opierając się na pakiecie serwera WWW NGINX (który obsługuje statykę) i PHP-FPM, możesz zbudować szybszy i szybszy serwer WWW dla swoich projektów internetowych w porównaniu do klasycznego pakietu NGINX, Apache i modułu mod_php (stos LAMP).

Lemp - Zestaw oprogramowania typu open source, które zazwyczaj instaluje się razem, aby działało na serwerze w celu hostowania stron internetowych i aplikacji internetowych. Ten skrót odnosi się do zestawu systemu operacyjnego Linux z serwerem WWW Nginx (zastępuje Apacz w bardziej powszechnym stosie Lampa), z bazą danych MySQL (MariaDB) oraz c php do przetwarzania danych dynamicznych.

W tym artykule rozważymy instalację i optymalizację stosu LEMP w celu hostowania załadowanego projektu internetowego na serwerze z CentOS 7 opartym na pakiecie NGINX + PHP-FPM + MariaDB / MySQL + i zainstalowaniu certyfikatu Let's Encrypt dla strony SSL .

Treść

  • Połączenie z repozytorium, aktualizacja serwera
  • Instalowanie i konfigurowanie serwera WWW Nginx
  • Zainstaluj php-fpm i dodatkowe moduły php
  • Zainstaluj Let's Encrypt i podłącz certyfikat
  • Zainstaluj MySQL / MariaDB na serwerze WWW
  • Konfigurowanie Nginx i PHP-FPM dla projektów o dużym obciążeniu

Połączenie z repozytorium, aktualizacja serwera

Ponieważ instalacja odbywa się na nowo zainstalowanym serwerze z CentOS, musisz podłączyć popularne repozytorium EPEL i zaktualizować wszystkie pakiety na serwerze.

# yum zainstaluj epel-release -y
# yum update -y

Repozytorium zostało zainstalowane, ale nie znaleziono pakietów aktualizacji, ponieważ został zainstalowany nowy obraz CentOS.

Instalowanie i konfigurowanie serwera WWW Nginx

Aby zainstalować najnowszą wersję Nginx, połącz repozytorium programistów, uruchamiając polecenie:

# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Lub tworząc plik konfiguracyjny repozytorium /etc/yum.repos.d/nginx.repo o następującej treści:

[nginx] name = nginx repo baseurl = http: //nginx.org/packages/centos/7/$basearch/ gpgcheck = 0 włączone = 1 

Jeśli używasz CentOS 8, zmień wersję w adresie URL.

Zainstaluj pakiet serwera WWW Nginx przy użyciu menedżera pakietów yum (lub dnf):

# yum zainstaluj nginx -y

Teraz możesz biegać nginx i dodaj go do uruchamiania za pomocą systemctl:

# systemctl start nginx
# systemctl enable nginx

Utworzono dowiązanie symboliczne z /etc/systemd/system/multi-user.target.wants/nginx.service do /usr/lib/systemd/system/nginx.service.

Aby sprawdzić, czy serwer WWW działa, otwórz adres IP serwera w przeglądarce.

Jeśli strona testowa nie otwiera się, sprawdź ustawienia dozwolonych usług, portów, stref w zaporze ogniowej na serwerze.

Skonfiguruj plik konfiguracyjny dla oddzielnej domeny build-centos.info. Utwórz osobny katalog dla serwisu i samego pliku konfiguracyjnego:

# mkdir -p /var/www/build-centos.info && mkdir -p /var/www/build-centos.info/log

Otwórz plik konfiguracyjny:

# nano /etc/nginx/conf.d/build-centos.info.conf

I dodaj do niego następującą treść:

serwer nasłuchuj 80; nazwa_serwera build-centos.info; root /var/www/build-centos.info; indeks index.php index.html index.htm; access_log /var/www/build-centos.info/log/access.log main; error_log /var/www/build-centos.info/log/error.log; lokalizacja / return 301 https: //build-centos.info$request_uri;  lokalizacja ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ return 301 https: //build-centos.info$request_uri;  lokalizacja ~ \ .php $ return 301 https: //build-centos.info$request_uri;  location = /favicon.ico log_not_found off; access_log off;  location = /robots.txt rewrite ^ /robots.txt break; zezwól wszystkim; log_not_found off; access_log off;  lokalizacja ~ /\.ht zaprzecz wszystkie;  serwer Listen 80; nazwa_serwera www.build-centos.info; przepisać ^ https: //build-centos.info$request_uri? stały;  serwer nasłuchuj 443 ssl http2; nazwa_serwera build-centos.info; root /var/www/build-centos.info; indeks index.php index.html index.htm; access_log /var/www/build-centos.info/log/ssl-access.log main; error_log /var/www/build-centos.info/log/ssl-error.log; keepalive_timeout 60; ssl_certificate /etc/letsencrypt/live/build-centos.info/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/build-centos.info/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES256-GCM-838-GCM-838-GCM SHA256: DHE-DSS-AES128-GCM-SHA256: kEDH + AESGCM: ECDHE-RSA-AES128-SHA256: ECDHE-ECDSA-AES128-SHA256: ECDHE-RSA-AES128-SHA: ECDHE-ECDA-ECDA RSA-AES256-SHA384: ECDHE-ECDSA-AES256-SHA384: ECDHE-RSA-AES256-SHA: ECDHE-ECDSA-AES256-SHA: DHE-RSA-AES128-SHA256: DHE-RSA-AES128-SHA- AES128-SHA256: DHE-RSA-AES256-SHA256: DHE-DSS-AES256-SHA: DHE-RSA-AES256-SHA: AES128-GCM-SHA256: AES256-GCM-SHA384: AES128-SHA256: AES256 SHA: AES256-SHA: AES: Kamelia: DES-CBC3-SHA :! ANULL:! ENULL:! EKSPORT:! DES:! RC4:! MD5:! PSK:! AECDH:! EDH-DSS-DES-CBC3-SHA :! EDH-RSA-DES-CBC3-SHA :! KRB5-DES-CBC3-SHA '; add_header Strict-Transport-Security 'max-age = 604800'; location / try_files $ uri $ uri / /index.php?$args;  lokalizacja ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log off; wygasa max;  lokalizacja ~ \ .php $ try_files $ uri = 404; fastcgi_pass unix: /var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /var/www/build-centos.info; fastcgi_param SCRIPT_FILENAME /var/www/build-centos.info/$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /var/www/build-centos.info/$fastcgi_script_name; obejmują fastcgi_params; fastcgi_param QUERY_STRING $ query_string; fastcgi_param REQUEST_METHOD $ request_method; fastcgi_param CONTENT_TYPE $ content_type; fastcgi_param CONTENT_LENGTH $ content_length; fastcgi_param HTTPS włączony; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k;  location = /favicon.ico log_not_found off; access_log off;  location = /robots.txt zezwól wszystkim; log_not_found off; access_log off;  lokalizacja ~ /\.ht zaprzecz wszystkie;  serwer nasłuchuj 443 ssl http2; nazwa_serwera www.build-centos.info; przepisać ^ https: //build-centos.info$request_uri? stały;  

Plik konfiguracyjny zawiera ustawienia dostępu za pośrednictwem bezpiecznego protokołu https, ponieważ wiele popularnych CMS obecnie domyślnie przez niego działa. W przyszłości zainstalujemy i skonfigurujemy bezpłatny certyfikat Let's Encrypt SSL (podobny do instalowania certyfikatu Let's Encrypt na stronie IIS w systemie Windows Server).

Zainstaluj php-fpm i dodatkowe moduły php

Nginx nie ma wbudowanego modułu obsługi PHP, więc musimy zainstalować php-fpm oraz szereg modułów php, które będą używane do przetwarzania skryptów PHP.

Php-fpm Jest to bardzo łatwy i szybki menedżer procesów PHP. Nie używa protokołu HTTP (jak apache) i działa ze specjalnym protokołem FastCGI. Ze względu na swoją lekkość i prostotę FPM pozwala znacznie szybciej przetwarzać żądania PHP. W takim przypadku, w porównaniu z podobną konfiguracją z Apache, zostanie zużyta znacznie mniejsza pamięć.

Z kolei Nginx daje znaczący wzrost powracającej statyki. W naszej konfiguracji ngnix będzie działać jako serwer proxy (buforowanie i serwer front-end), a php-fpm będzie działał jako backend.

Aby zainstalować najnowsze wersje php, użyj repozytorium REMI:

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Po instalacji edytuj plik /etc/yum.repos.d/remi-php74.repo:

Rozpocznij instalację php-fpm i popularne moduły php:

# mniam zainstaluj php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-gruszka php-xml php-xmlrpc php-mbstring php-snmp php-mydło php-zip

Uruchom usługę php-fpm i dodaj go do uruchamiania:

# systemctl uruchom php-fpm
# systemctl włącz php-fpm

Utworzono dowiązanie symboliczne z /etc/systemd/system/multi-user.target.wants/php-fpm.service do /usr/lib/systemd/system/php-fpm.service.

Aby sprawdzić, czy usługa została uruchomiona, możesz uruchomić polecenie:

# lsof -i: 9000

POLECENIE PID UŻYTKOWNIK TYP FD ROZMIAR URZĄDZENIA / WYŁ. NAZWA NAZWA php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpv 15pm 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1554 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1555 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1556 apache 956 Lokalny host TCP: cslistener (LISTEN)

Service php-fpm trzeba uruchomić przez gniazdo unix. W pliku konfiguracyjnym /etc/php-fpm.d/www.conf usuń wiersz Listen = 127.0.0.1:9000 i dodaj:

listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx

Aby uruchomić php-fpm nie od użytkownika apache (domyślnie), podaj następujące parametry w pliku konfiguracyjnym:

użytkownik = nginx grupa = nginx

Po zmianie konfiguracji php-fpm musisz zrestartować usługę:

# systemctl uruchom ponownie php-fpm

Zainstaluj Let's Encrypt i podłącz certyfikat

Aby wydać bezpłatny certyfikat Let's Encrypt, musisz zainstalować niezbędnego certbota.

# yum zainstaluj certbota

Następnie wykonaj:

# certbot z pewnością

Po uruchomieniu polecenia musisz wypełnić wszystkie dane, podając skrzynkę pocztową, domenę i tak dalej:

# certbot z pewnością

Zapisywanie dziennika debugowania w /var/log/letsencrypt/letsencrypt.log Jak chcesz uwierzytelnić się w ACME CA? -------------------------------------------------- ----------------------------- 1: Rozwiń tymczasowy serwer WWW (samodzielny) 2: Umieść pliki w katalogu webroot (webroot) - -------------------------------------------------- ---------------------------- Wybierz odpowiedni numer [1-2], a następnie [wprowadź] (naciśnij „c”, aby anulować): 1 Wybrane wtyczki: Authenticator samodzielny, Instalator Brak Wprowadź adres e-mail (używany do pilnego odnowienia i powiadomień bezpieczeństwa) (Wpisz „c”, aby anulować): [email protected] Rozpoczęcie nowego połączenia HTTPS (1): acme-v01.api.letsencrypt .org ------------------------------------------------ ------------------------------- Przeczytaj Warunki korzystania z usługi na https://letsencrypt.org/documents/LE- SA-v1.1.1-sierpień-1-2016.pdf. Musisz się zgodzić, aby zarejestrować się na serwerze ACME pod adresem https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- ---------------------------------------------- Czy byłbyś chętny udostępnić swój adres e-mail firmie Electronic Frontier Foundation, założycielowi projektu Let's Encrypt i organizacji non-profit, która rozwija Certbot? Chcielibyśmy wysłać Ci wiadomość e-mail na temat EFF i naszej pracy na rzecz szyfrowania sieci, ochrony użytkowników i ochrony praw cyfrowych. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Wprowadź nazwy domen (-y) ( przecinek i / lub spacja oddzielone) (Wpisz „c”, aby anulować): build-centos.info Uzyskiwanie nowego certyfikatu Wykonanie następujących wyzwań: wyzwanie tls-sni-01 dla build-centos.info Oczekiwanie na weryfikację ... Usuwanie wyzwań WAŻNE UWAGI: - Gratulacje! Twój certyfikat i łańcuch zostały zapisane pod adresem: /etc/letsencrypt/live/build-centos.info/fullchain.pem Twój plik klucza został zapisany pod adresem: /etc/letsencrypt/live/build-centos.info/privkey.pem Twój cert wygaśnie 24.01.2018. Aby w przyszłości uzyskać nową lub poprawioną wersję tego certyfikatu, po prostu uruchom ponownie certbota. Aby w sposób nieinteraktywny odnowić * wszystkie * certyfikaty, uruchom polecenie „certbot renew” - dane logowania do konta zostały zapisane w katalogu konfiguracji Certbot w / etc / letsencrypt. Powinieneś teraz wykonać bezpieczną kopię zapasową tego folderu. Ten katalog konfiguracyjny będzie także zawierał certyfikaty i klucze prywatne uzyskane przez Certbot, więc regularne tworzenie kopii zapasowych tego folderu jest idealne. 

Aby certyfikat został poprawnie wystawiony, twoja domena musi istnieć i być skierowana do odpowiedniego serwera WWW.

Po wystawieniu certyfikatu uruchom ponownie serwer WWW Nginx i sprawdź wynik.

# systemctl zrestartuj nginx

Połączenie w przeglądarce jest bezpieczne.!

Aby automatycznie odnawiać certyfikaty, zmień plik konfiguracyjny /etc/letsencrypt/renewal/build-centos.info.conf w następujący sposób:

# renew_before_expiry = 30 dni
wersja = 0.18.1
katalog_archiwum = / etc / letsencrypt / archive / build-centos.info
cert = /etc/letsencrypt/live/build-centos.info/cert.pem
privkey = /etc/letsencrypt/live/build-centos.info/privkey.pem
chain = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

# Opcje użyte w procesie odnowienia
[renewalparams]
uwierzytelniacz = katalog główny
instalator = Brak
konto = e9c86e6aa57b45f9614bc7c0015927a5
post_hook = nginx -s reload
[[webroot_map]]
www.build-centos.info = /var/www/build-centos.info
build-centos.info = /var/www/build-centos.info

Po zmianie pliku dodaj zadanie do korony:

30 2 * * * root / usr / bin / certbot renew - post-hook "nginx -s reload"

Aby sprawdzić, czy nginx działa z php, utworzyłem plik index.php i dodałem do niego:

Zainstaluj MySQL / MariaDB na serwerze WWW

Całkowicie pominiemy ten krok, ponieważ na stronie znajduje się już artykuł na temat instalacji i tuningu MariaDB. Skorzystaj z niej.

Konfigurowanie Nginx i PHP-FPM dla projektów o dużym obciążeniu

Aby serwer WWW działał z wysoką wydajnością i mógł przetwarzać dużą liczbę żądań od klientów, jeden sprzęt nie wystarczy. Ważne jest, aby poprawnie skonfigurować pracę grona nginx i php-fpm.

Konfiguracja Nginx

Otwórz plik /etc/nginx/nginx.conf i zmień konfigurację Nginx w następujący sposób:

  • proces_procesowy 2; - ustaw liczbę procesów roboczych równą liczbie rdzeni na serwerze.
  • połączenia_ robotnicze 1024; - określa liczbę połączeń w jednym przepływie pracy. Ustaw wartości od 1024 do 4096.
  • użyj epoll; - optymalna metoda połączenia dla systemu Linux.
  • multi_accept on; - nginx zaakceptuje maksymalną liczbę połączeń.

Blok HTTP:

  • tcp_nodelay on; - wysyła nagłówki i początek pliku w jednej partii.
  • tcp_nopush on;

W przypadku projektów zawierających dużą liczbę plików statycznych włącz kompresję gzip:

gzip on;

Dodaj dużą liczbę typów plików, aby wszystkie testy googlespeed przebiegły pomyślnie:
gzip_types application / atom + xml application / javascript text / javascript application / json application / ld + json application / manifest + json application / rss + xml application / vnd.geo + json font / ttf application / x-font-ttf application / vnd .ms-fontobject application / font-woff application / font-woff2 application / x-web-app-manifest + application json / xhtml + xml application / xml font / opentype image / bmp image / svg + xml image / x-icon text / cache-manifest text / css text / plain text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-component text / x-cross-domain-policy;

Ustawienie kompresji przyspieszy Twój projekt.

  • keepalive_timeout 30; - serwer internetowy zaczeka 30 sekund przed zamknięciem połączenia podtrzymującego połączenie
  • keepalive_requests 100; - maksymalna liczba żądań utrzymywania aktywności od jednego klienta
  • reset_timedout_connection on; - włącz tę opcję, jeśli nie chcesz, aby połączenie od klienta, który przestał odpowiadać, było resetowane.
  • client_body_timeout 10; - serwer internetowy poczeka 10 sekund na potwierdzenie żądania od klienta, po tym czasie połączenie zostanie zresetowane.
  • send_timeout 2; - jeśli klient przestanie czytać odpowiedź z serwera WWW, nginx zresetuje połączenie z nim.

Jeśli Twoja witryna nie umożliwia pobierania dużych plików, ogranicz to do nginx:

  • client_max_body_size 2m; - serwer nie zaakceptuje żądań większych niż 2 MB.

Jeśli zawartość Twojego projektu nie zmienia się tak często, możesz użyć buforowania „wygasa max;„Lub dodaj odpowiednią opcję do pliku konfiguracyjnego hosta dla żądanego typu pliku, na przykład:

lokalizacja ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $
wygasa 7d;
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

Pamięć podręczna dla określonych typów plików będzie przechowywana przez 7 dni. Możesz kontrolować pamięć podręczną za pomocą tej funkcji. Po wszystkich modyfikacjach nie zapomnij ponownie uruchomić nginx:

# systemctl zrestartuj nginx

Konfiguracja php-fpm

Podczas instalacji php-fpm od razu przeniosłeś go do gniazda unix. Daje to znaczący wzrost wydajności. Według szacunków wydajność rośnie 2-3 razy. Pozostałe parametry php-fpm należy skonfigurować osobno dla każdego projektu, rozważ przykładową konfigurację serwera z 1024 MB pamięci.

Dla php-fpm możemy przydzielić około 512 MB, pozostawiając resztę w bazie danych i nginx.

Do pliku konfiguracyjnego /etc/php-fpm/www.conf, dodaj:

  • pm.max_children = 18 - maksymalna liczba procesów potomnych
  • pm.start_servers = 6 - liczba procesów potomnych utworzonych podczas uruchamiania
  • pm.min_spare_servers = 4 - minimalna liczba nieaktywnych procesów serwera
  • pm.max_spare_servers = 16 - maksymalna liczba nieaktywnych procesów serwera
  • pm.max_requests = 400 - liczba żądań procesu potomnego, po którym proces zostanie zrestartowany.

Wszystkie parametry muszą zostać zmienione podczas analizy obciążenia twojego projektu, wartości te są teoretyczne.

Na bieżącym serwerze natychmiast zainstalowałem najnowszą wersję CMS Bitrix, aby przetestować wydajność. Moim zdaniem jest to CMS o największym zużyciu zasobów, a wyniki nie są złe, biorąc pod uwagę, że jest to maszyna wirtualna na KVM z jednym rdzeniem (vCPU) i 1024 RAM:

Nie malowałem optymalizacji ustawień MariaDB, ponieważ na stronie znajduje się odpowiedni artykuł. Utworzyłem parametry pliku my.cnf zgodnie z artykułem, a baza danych wykazała doskonałe wyniki.

Po uruchomieniu witryny, gołym okiem zauważysz, że nginx + php-fpm przetworzy twoje żądania i zwróci strony znacznie szybciej niż apache2 + mod_php. Jeśli masz możliwość przeprowadzenia testów warunków skrajnych podczas konfiguracji serwera, będzie to niewątpliwie plus, ale jeśli nie jest to możliwe, możesz zmienić ustawienia swoich zasobów na podstawie naszego podręcznika.