Postavljanje produktivnog web poslužitelja na NGINX + PHP-FPM

PHP-FPM (Fast Process Manager) - Ovo je zasebna implementacija alata FastCGI za izvršavanje PHP skripti. Na temelju snopa NGINX web poslužitelja (koji obrađuje statiku) i PHP-FPM-a, možete izgraditi brži i brži web poslužitelj za svoje web projekte u usporedbi s klasičnim NGINX paketom, Apacheom i mod_php modulom (LAMP stack).

Lemp - Skup softvera s otvorenim kodom koji se obično instalira zajedno da bi se pokrenuo na poslužitelju za host web stranica i web aplikacija. Ova kratica odnosi se na skup Linux OS-a s web poslužiteljem Nginx (zamjenjuje apaš u češćem hrpu LAMP), s bazom podataka MySQL (MariaDB) i c pHP za obradu dinamičkih podataka.

U ovom ćemo članku razmotriti instalaciju i optimizaciju LEMP skupa da ugostimo učitani web projekt na poslužitelju sa CentOS 7 na temelju NGINX + PHP-FPM + MariaDB / MySQL + paketa i instaliramo Let's Encrypt certifikat za SSL web mjesto .

sadržaj:

  • Veza s spremištem, ažuriranje poslužitelja
  • Instalacija i konfiguriranje Nginx web poslužitelja
  • Instalirajte php-fpm i dodatne php module
  • Instaliraj Let's Šifriraj i povežite certifikat
  • Instalirajte MySQL / MariaDB na web poslužitelj
  • Konfiguriranje Nginx i PHP-FPM-a za projekte visokog opterećenja

Veza s spremištem, ažuriranje poslužitelja

Budući da se instalacija izvodi na novoinstaliranom poslužitelju sa CentOS-om, morate povezati popularno EPEL spremište i ažurirati sve pakete na poslužitelju.

# yum instalirajte epel-release -y
# yum ažuriranje -y

Spremište je instalirano, ali paketi za ažuriranje nisu pronađeni jer je instalirana svježa slika CentOS-a.

Instalacija i konfiguriranje Nginx web poslužitelja

Da biste instalirali najnoviju verziju Nginx, povežite spremište programera pokretanjem naredbe:

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

Ili stvaranjem konfiguracijske datoteke spremišta /etc/yum.repos.d/nginx.repo sa sljedećim sadržajem:

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

Ako koristite CentOS 8, promijenite verziju u URL-u.

Instalirajte Nginx paket web poslužitelja pomoću yum (ili dnf) upravitelja paketa:

# yum instalirajte nginx -y

Sada možete trčati Nginx i dodajte ga pokretanju pomoću systemctl:

# systemctl start nginx
# systemctl omogući nginx

Napravljeno je povezanost od /etc/systemd/system/multi-user.target.wants/nginx.service do /usr/lib/systemd/system/nginx.service.

Da biste provjerili da web poslužitelj radi, otvorite IP adresu poslužitelja u pregledniku.

Ako se testna stranica ne otvori, provjerite postavke za dopuštene usluge, portove, zone u firewalld-u na vašem poslužitelju.

Postavljanje konfiguracijske datoteke za zasebni domen build-centos.info. Izradite zasebni direktorij za web mjesto i samu konfiguracijsku datoteku:

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

Otvorite konfiguracijsku datoteku:

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

I dodajte mu sljedeći sadržaj:

poslužitelj liste 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 / povratak 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 isključen;  location = /robots.txt prepisati ^ /robots.txt pauza; dopustiti svima; log_not_found off; access_log isključen;  lokacija ~ /\.ht odbiti sve;  poslužitelj liste 80; ime servera www.build-centos.info; prepisati ^ https: //build-centos.info$request_uri? trajno;  server liste 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:! EXPORT:! DES:! RC4:! MD5:! PSK:! AECDH: EDH-DSS-DES-CBC3-SHA :! EDH-RSA-DES-CBC3-SHA: KRB5-DES-CBC3-SHA '; add_header Strict-Transport-Sigurnost 'max-age = 604800'; location / try_files $ uri $ uri / /index.php?$args;  lokacija ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log isključen; istječ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; uključuju 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 uključen; fastcgi_intercept_errors uključen; fastcgi_ignore_client_abort isključen; 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;  lokacija = /favicon.ico log_not_found off; access_log isključen;  lokacija = /robots.txt dopusti sve; log_not_found off; access_log isključen;  lokacija ~ /\.ht odbiti sve;  poslužitelj liste 443 ssl http2; ime servera www.build-centos.info; prepisati ^ https: //build-centos.info$request_uri? trajno;  

