Nastavitev produktivnega spletnega strežnika na NGINX + PHP-FPM

PHP-FPM (Fast Process Manager) - To je ločena implementacija orodja FastCGI za izvajanje izvajanja skriptov PHP. Na podlagi svežnja spletnih strežnikov NGINX (ki obdeluje statiko) in PHP-FPM lahko zgradite hitrejši in hitrejši spletni strežnik za svoje spletne projekte v primerjavi s klasičnim paketom NGINX, Apache in mod_php modulom (LAMP stack).

Konoplja - Nabor odprtokodne programske opreme, ki je običajno nameščena skupaj za zagon na strežniku za gostovanje spletnih mest in spletnih aplikacij. Ta okrajšava se nanaša na niz operacijskega sistema Linux s spletnim strežnikom Nginx (nadomešča Apač v bolj običajnem kupu Svetilka), z bazo podatkov MySQL (MariaDB) in c php za obdelavo dinamičnih podatkov.

V tem članku bomo razmislili o namestitvi in ​​optimizaciji sklopa LEMP za gostovanje naloženega spletnega projekta na strežniku s CentOS 7, ki temelji na paketu NGINX + PHP-FPM + MariaDB / MySQL +, in namestili Let's Encrypt potrdilo za spletno mesto SSL .

Vsebina:

  • Povezava s skladiščem, posodobitev strežnika
  • Namestitev in konfiguracija spletnega strežnika Nginx
  • Namestite php-fpm in dodatne php module
  • Namestimo Let's Šifriraj in poveži potrdilo
  • Namestite MySQL / MariaDB na spletni strežnik
  • Konfiguriranje Nginx in PHP-FPM za projekte z veliko obremenitvijo

Povezava s skladiščem, posodobitev strežnika

Ker se namestitev izvaja na novo nameščenem strežniku s CentOS-om, morate povezati priljubljeno skladišče EPEL in posodobiti vse pakete na strežniku.

# yum namestite epel-release -y
# yum posodobitev -y

Repozitorij je bil nameščen, vendar pa paketov za posodobitev ni bil najden, ker je bila nameščena nova slika CentOS.

Namestitev in konfiguracija spletnega strežnika Nginx

Za namestitev najnovejše različice Nginx, povežite skladišče razvijalca z izvajanjem ukaza:

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

Ali z ustvarjanjem konfiguracijske datoteke skladišča /etc/yum.repos.d/nginx.repo z naslednjo vsebino:

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

Če uporabljate CentOS 8, spremenite različico v URL.

Namestite paket spletnega strežnika Nginx s pomočjo upravitelja paketov yum (ali dnf):

# yum namestite nginx -y

Zdaj lahko tečete nginx in ga dodajte zagonu s pomočjo systemctl:

# systemctl start nginx
# systemctl omogoči nginx

Ustvaril je povezavo iz /etc/systemd/system/multi-user.target.wants/nginx.service v /usr/lib/systemd/system/nginx.service.

Če želite preveriti, ali spletni strežnik deluje, v brskalniku odprite IP naslov strežnika.

Če se vaša testna stran ne odpre, preverite nastavitve dovoljenih storitev, vrat, območij v požarnem zidu na vašem strežniku.

Nastavite konfiguracijsko datoteko za ločeno domeno build-centos.info. Ustvarite ločen imenik spletnega mesta in same konfiguracijske datoteke:

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

Odprite konfiguracijsko datoteko:

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

In vanj dodajte naslednjo vsebino:

strežnik poslušajte 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 glavni; error_log /var/www/build-centos.info/log/error.log; lokacija / return 301 https: //build-centos.info$request_uri;  lokacija ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ return 301 https: //build-centos.info$request_uri;  lokacija ~ \ .php $ return 301 https: //build-centos.info$request_uri;  lokacija = /favicon.ico log_not_found off; access_log izklopljen;  lokacija = /robots.txt prepisati ^ /robots.txt prelom; dovolite vsem; log_not_found off; access_log izklopljen;  lokacija ~ /\.ht zanikati vse;  strežnik poslušaj 80; ime strežnika www.build-centos.info; prepisati ^ https: //build-centos.info$request_uri? stalna;  strežnik poslušajte 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 glavni; 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-838-GCM-838-GCM-838- 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-AES256 SHA: AES256-SHA: AES: CAMELLIA: DES-CBC3-SHA:! ANULL: ENULL:! IZVOZ:! 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-starost = 604800'; lokacija / try_files $ uri $ uri / /index.php?$args;  lokacija ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log off; poteče max;  lokacija ~ \ .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; vključujejo 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 vklopljen; hitrocgi_intercept_errors vklopljen; fastcgi_ignore_client_abort izklopljen; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; 256c; fastcgi_busy_buffers_size fastcgi_temp_file_write_size 256k;  lokacija = /favicon.ico log_not_found off; access_log izklopljen;  lokacija = /robots.txt dovoli vse; log_not_found off; access_log izklopljen;  lokacija ~ /\.ht zanikati vse;  strežnik poslušajte 443 ssl http2; ime strežnika www.build-centos.info; prepisati ^ https: //build-centos.info$request_uri? stalna;  

