Nastavenie produktívneho webového servera v NGINX + PHP-FPM

PHP-FPM (rýchly procesný manažér) - Toto je samostatná implementácia obsluhy FastCGI na vykonávanie skriptov PHP. Na základe zväzku webového servera NGINX (ktorý spracováva statiku) a PHP-FPM, môžete pre svoje webové projekty vytvoriť rýchlejší a rýchlejší webový server v porovnaní s klasickým balíkom NGINX, Apache a modulom mod_php (zásobník LAMP)..

LEMP - Sada softvéru s otvoreným zdrojovým kódom, ktorý sa zvyčajne inštaluje spolu na serveri na hosťovanie webových stránok a webových aplikácií. Táto skratka sa vzťahuje na súbor operačného systému Linux s webovým serverom Nginx (nahrádza apache v bežnejšom zásobníku LAMP), s databázou MySQL (MariaDB) a c php na spracovanie dynamických údajov.

V tomto článku zvážime inštaláciu a optimalizáciu zásobníka LEMP na hosťovanie načítaného webového projektu na serveri s CentOS 7 založeným na zväzku NGINX + PHP-FPM + MariaDB / MySQL + a inštaláciu certifikátu Let's Encrypt for SSL SSL .

obsah:

  • Pripojenie úložiska, aktualizácia servera
  • Inštalácia a konfigurácia webového servera Nginx
  • Nainštalujte php-fpm a ďalšie php moduly
  • Nainštalujte Poďme šifrovať a pripojiť certifikát
  • Nainštalujte MySQL / MariaDB na webový server
  • Konfigurácia Nginx a PHP-FPM pre vysoko zaťažené projekty

Pripojenie úložiska, aktualizácia servera

Keďže sa inštalácia vykonáva na novo nainštalovanom serveri s CentOS, musíte pripojiť populárne úložisko EPEL a aktualizovať všetky balíčky na serveri..

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

Repozitár bol nainštalovaný, ale nenašli sa žiadne balíky aktualizácií, pretože bol nainštalovaný nový obraz CentOS.

Inštalácia a konfigurácia webového servera Nginx

Inštalácia najnovšej verzie Nginx, pripojte archív vývojárov spustením príkazu:

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

Alebo vytvorením konfiguračného súboru úložiska /etc/yum.repos.d/nginx.repo s nasledujúcim obsahom:

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

Ak používate CentOS 8, zmeňte verziu v URL.

Nainštalujte balík webového servera Nginx pomocou správcu balíkov yum (alebo dnf):

# yum nainštaluje nginx -y

Teraz môžete spustiť Nginx a pridajte ho do spustenia pomocou systemctl:

# systemctl start nginx
# systemctl povolí nginx

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

Ak chcete overiť, či webový server funguje, otvorte v prehliadači IP adresu servera.

Ak sa vaša testovacia stránka neotvorí, skontrolujte nastavenia povolených služieb, portov, zón v bráne firewall na vašom serveri.

Nastavte konfiguračný súbor pre samostatnú doménu build-centos.info. Vytvorte samostatný adresár pre web a samotný konfiguračný súbor:

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

Otvorte konfiguračný súbor:

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

K tomu pridajte nasledujúci obsah:

server počúvať 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 prepísať ^ /robots.txt break; povoliť všetky; log_not_found off; access_log off;  location ~ /\.ht deny all;  server počúvať 80; server_name www.build-centos.info; prepísať ^ https: //build-centos.info$request_uri? trvalá;  server počúvajte 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-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-625A6 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ší maximum;  location ~ \ .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; zahŕňajú 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 zapnuté; 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 256 000; 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 počúvajte 443 ssl http2; server_name www.build-centos.info; prepísať ^ https: //build-centos.info$request_uri? trvalá;  

Konfiguračný súbor obsahuje nastavenia pre prístup prostredníctvom zabezpečeného protokolu https, pretože mnoho populárnych CMS v súčasnosti v predvolenom nastavení funguje. V budúcnosti nainštalujeme a nakonfigurujeme bezplatný certifikát Let's Encrypt SSL (podobný inštalácii certifikátu Let's Encrypt na serveri IIS v systéme Windows Server).

Nainštalujte php-fpm a ďalšie php moduly

Nginx nemá vstavaný obslužný program PHP, takže musíme nainštalovať php-FPM a niekoľko php modulov, ktoré budú použité na spracovanie PHP skriptov.

Php-FPM Toto je veľmi jednoduchý a rýchly správca procesov PHP. Nepoužíva protokol HTTP (ako apache) a pracuje so špeciálnym protokolom FastCGI. Vďaka svojej ľahkosti a jednoduchosti vám FPM umožňuje spracovávať požiadavky PHP oveľa rýchlejšie. V tomto prípade sa v porovnaní s podobnou konfiguráciou s apache použije omnoho menej pamäte.

Nginx zase poskytuje výrazný zisk pri vracaní statiky. V našej konfigurácii bude ngnix fungovať ako proxy server (ukladanie do cache a front-end server) a php-fpm bude fungovať ako backend.

Ak chcete nainštalovať najnovšie verzie php, použite archív REMI:

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