Konfiguracijska datoteka sadrži postavke za pristup putem sigurnog https protokola, jer mnogi popularni CMS trenutno rade prema zadanim postavkama. U budućnosti ćemo instalirati i konfigurirati besplatni certifikat Let's Encrypt SSL (slično instalaciji Let's Encrypt certifikata na IIS mjestu u sustavu Windows Server).

Instalirajte php-fpm i dodatne php module

Nginx nema ugrađeni PHP handler, pa ga moramo instalirati PHP-FPM i određeni broj php modula koji će se koristiti za obradu PHP skripti.

PHP-FPM Ovo je vrlo jednostavan i brz PHP menadžer procesa. Ne koristi HTTP protokol (poput apache), a radi s posebnim FastCGI protokolom. Zbog svoje lakoće i jednostavnosti, FPM vam omogućuje da brže obrađujete PHP zahtjeve. U ovom slučaju, u usporedbi sa sličnom konfiguracijom s apache, koristit će se puno manje memorije.

Nginx zauzvrat donosi značajan dobitak u vraćanju statike. U našoj konfiguraciji ngnix će djelovati kao proxy poslužitelj (predmemoriranje i prednji poslužitelj), a php-fpm će raditi kao pomoćni poslužitelj.

Da biste instalirali najnovije verzije php-a, koristite REMI skladište:

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

Nakon instalacije uredite datoteku /etc/yum.repos.d/remi-php74.repo:

Pokrenite instalaciju PHP-FPM i popularni php moduli:

# yum instalirajte php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-sapun php-zip

Pokrenite uslugu PHP-FPM i dodajte ga pokretanju:

# systemctl start php-fpm
# systemctl omogućuju php-fpm

Napravljeno je povezanost od /etc/systemd/system/multi-user.target.wants/php-fpm.service do /usr/lib/systemd/system/php-fpm.service.

Da biste provjerili je li usluga pokrenuta, možete pokrenuti naredbu:

# lsof -i: 9000

KOMAND PID KORISNIK FD TIP UREĐAJA VELIČINA / ISKLJUČUJE NODE NAZIV php-fpm 1551 korijen 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: cslistep (LISTEN) TCP localhost: cslistener (LISTEN)

usluga PHP-FPM treba proći kroz Unix utičnicu. U konfiguracijskoj datoteci /etc/php-fpm.d/www.conf izbriši liniju liste = 127.0.0.1:9000 i dodaj:

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

Da biste pokrenuli php-fpm ne od korisnika apache (prema zadanim postavkama), navedite sljedeće parametre u konfiguracijskoj datoteci:

korisnik = nginx grupa = nginx

Nakon što promijenite konfiguraciju php-fpm, trebate ponovo pokrenuti uslugu:

# systemctl ponovno pokrenite php-fpm

Instaliraj Let's Šifriraj i povežite certifikat

Da biste izdali besplatni certifikat Let Encrypt, morate instalirati potreban certbot.

# yum instalirajte certbot

Zatim učinite:

# certbot certonly

Nakon izvršenja naredbe, morat ćete ispuniti sve podatke, specificirajući poštanski pretinac, domenu i tako dalje:

# certbot certonly

