Nastavení produktivního webového serveru na NGINX + PHP-FPM

PHP-FPM (Fast Process Manager) - Toto je samostatná implementace obsluhy FastCGI pro provádění skriptů PHP. Na základě balíčku webového serveru NGINX (který zpracovává statiku) a PHP-FPM můžete pro své webové projekty vytvořit rychlejší a rychlejší webový server ve srovnání s klasickým balíčkem NGINX, Apache a modulem mod_php (zásobník LAMP)..

Lemp - Sada softwaru s otevřeným zdrojovým kódem, který je obvykle nainstalován společně a běží na serveru k hostování webových stránek a webových aplikací. Tato zkratka se týká sady Linux OS s webovým serverem Nginx (nahrazuje Apache v běžnějším zásobníku Lampa), s databází MySQL (MariaDB) a c php pro zpracování dynamických dat.

V tomto článku zvážíme instalaci a optimalizaci zásobníku LEMP pro hostování načteného webového projektu na serveru s CentOS 7 založeným na svazku NGINX + PHP-FPM + MariaDB / MySQL + a instalaci certifikátu Let's Encrypt pro server SSL .

Obsah:

  • Připojení úložiště, aktualizace serveru
  • Instalace a konfigurace webového serveru Nginx
  • Nainstalujte php-fpm a další php moduly
  • Nainstalujte Pojďme šifrovat a připojte certifikát
  • Nainstalujte MySQL / MariaDB na webový server
  • Konfigurace Nginx a PHP-FPM pro projekty s vysokou zátěží

Připojení úložiště, aktualizace serveru

Protože se instalace provádí na nově nainstalovaném serveru s CentOS, musíte připojit populární úložiště EPEL a aktualizovat všechny balíčky na serveru.

# yum install epel-release -y
# yum update -y

Repozitář byl nainstalován, ale nebyly nalezeny žádné aktualizační balíčky, protože byl nainstalován nový obraz CentOS.

Instalace a konfigurace webového serveru Nginx

Chcete-li nainstalovat nejnovější verzi Nginx, připojte úložiště vývojářů spuštěním příkazu:

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

Nebo vytvořením konfiguračního souboru úložiště /etc/yum.repos.d/nginx.repo s následujícím obsahem:

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

Pokud používáte CentOS 8, změňte verzi v URL.

Nainstalujte balíček webového serveru Nginx pomocí správce balíčků yum (nebo dnf):

# yum install nginx -y

Nyní můžete běžet nginx a přidejte jej do spuštění pomocí systemctl:

# systemctl start nginx
# systemctl povolit nginx

Vytvořen symbolický odkaz z /etc/systemd/system/multi-user.target.wants/nginx.service na /usr/lib/systemd/system/nginx.service.

Chcete-li ověřit, zda webový server funguje, otevřete v prohlížeči IP adresu serveru.

Pokud se vaše testovací stránka neotevře, zkontrolujte nastavení povolených služeb, portů, zón v firewallu na vašem serveru.

Nastavte konfigurační soubor pro samostatnou doménu build-centos.info. Vytvořte samostatný adresář pro web a samotný konfigurační soubor:

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

Otevřete konfigurační soubor:

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

A k tomu přidejte následující obsah:

server poslech 80; server_name build-centos.info; root /var/www/build-centos.info; index 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; location / return 301 https: //build-centos.info$request_uri;  location ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ return 301 https: //build-centos.info$request_uri;  location ~ \ .php $ return 301 https: //build-centos.info$request_uri;  location = /favicon.ico log_not_found off; access_log off;  location = /robots.txt přepsat ^ /robots.txt break; povolit všechny; log_not_found off; access_log off;  location ~ /\.ht deny all;  server poslech 80; server_name www.build-centos.info; přepsat ^ https: //build-centos.info$request_uri? trvalé;  server poslech 443 ssl http2; server_name build-centos.info; root /var/www/build-centos.info; index 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; ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES256-GCM-838-G38 SHA256: DHE-DSS-AES128-GCM-SHA256: kEDH + AESGCM: ECDHE-RSA-AES128-SHA256: ECDHE-ECDSA-AES128-SHA256: ECDHE-RSA-AES128-SHA: ECDHE-ECDA-ECDA-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: AES256ES6-A2525 SHA: AES256-SHA: AES: CAMELLIA: DES-CBC3-SHA :! ANULL :! ENULL :! EXPORT :! 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;  location ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log off; vyprší maximální;  umístění ~ \ .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; zahrnují 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 on; 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 Allow all; log_not_found off; access_log off;  location ~ /\.ht deny all;  server poslech 443 ssl http2; server_name www.build-centos.info; přepsat ^ https: //build-centos.info$request_uri? trvalé;  