Konfiguracijska datoteka vsebuje nastavitve za dostop prek varnega protokola https, saj mnogi priljubljeni CMS trenutno delujejo privzeto prek njega. V prihodnosti bomo namestili in konfigurirali brezplačno potrdilo Let's Encrypt SSL (podobno kot namestitev potrdila Let's Encrypt na spletnem mestu IIS v sistemu Windows Server).

Namestite php-fpm in dodatne php module

Nginx nima vgrajenega PHP rokovalnika, zato ga moramo namestiti php-fpm in številne php module, ki bodo uporabljeni za obdelavo skriptov PHP.

Php-fpm To je zelo enostaven in hiter vodja procesov PHP. Ne uporablja protokola HTTP (kot apache) in deluje s posebnim protokolom FastCGI. FPM zaradi svoje lahkotnosti in enostavnosti omogoča hitrejše obdelavo zahtev PHP. V tem primeru bo v primerjavi s podobno konfiguracijo z apache porabljen veliko manj pomnilnika.

Nginx pa prinaša pomemben dobiček pri vračanju statike. V naši konfiguraciji bo ngnix deloval kot proxy strežnik (predpomnilnik in sprednji strežnik), php-fpm pa kot nadomestni strežnik.

Za namestitev najnovejših različic php uporabite skladišče REMI:

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

Po namestitvi uredite datoteko /etc/yum.repos.d/remi-php74.repo:

Zaženite namestitev php-fpm in priljubljeni php moduli:

# yum namestite 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-milo php-zip

Zaženite storitev php-fpm in ga dodajte zagonu:

# systemctl zagon php-fpm
# systemctl omogoči php-fpm

Ustvaril je povezavo iz /etc/systemd/system/multi-user.target.wants/php-fpm.service v /usr/lib/systemd/system/php-fpm.service.

Če želite preveriti, ali se je storitev začela, lahko zaženete ukaz:

# lsof -i: 9000

KOMAND PID UPORABNIK FD VRSTA NAPRAVE NAZIV / IZKLOP NODE IME php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost: cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost: cslistener (LISTP) 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) TCP localhost: cslistener (LISTEN)

Storitev php-fpm morate teči skozi unix vtičnico. V konfiguracijski datoteki /etc/php-fpm.d/www.conf izbrišite vrstico poslušanje = 127.0.0.1:9000 in dodajte:

poslušaj = /var/run/php-fpm/php-fpm.sock liste.mode = 0660 liste.owner = nginx liste.group = nginx

Če želite zagnati php-fpm ne od uporabnika apache (privzeto), v konfiguracijski datoteki podajte naslednje parametre:

uporabnik = nginx skupina = nginx

Ko spremenite konfiguracijo php-fpm, morate znova zagnati storitev:

# systemctl znova zaženite php-fpm

Namestimo Let's Šifriraj in poveži potrdilo

Če želite izdati brezplačno potrdilo Let's Encrypt, morate namestiti potreben certbot.

# yum namestite certbot

Nato naredite:

# certbot certonly

Po zagonu ukaza boste morali vnesti vse podatke z navedbo poštnega predala, domene in tako naprej:

# certbot certonly