Spremanje dnevnika uklanjanja pogrešaka u /var/log/letsencrypt/letsencrypt.log Kako biste željeli autentificirati ACME CA? -------------------------------------------------- ----------------------------- 1: Stvaranje privremenog web poslužitelja (samostalni) 2: Postavite datoteke u webroot direktorij (webroot) - -------------------------------------------------- ---------------------------- Odaberite odgovarajući broj [1-2], a zatim [unesite] (pritisnite 'c' za odustajanje): 1 Dodaci su odabrani: Authenticator samostalni, Installer None Unesite adresu e-pošte (koristi se za hitnu obnovu i obavijesti o sigurnosti) (unesite 'c' za otkazivanje): [email protected] Pokretanje nove HTTPS veze (1): acme-v01.api.letsencrypt .org ------------------------------------------------ ------------------------------- Molimo pročitajte Uvjete pružanja usluge na https://letsencrypt.org/documents/LE- SA-v1.1.1 kolovoza-1-2016.pdf. Morate se složiti kako biste se registrirali na ACME poslužitelju na https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- ---------------------------------------------- Biste li voljni da biste svoju e-mail adresu podijelili sa Electronic Frontier Foundation, osnivačim projektom Let's Encrypt projekta i neprofitnom organizacijom koja razvija Certbot? Željeli bismo vam poslati e-poštu o EFF-u i našem radu na šifriranju weba, zaštiti njegovih korisnika i obrani digitalnih prava. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Unesite svoje ime domene ( zarez i / ili razmak odvojeni) (Unesite "c" za otkazivanje): build-centos.info Dobivanje novog certifikata Izvođenje slijedećih izazova: tls-sni-01 izazov za build-centos.info Čekanje na provjeru ... Čišćenje izazova VAŽNO NAPOMENE: - Čestitamo! Vaša potvrda i lanac spremljeni su na: /etc/letsencrypt/live/build-centos.info/fullchain.pem Vaša ključna datoteka spremljena je na: /etc/letsencrypt/live/build-centos.info/privkey.pem cert istječe 2018-01-24. Da biste ubuduće dobili novu ili ugađanu verziju ovog certifikata, jednostavno ponovo pokrenite certbot. Da biste neinteraktivno obnovili * sve * svoje certifikate, pokrenite "certbot renew" - Akreditivi vašeg računa spremljeni su u vaš konfiguracijski imenik Certbot na / etc / letsencrypt. Sada biste trebali napraviti sigurnu sigurnosnu kopiju ove mape. Ovaj će se konfiguracijski direktorij također nalaziti sa certifikatima i privatnim ključevima dobivenim od Certbota, pa je idealna izrada redovitih sigurnosnih kopija ove mape. 

Da bi certifikat bio ispravno izdan, vaša domena mora postojati i biti usmjerena na odgovarajući web poslužitelj.

Nakon izdavanja potvrde, ponovno pokrenite nginx web poslužitelj i provjerite rezultat.

# systemctl ponovno pokrenite nginx

Veza u pregledniku je sigurna.!

Da biste automatski obnovili potvrde, promijenite konfiguracijsku datoteku /etc/letsencrypt/renewal/build-centos.info.conf kako slijedi:

# renew_before_expiry = 30 dana
inač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
lanac = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

# Opcije koje se koriste u postupku obnove
[Renewalparams]
autentifikator = webroot
installer = None
račun = e9c86e6aa57b45f9614bc7c0015927a5
post_hook = nginx -s ponovno učitavanje
[[Webroot_map]]
www.build-centos.info = /var/www/build-centos.info
build-centos.info = /var/www/build-centos.info

Nakon što promijenite datoteku, dodajte zadatak kruni:

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

Da bih potvrdio da nginx radi s php-om, stvorio sam datoteku index.php i dodao je:

Instalirajte MySQL / MariaDB na web poslužitelj

Ovaj korak ćemo u potpunosti preskočiti, jer stranica već ima članak o instaliranju i podešavanju MariaDB. Iskoristite je.

Konfiguriranje Nginx i PHP-FPM-a za projekte visokog opterećenja

Kako bi vaš web poslužitelj mogao raditi s visokim performansama i biti u mogućnosti obraditi veliki broj zahtjeva klijenata, jedan hardver nije dovoljan. Važno je pravilno konfigurirati rad hrpe Nginx i PHP-FPM.

Postavljanje Nginx-a

Otvori datoteku /etc/nginx/nginx.conf i promijenite konfiguraciju Nginx na sljedeći način:

  • radnički_procesi 2; - postavite broj radnih procesa jednak broju jezgara na poslužitelju.
  • radnički_poveznice 1024; - određuje broj veza u jednom tijeku rada. Postavite vrijednosti od 1024 do 4096.
  • koristiti epoll; - optimalna metoda povezivanja za Linux.
  • multi_accept uključen; - nginx će prihvatiti maksimalni broj veza.