Konfigurační soubor obsahuje nastavení pro přístup prostřednictvím zabezpečeného protokolu https, protože mnoho populárních CMS v současné době ve výchozím nastavení funguje. V budoucnu nainstalujeme a nakonfigurujeme bezplatný certifikát Let's Encrypt SSL (podobně jako instalace certifikátu Let's Encrypt na webu IIS v systému Windows Server).

Nainstalujte php-fpm a další php moduly

Nginx nemá vestavěný obslužný program PHP, takže musíme nainstalovat php-fpm a několik php modulů, které budou použity ke zpracování PHP skriptů.

Php-fpm Jedná se o velmi snadného a rychlého správce procesů PHP. Nepoužívá protokol HTTP (jako apache) a pracuje se speciálním protokolem FastCGI. Díky své lehkosti a jednoduchosti vám FPM umožňuje zpracovávat požadavky PHP mnohem rychleji. V tomto případě bude ve srovnání s podobnou konfigurací s apache použito mnohem méně paměti.

Nginx, podle pořadí, dává významný zisk vracející se statice. V naší konfiguraci bude ngnix fungovat jako proxy server (ukládání do mezipaměti a front-end server) a php-fpm bude fungovat jako backend.

Chcete-li nainstalovat nejnovější verze php, použijte úložiště REMI:

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

Po instalaci soubor upravte /etc/yum.repos.d/remi-php74.repo:

Spusťte instalaci php-fpm a populární php moduly:

# yum nainstalovat php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-hruška php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip

Spusťte službu php-fpm a přidejte jej do spuštění:

# systemctl spusťte php-fpm
# systemctl povolit php-fpm

Vytvořen symbolický odkaz z /etc/systemd/system/multi-user.target.wants/php-fpm.service na /usr/lib/systemd/system/php-fpm.service.

Chcete-li zkontrolovat, zda byla služba spuštěna, můžete spustit příkaz:

# lsof -i: 9000

COMMAND PID UŽIVATEL FD TYPE ZAŘÍZENÍ ROZMĚR / VYPNUTÍ NODE JMÉNO 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 TCP localhost: cslistener (LISTEN)

Služba php-fpm je třeba spustit prostřednictvím unixového soketu. V konfiguračním souboru /etc/php-fpm.d/www.conf smazat řádek poslech = 127.0.0.1:9000 a přidat:

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

Chcete-li spustit php-fpm nikoli od uživatele apache (ve výchozím nastavení), zadejte v konfiguračním souboru následující parametry:

user = nginx skupina = nginx

Po změně konfigurace php-fpm je třeba restartovat službu:

# systemctl restart php-fpm

Nainstalujte Pojďme šifrovat a připojte certifikát

Chcete-li vydat bezplatný certifikát Pojďme šifrovat, musíte nainstalovat potřebný certifikát.

# yum install certbot

Pak proveďte:

# certbot certonly

Po spuštění příkazu budete muset vyplnit všechna data a zadat poštovní schránku, doménu atd.:

# certbot certonly