Po inštalácii súbor upravte /etc/yum.repos.d/remi-php74.repo:

Spustite inštaláciu php-FPM a populárne php moduly:

# yum nainštalujte 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-mydlo php-zip

Spustite službu php-FPM a pridajte ho do spustenia:

# systemctl start php-fpm
# systemctl povolí php-fpm

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

Ak chcete skontrolovať, či sa služba začala, môžete spustiť príkaz:

# lsof -i: 9000

PRÍKAZ PID UŽÍVATEĽ FD TYPOVÉ ZARIADENIE VEĽKOSŤ / VYPNUTIE NODE NÁZOV NÁZOV 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 musí bežať cez Unix soket. V konfiguračnom súbore /etc/php-fpm.d/www.conf odstráňte riadok listen = 127.0.0.1:9000 a pridajte:

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

Ak chcete spustiť php-fpm nie od používateľa apache (štandardne), zadajte v konfiguračnom súbore tieto parametre:

user = nginx skupina = nginx

Po zmene konfigurácie php-fpm je potrebné reštartovať službu:

# systemctl reštart php-fpm

Nainštalujte Poďme šifrovať a pripojiť certifikát

Ak chcete vydať bezplatný certifikát Poďme šifrovať, musíte nainštalovať potrebný certifikát.

# yum install certbot

Potom urobte:

# certbot certonly

Po spustení príkazu budete musieť vyplniť všetky údaje a uviesť poštovú schránku, doménu atď.:

# certbot certonly

Uloženie protokolu ladenia do /var/log/letsencrypt/letsencrypt.log Ako by ste sa chceli autentifikovať v CA ACME? -------------------------------------------------- ----------------------------- 1: Roztočte dočasný webový server (samostatný) 2: Umiestnite súbory do adresára webroot (webroot) - -------------------------------------------------- ---------------------------- Vyberte príslušné číslo [1-2] a potom [enter] (stlačením 'c' zrušte): 1 Vybraté doplnky: Samostatný autentifikátor, Inštalátor Žiadny Zadajte e-mailovú adresu (používa sa na naliehavé obnovenie a bezpečnostné upozornenia) (pre zrušenie zadajte „c“): [email protected] Začatie nového pripojenia HTTPS (1): acme-v01.api.letsencrypt .org ------------------------------------------------ ----------------------------------- Prečítajte si zmluvné podmienky na adrese https://letsencrypt.org/documents/LE- SA-v1.1.1-August-1-2016.pdf. Aby ste sa mohli zaregistrovať na serveri ACME, musíte súhlasiť na https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- -------------------------------------------------- Boli by ste ochotní zdieľať svoju e-mailovú adresu s Nadáciou Electronic Frontier Foundation, zakladajúcim partnerom projektu Let's Encrypt a neziskovou organizáciou, ktorá vyvíja Certbot? Chceli by sme vám poslať e-mail o EFF a našej práci na šifrovaní webu, ochrane jeho používateľov a ochrane digitálnych práv. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Zadajte názov svojej domény ( čiarka a / alebo medzera) (Zadajte „c“ pre zrušenie): build-centos.info Získanie nového certifikátu Vykonanie nasledujúcich výziev: tls-sni-01 challenge pre build-centos.info Čakanie na overenie ... Čistenie výziev DÔLEŽITÉ POZNÁMKY: - Blahoželáme! Váš certifikát a reťazec boli uložené na: /etc/letsencrypt/live/build-centos.info/fullchain.pem Váš súbor kľúčov bol uložený na: /etc/letsencrypt/live/build-centos.info/privkey.pem Your platnosť certifikátu vyprší dňa 2018-01-24. Ak chcete v budúcnosti získať novú alebo vylepšenú verziu tohto certifikátu, jednoducho znova spustite certbot. Ak chcete neinteraktívne obnoviť * všetky * svoje certifikáty, spustite príkaz „certbot restore“ - poverenia vášho účtu boli uložené v konfiguračnom adresári Certbot na adrese / etc / letsencrypt. Teraz by ste mali vytvoriť bezpečnú zálohu tohto priečinka. Tento konfiguračný adresár bude obsahovať aj certifikáty a súkromné ​​kľúče získané spoločnosťou Certbot, takže pravidelné zálohovanie tejto zložky je ideálne. 

Aby bol certifikát správne vydaný, vaša doména musí existovať a smerovať na príslušný webový server.

Po vydaní certifikátu reštartujte webový server nginx a skontrolujte výsledok.

# systemctl reštart nginx

Spojenie v prehliadači je zabezpečené.!

Ak chcete automaticky obnoviť certifikáty, zmeňte konfiguračný súbor /etc/letsencrypt/renewal/build-centos.info.conf nasledovne:

#enew_before_expiry = 30 dní
verzia = 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 procese obnovy
[Renewalparams]
autentifikátor = webroot
installer = Žiadne
úč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 zmene súboru pridajte úlohu do koruny:

30 2 * * * root / usr / bin / certbotenew - „load-hload“ nginx -s reload “