HTTP blok:

  • tcp_nodelay uključen; - šalje zaglavlja i početak datoteke u jednoj grupi.
  • tcp_nopush uključen;

Za projekte koji sadrže veliki broj statičkih datoteka, obavezno omogućite kompresiju gzip:

gzip na;

Dodajte veliki broj vrsta datoteka tako da prođu sve provjere googlespeed-a:
gzip_types aplikacija / atom + xml aplikacija / javascript tekst / 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 font / opentype image / bmp image / svg + xml image / x-text text / cache-manifest text / css text / plain text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-komponentni tekst / x-cross-domain-policy;

Postavka kompresije ubrzat će vaš projekt.

  • keepalive_timeout 30; - web poslužitelj će pričekati 30 sekundi prije zatvaranja keepalive veze
  • keepalive_requests 100; - maksimalni broj zahtjeva za spremanje jednog klijenta
  • reset_timedout_connection uključen; - omogućite ovu opciju ako ne želite da se resetira veza s klijenta koja je prestala reagirati.
  • client_body_timeout 10; - web poslužitelj će pričekati 10 sekundi za potvrdu zahtjeva od strane klijenta, nakon tog vremena veza će se resetirati.
  • send_timeout 2; - ako klijent prestane čitati odgovor s web poslužitelja, nginx će resetirati vezu s njim.

Ako vaša web lokacija ne omogućuje preuzimanje velikih datoteka, ograničite to na nginx:

  • client_max_body_size 2m; - poslužitelj neće prihvatiti zahtjeve veće od 2 MB.

Ako se sadržaj vašeg projekta ne mijenja tako često, možete koristiti predmemoriranje "istječe max;"Ili dodajte odgovarajuću opciju u konfiguracijsku datoteku svog računala za željenu vrstu datoteke, na primjer:

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

Predmemorija za navedene vrste datoteka bit će pohranjena 7 dana. Pomoću ove funkcije možete upravljati predmemorijom. Nakon svih izmjena, ne zaboravite ponovo pokrenuti nginx:

# systemctl ponovno pokrenite nginx

Postavljanje Php-fpm-a

Kad instalirate php-fpm, odmah ste ga prenijeli u unix utičnicu. To daje značajno povećanje produktivnosti. Prema procjenama, produktivnost raste 2-3 puta. Ostatak php-fpm parametara potrebno je konfigurirati za svaki projekt zasebno, pogledajte primjer postavljanja za poslužitelj s 1024 MB memorije.

Za php-fpm možemo izdvojiti oko 512 mb, a ostatak ćemo ostaviti pod bazom podataka i nginx.

Za konfiguracijsku datoteku /etc/php-fpm/www.conf, dodati:

  • pm.max_children = 18 - maksimalni broj dječjih procesa
  • pm.start_servers = 6 - broj dječjih procesa stvorenih pri pokretanju
  • pm.min_spare_servers = 4 - minimalni broj neaktivnih procesa na poslužitelju
  • pm.max_spare_servers = 16 - maksimalni broj neaktivnih procesa na poslužitelju
  • pm.max_requests = 400 - broj zahtjeva podređenog procesa nakon čega će se postupak ponovo pokrenuti.

Svi parametri moraju se mijenjati tijekom analize opterećenja na vašem projektu, te su vrijednosti teoretske.

Na trenutni poslužitelj odmah sam instalirao najnoviju verziju CMS Bitrix-a za testiranje performansi. Po mom mišljenju, ovo je CMS koji najviše troši resurse i rezultati nisu loši, obzirom da je ovo virtualni stroj na KVM-u s jednom jezgrom (vCPU) i 1024 RAM-a:

Nisam slikao optimizaciju postavki MariaDB-a, jer na web stranici postoji odgovarajući članak. Sastavio sam parametre za my.cnf prema članku i baza podataka pokazala je izvrsne rezultate.

Kada pokrenete stranicu, vidjet ćete golim očima da će nginx + php-fpm obraditi vaše zahtjeve i vratiti stranice mnogo brže od apache2 + mod_php. Ako tijekom postavljanja poslužitelja imate priliku provoditi stres testove, to će nesumnjivo biti plus, ali ako to nije moguće, možete promijeniti postavke svojih resursa na temelju našeg priručnika.