Ukládání protokolu ladění do /var/log/letsencrypt/letsencrypt.log Jak byste se chtěli autentizovat pomocí CA ACME? -------------------------------------------------- ----------------------------- 1: Roztočte dočasný webový server (samostatný) 2: Umístěte soubory do adresáře webroot (webroot) - -------------------------------------------------- ---------------------------- Vyberte příslušné číslo [1-2] a poté [enter] (stiskněte 'c' pro zrušení): 1 vybrané pluginy: Samostatný autentizátor, Instalační program Žádný Zadejte e-mailovou adresu (používá se pro naléhavé obnovení a bezpečnostní upozornění) (zrušte zadáním 'c'): [email protected] Zahájení nového připojení HTTPS (1): acme-v01.api.letsencrypt .org ------------------------------------------------ ------------------------------- Přečtěte si prosím smluvní podmínky na adrese https://letsencrypt.org/documents/LE- SA-v1.1.1-August-1-2016.pdf. Chcete-li se zaregistrovat na serveru ACME, musíte souhlasit na adrese https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- -------------------------------------------------- Byli byste ochotní sdílet svou e-mailovou adresu s Electronic Frontier Foundation, zakládajícím partnerem projektu Let's Encrypt a neziskovou organizací, která vyvíjí Certbot? Chtěli bychom vám poslat e-mail o EFF a naší práci na šifrování webu, ochraně jeho uživatelů a ochraně digitálních práv. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Zadejte prosím své doménové jméno (názvy) ( čárka a / nebo mezera) (Zadejte 'c' pro zrušení): build-centos.info Získání nového certifikátu Provedení následujících výzev: tls-sni-01 výzva pro build-centos.info Čekání na ověření ... Vyčištění výzev DŮLEŽITÉ POZNÁMKY: - Blahopřejeme! Váš certifikát a řetězec byly uloženy na: /etc/letsencrypt/live/build-centos.info/fullchain.pem Soubor s vaším klíčem byl uložen na: /etc/letsencrypt/live/build-centos.info/privkey.pem Your platnost certifikátu vyprší dne 2018-01-24. Chcete-li v budoucnu získat novou nebo vylepšenou verzi tohoto certifikátu, jednoduše spusťte certbot znovu. Chcete-li neinteraktivně obnovit * všechny * svých certifikátů, spusťte „certbot restore“ - pověření vašeho účtu byla uložena v konfiguračním adresáři Certbot na / etc / letsencrypt. Nyní byste měli vytvořit bezpečnou zálohu této složky. Tento konfigurační adresář bude také obsahovat certifikáty a soukromé klíče získané společností Certbot, takže pravidelné zálohování této složky je ideální. 

Aby byl certifikát správně vydán, musí vaše doména existovat a směřovat na odpovídající webový server.

Po vydání certifikátu restartujte webový server nginx a zkontrolujte výsledek.

# systemctl restart nginx

Připojení v prohlížeči je zabezpečené.!

Chcete-li automaticky obnovit certifikáty, změňte konfigurační soubor /etc/letsencrypt/renewal/build-centos.info.conf takto:

#enew_before_expiry = 30 dní
verze = 0,18.1
archive_dir = / 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

# Možnosti použité v procesu obnovy
[obnoveníalparams]
autenticator = webroot
installer = Žádný
účet = 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 změně souboru přidejte úkol do koruny:

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

Pro ověření, že nginx pracuje s php, jsem vytvořil soubor index.php a přidal do něj:

Nainstalujte MySQL / MariaDB na webový server

Tento krok úplně přeskočíme, protože web již obsahuje článek o instalaci a ladění MariaDB. Využijte ji.

Konfigurace Nginx a PHP-FPM pro projekty s vysokou zátěží

Aby webový server pracoval s vysokým výkonem a byl schopen zpracovat velké množství požadavků klientů, nestačí jeden hardware. Je důležité správně nakonfigurovat operaci nginx a php-fpm.

Nastavení Nginxu

Otevřít soubor /etc/nginx/nginx.conf a změňte konfiguraci Nginx takto:

  • worker_processes 2; - nastavit počet pracovních procesů rovný počtu jader na serveru.
  • worker_connections 1024; - určuje počet připojení v jednom pracovním postupu. Nastavte hodnoty od 1024 do 4096.
  • používat epoll; - optimální způsob připojení pro Linux.
  • multi_accept on; - nginx přijme maximální počet připojení.