Shranjevanje dnevnika za odpravljanje napak v /var/log/letsencrypt/letsencrypt.log Kako želite preveriti pristnost z ACME CA? -------------------------------------------------- ----------------------------- 1: Vklopite začasni spletni strežnik (samostojni) 2: Datoteke postavite v imenik webroot (webroot) - -------------------------------------------------- ---------------------------- Izberite ustrezno številko [1-2] in nato [enter] (za preklic pritisnite 'c'): 1 Izbrani vtičniki: Authenticator samostojen, Installer None .org ------------------------------------------------ ------------------------------- Pogoje storitve preberite na https://letsencrypt.org/documents/LE- SA-v1.1.1-avgust-1-2016.pdf. Za registracijo pri strežniku ACME se morate strinjati na https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- ---------------------------------------------- Bi bili pripravljeni delite svoj e-poštni naslov z Fundacijo Electronic Frontier, ustanovnim partnerjem projekta Let's Encrypt in neprofitno organizacijo, ki razvija Certbot? Radi bi vam poslali e-pošto o EFF in našem delu za šifriranje spleta, zaščito njegovih uporabnikov in obrambo digitalnih pravic. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Vnesite ime (-e) svoje domene ( vejica in / ali presledka ločena) (Vnesite 'c' za preklic): build-centos.info Pridobitev novega potrdila Izvedba naslednjih izzivov: tls-sni-01 izziv za build-centos.info Čakanje na preverjanje ... Čiščenje izzivov POMEMBNO OPOMBE: - Čestitamo! Potrdilo in veriga sta bila shranjena na: /etc/letsencrypt/live/build-centos.info/fullchain.pem Vaša ključna datoteka je bila shranjena na: /etc/letsencrypt/live/build-centos.info/privkey.pem cert poteče 2018-01-24. Če želite v prihodnosti pridobiti novo ali spremenjeno različico tega potrdila, preprosto znova zaženite certbot. Če želite neinteraktivno obnoviti * vse * svojih potrdil, zaženite "certbot renew" - poverilnice vašega računa so bile shranjene v vašem konfiguracijskem imeniku Certbot na / etc / letsencrypt. Zdaj bi morali narediti varno varnostno kopijo te mape. Ta konfiguracijski imenik bo vseboval tudi potrdila in zasebne ključe, ki jih je pridobil Certbot, zato je idealna varnostna kopija te mape idealna. 

Za pravilno izdajo potrdila mora biti vaša domena obstoječa in usmerjena na ustrezni spletni strežnik.

Po izdaji potrdila znova zaženite spletni strežnik nginx in preverite rezultat.

# systemctl znova zaženite nginx

Povezava v brskalniku je varna.!

Če želite samodejno obnoviti potrdila, spremenite konfiguracijsko datoteko /etc/letsencrypt/renewal/build-centos.info.conf kot sledi:

# renew_before_expiry = 30 dni
različica = 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
veriga = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

# Možnosti, uporabljene v postopku obnove
[podaljšanje]
pristnosti = spletna stran
installer = Brez
račun = e9c86e6aa57b45f9614bc7c0015927a5
post_hook = nginx -s ponovno naloži
[[webroot_map]]
www.build-centos.info = /var/www/build-centos.info
build-centos.info = /var/www/build-centos.info

Ko spremenite datoteko, dodajte nalogo v krono:

30 2 * * * root / usr / bin / certbot obnovi --post-kavelj "nginx -s reload"

Da preverim, ali nginx deluje s php-om, sem ustvaril datoteko index.php in ji dodal:

Namestite MySQL / MariaDB na spletni strežnik

Ta korak bomo v celoti preskočili, saj na spletnem mestu že obstaja članek o namestitvi in ​​uglaševanju MariaDB. Izkoristite jo.

Konfiguriranje Nginx in PHP-FPM za projekte z veliko obremenitvijo

Da bi vaš spletni strežnik deloval z visoko zmogljivostjo in lahko obdelal večje število zahtev odjemalcev, ena strojna oprema ni dovolj. Pomembno je pravilno konfigurirati operacijo nginx in php-fpm.

Nginx nastavitev

Odpri datoteko /etc/nginx/nginx.conf in spremenite konfiguracijo Nginx na naslednji način:

  • delavski procesi 2; - nastavite število delovnih procesov enako številu jeder na strežniku.
  • delavske povezave 1024; - določa število povezav v enem delovnem toku. Nastavite vrednosti od 1024 do 4096.
  • uporabite epoll; - optimalna metoda povezave za Linux.
  • multi_accept vklopljen; - nginx bo sprejel največje število povezav.

HTTP blok:

  • tcp_nodelay vklopljen; - pošlje glave in začetek datoteke v eni seriji.
  • tcp_nopush vklopljen;