Aby som si overil, že nginx pracuje s php, vytvoril som súbor index.php a pridal som ho:

Nainštalujte MySQL / MariaDB na webový server

Tento krok úplne preskočíme, pretože stránka už obsahuje článok o inštalácii a ladení mariadb. Využite ju.

Konfigurácia Nginx a PHP-FPM pre vysoko zaťažené projekty

Aby váš webový server pracoval s vysokým výkonom a bol schopný spracovať veľké množstvo požiadaviek klientov, jeden hardvér nestačí. Je dôležité správne nakonfigurovať operáciu Nginx a php-FPM.

Nastavenie Nginx

Otvorte súbor /etc/nginx/nginx.conf a zmeňte konfiguráciu Nginx nasledovne:

  • pracovné procesy 2; - nastaviť počet pracovných procesov rovný počtu jadier na serveri.
  • pracovné prepojenia 1024; - určuje počet pripojení v jednom pracovnom postupe. Nastavte hodnoty od 1024 do 4096.
  • používať epoll; - optimálny spôsob pripojenia pre Linux.
  • multi_accept on; - nginx akceptuje maximálny počet pripojení.

Http blok:

  • tcp_nodelay on; - pošle hlavičky a začiatok súboru v jednej dávke.
  • tcp_nopush on;

V prípade projektov, ktoré obsahujú veľké množstvo statických súborov, nezabudnite povoliť kompresiu gzip:

gzip;

Pridajte veľké množstvo typov súborov, aby všetky kontroly googlespeed prešli:
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 / cache-manifest text / css text / holý text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-komponent text / x-cross-domain-policy;

Nastavenie kompresie urýchli váš projekt.

  • keepalive_timeout 30; - webový server bude čakať 30 sekúnd pred ukončením trvalého pripojenia
  • keepalive_requests 100; - maximálny počet udržiavacích žiadostí od jedného klienta
  • reset_timedout_connection on; - povoliť túto voľbu, ak nechcete obnoviť spojenie od klienta, ktorý prestal reagovať.
  • client_body_timeout 10; - webový server bude čakať 10 sekúnd na potvrdenie žiadosti od klienta a po tejto dobe sa pripojenie obnoví.
  • send_timeout 2; - Ak klient prestane čítať odpoveď z webového servera, nginx obnoví spojenie s ním.

Ak vaše stránky neposkytujú sťahovanie veľkých súborov, obmedzte to na nginx:

  • client_max_body_size 2m; - server nebude akceptovať požiadavky viac ako 2 MB.

Ak sa obsah vášho projektu nemení tak často, môžete použiť vyrovnávaciu pamäť „vyprší maximum;„Alebo pridajte do svojho hostiteľa konfiguračný súbor pre požadovaný typ súboru, napríklad:

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

Vyrovnávacia pamäť pre zadané typy súborov bude uložená 7 dní. Pomocou tejto funkcie môžete ovládať vyrovnávaciu pamäť. Po všetkých úpravách nezabudnite nginx reštartovať:

# systemctl reštart nginx

Nastavenie Php-fpm

Keď inštalujete php-fpm, okamžite ste ho preniesli do unixového soketu. To vedie k významnému zvýšeniu produktivity. Podľa odhadov produktivita rastie 2-3 krát. Zvyšné parametre php-fpm je potrebné nakonfigurovať pre každý projekt osobitne, zvážte príklad nastavenia servera s 1024 MB pamäte.

Pre php-fpm môžeme alokovať asi 512 mb, ostatné ponecháme v databáze a nginx.

Do konfiguračného súboru /etc/php-fpm/www.conf, pridať:

  • pm.max_children = 18 - maximálny počet podriadených procesov
  • pm.start_servers = 6 - počet podriadených procesov vytvorených pri štarte
  • pm.min_spare_servers = 4 - minimálny počet neaktívnych serverových procesov
  • pm.max_spare_servers = 16 - maximálny počet neaktívnych serverových procesov
  • pm.max_requests = 400 - počet žiadostí o podriadený proces, po ktorom bude proces reštartovaný.

Pri analýze zaťaženia vášho projektu je potrebné zmeniť všetky parametre, tieto hodnoty sú teoretické.

Na aktuálny server som okamžite nainštaloval najnovšiu verziu CMS Bitrix, aby som otestoval výkon. Podľa môjho názoru je to CMS s najväčšou náročnosťou na zdroje a výsledky nie sú zlé vzhľadom na to, že ide o virtuálny stroj na KVM s jedným jadrom (vCPU) a 1024 RAM:

Namaľoval som optimalizáciu nastavení MariaDB, pretože na stránke sa nachádza zodpovedajúci článok. Parametre pre my.cnf som vytvoril podľa článku a databáza vykázala vynikajúce výsledky.

Keď spustíte web, všimnete si voľným okom, že nginx + php-fpm spracuje vaše požiadavky a vráti stránky oveľa rýchlejšie ako apache2 + mod_php. Ak máte možnosť vykonať záťažové testy počas nastavenia servera, bude to nepochybne plus, ale ak to nie je možné, môžete zmeniť nastavenia svojich zdrojov na základe našej príručky..