Http blok:

  • tcp_nodelay on; - odešle záhlaví a začátek souboru v jedné dávce.
  • tcp_nopush on;

U projektů, které obsahují velké množství statických souborů, nezapomeňte povolit kompresi gzip:

gzip na;

Přidejte velký počet typů souborů, aby všechny kontroly googlespeed prošly:
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 + json application / xhtml + xml application / xml font / opentype image / bmp image / svg + xml image / x-icon text / text v mezipaměti / text css / prostý text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-komponentní text / x-cross-domain-policy;

Nastavení komprese urychlí váš projekt.

  • keepalive_timeout 30; - webový server bude čekat 30 sekund před ukončením udržovacího připojení
  • keepalive_requests 100; - maximální počet udržovacích požadavků od jednoho klienta
  • reset_timedout_connection on; - povolte tuto možnost, pokud nechcete obnovit připojení od klienta, který přestal reagovat.
  • client_body_timeout 10; - webový server bude čekat 10 sekund na potvrzení požadavku od klienta, po této době bude připojení resetováno.
  • send_timeout 2; - Pokud klient přestane číst odpověď z webového serveru, nginx resetuje spojení s ním.

Pokud váš web neposkytuje stahování velkých souborů, omezte toto na nginx:

  • client_max_body_size 2m; - server nepřijme žádosti o více než 2 MB.

Pokud se obsah vašeho projektu nemění tak často, můžete použít ukládání do mezipaměti “vyprší maximální;"Nebo přidejte příslušnou možnost do konfiguračního souboru hostitele pro požadovaný typ souboru, například:

umístění ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $
vyprší 7d;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mezipaměť pro zadané typy souborů bude uložena po dobu 7 dnů. Pomocí této funkce můžete mezipaměť ovládat. Po všech úpravách nezapomeňte restartovat nginx:

# systemctl restart nginx

Nastavení Php-fpm

Při instalaci php-fpm jste jej okamžitě přenesli do unixového soketu. To vede k významnému zvýšení produktivity. Podle odhadů roste produktivita 2-3krát. Zbývající parametry php-fpm je třeba nakonfigurovat pro každý projekt zvlášť, zvažte příklad nastavení pro server s 1024 MB paměti.

Pro php-fpm můžeme přidělit asi 512 mb, zbytek ponecháme v databázi a nginx.

Do konfiguračního souboru /etc/php-fpm/www.conf, přidat:

  • pm.max_children = 18 - maximální počet podřízených procesů
  • pm.start_servers = 6 - počet podřízených procesů vytvořených při spuštění
  • pm.min_spare_servers = 4 - minimální počet neaktivních serverových procesů
  • pm.max_spare_servers = 16 - maximální počet neaktivních serverových procesů
  • pm.max_requests = 400 - počet požadavků z podřízeného procesu, po kterém se proces restartuje.

Při analýze zatížení projektu je nutné změnit všechny parametry, tyto hodnoty jsou teoretické.

Na aktuální server jsem okamžitě nainstaloval nejnovější verzi CMS Bitrix, abych otestoval výkon. Podle mého názoru se jedná o CMS s největší náročností na zdroje a výsledky nejsou špatné, vzhledem k tomu, že se jedná o virtuální stroj na KVM s jedním jádrem (vCPU) a 1024 RAM:

Neaplikoval jsem optimalizaci nastavení MariaDB, protože na webu je odpovídající článek. Vytvořil jsem parametry pro my.cnf podle článku a databáze vykázala vynikající výsledky.

Když spustíte web, všimnete si pouhýma očima, že nginx + php-fpm zpracuje vaše požadavky a vrátí stránky mnohem rychleji než apache2 + mod_php. Pokud máte možnost provádět zátěžové testy během instalace serveru, bude to bezpochyby plus, ale pokud to není možné, můžete změnit nastavení svých zdrojů na základě naší příručky..