Za projekte, ki vsebujejo veliko število statičnih datotek, ne pozabite omogočiti stiskanja gzip:

gzip naprej;

Dodajte veliko število vrst datotek, tako da bodo vsi preverjanja googlespeed preverjanja:
gzip_types aplikacija / atom + xml aplikacija / javascript besedilo / javascript aplikacija / json aplikacija / ld + json aplikacija / manifest + json aplikacija / rss + xml aplikacija / vnd.geo + json font / ttf aplikacija / x-font-ttf aplikacija / vnd .ms-fontobject aplikacija / font-woff aplikacija / font-woff2 aplikacija / x-web-app-manifest + json aplikacija / xhtml + xml aplikacija / xml pisava / slika opentype / bmp image / svg + xml slika / x-text text / cache-manifest text / css text / plain text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-komponentno besedilo / x-cross-domain-policy;

Nastavitev stiskanja bo vaš projekt pospešil.

  • keepalive_timeout 30; - spletni strežnik bo počakal 30 sekund, preden bo zaprl povezavo
  • keepalive_requests 100; - največje dovoljeno število zahtev ene stranke
  • reset_timedout_connection vklopljen; - omogočite to možnost, če ne želite, da se povezava odjemalca, ki se je prenehala odzivati, ponastavi.
  • client_body_timeout 10; - spletni strežnik bo na potrditev zahteve odjemalca počakal 10 sekund, po tem času bo povezava ponastavljena.
  • send_timeout 2; - če odjemalec preneha brati odgovor s spletnega strežnika, bo nginx ponastavil povezavo z njim.

Če vaše spletno mesto ne omogoča prenosa velikih datotek, to omejite na nginx:

  • client_max_body_size 2m; - strežnik ne bo sprejel zahtev, večjih od 2 MB.

Če se vsebina v projektu ne spreminja tako pogosto, lahko uporabite predpomnjenje "poteče max;"Ali v konfiguracijsko datoteko gostitelja dodajte ustrezno možnost za želeno vrsto datoteke, na primer:

lokacija ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $
poteče 7d;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Predpomnilnik za določene vrste datotek bo shranjen 7 dni. S pomočjo te funkcije lahko nadzirate predpomnilnik. Po vseh spremembah ne pozabite znova zagnati nginx:

# systemctl znova zaženite nginx

Nastavitev php-fpm

Ko nameščate php-fpm, ste ga takoj prenesli v vtičnico unix. To daje znatno povečanje produktivnosti. Po ocenah produktivnost raste 2-3 krat. Preostale parametre php-fpm je treba konfigurirati za vsak projekt posebej, upoštevajte primer nastavitve za strežnik z 1024 MB pomnilnika.

Za php-fpm lahko damo približno 512 mb, ostalo pa pustimo pod bazo podatkov in nginx.

Za konfiguracijsko datoteko /etc/php-fpm/www.conf, dodaj:

  • pm.max_children = 18 - največje število otroških procesov
  • pm.start_servers = 6 - število otroških procesov, ustvarjenih ob zagonu
  • pm.min_spare_servers = 4 - minimalno število neaktivnih strežniških procesov
  • pm.max_spare_servers = 16 - največje število neaktivnih strežniških procesov
  • pm.max_requests = 400 - število zahtev nadrejenega postopka, po katerih se bo postopek znova zagnal.

Pri analizi obremenitve projekta morate spremeniti vse parametre, te vrednosti so teoretične.

Na trenutni strežnik sem takoj namestil najnovejšo različico CMS Bitrix in preizkusil delovanje. Po mojem mnenju je to CMS, ki najbolj porablja vire, in rezultati niso slabi, saj gre za navidezni stroj na KVM z enim jedrom (vCPU) in 1024 RAM-a:

Nisem slikala optimizacije nastavitev MariaDB, saj je na spletnem mestu ustrezen članek. V članku sem oblikoval parametre za my.cnf in baza podatkov je pokazala odlične rezultate.

Ko zaženete spletno mesto, boste s prostimi očmi opazili, da bo nginx + php-fpm obdelal vaše zahteve in vrnil strani veliko hitreje kot apache2 + mod_php. Če imate možnost izvajanja stresnih testov med namestitvijo strežnika, bo to nedvomno plus, če pa to ni mogoče, lahko spremenite nastavitve svojih virov na podlagi našega priročnika.