Настройка на продуктивен уеб сървър на NGINX + PHP-FPM

PHP-FPM (бърз мениджър на процеси) - Това е отделна реализация на FastCGI манипулатора за изпълнение на PHP скриптове. Въз основа на пакета от уеб сървъри NGINX (който обработва статиката) и PHP-FPM, можете да изградите по-бърз и по-бърз уеб сървър за вашите уеб проекти в сравнение с използването на класическия пакет NGINX, Apache и модула mod_php (LAMP стек).

LEMP - Набор софтуер с отворен код, който обикновено се инсталира заедно, за да работи на сървър, за да хоства уеб сайтове и уеб приложения. Това съкращение се отнася до набор от Linux OS с уеб сървър Nginx (той замества Apache в по-обикновен стек LAMP), с базата данни MySQL (MariaDB) и c PHP за обработка на динамични данни.

В тази статия ще помислим за инсталирането и оптимизирането на LEMP стека за хостване на зареден уеб проект на сървър с CentOS 7 на базата на пакет NGINX + PHP-FPM + MariaDB / MySQL + и да инсталираме Let's Encrypt сертификат за SSL сайта .

Съдържание:

  • Връзка с хранилище, актуализация на сървъра
  • Инсталиране и конфигуриране на уеб сървъра Nginx
  • Инсталирайте php-fpm и допълнителни php модули
  • Инсталирайте Нека да шифроваме и свържем сертификата
  • Инсталирайте MySQL / MariaDB на уеб сървър
  • Конфигуриране на Nginx и PHP-FPM за проекти с високо натоварване

Връзка с хранилище, актуализация на сървъра

Тъй като инсталацията се извършва на ново инсталиран сървър с CentOS, трябва да свържете популярното хранилище EPEL и да актуализирате всички пакети на сървъра.

# yum инсталирате epel-release -y
# yum актуализация -y

Репозиторият беше инсталиран, но не бяха намерени пакети за актуализация, защото беше инсталиран нов образ на CentOS.

Инсталиране и конфигуриране на уеб сървъра Nginx

За да инсталирате най-новата версия Nginx, свържете хранилището за програмисти, като изпълните командата:

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

Или чрез създаване на конфигурационен файл на хранилище /etc/yum.repos.d/nginx.repo със следното съдържание:

[nginx] name = nginx repo baseurl = http: //nginx.org/packages/centos/7/$basearch/ gpgcheck = 0 активирано = 1 

Ако използвате CentOS 8, променете версията в URL адреса.

Инсталирайте пакета за уеб сървър Nginx с помощта на мениджър на пакети yum (или dnf):

# yum инсталирате nginx -y

Сега можете да стартирате Nginx и го добавете към стартиране с помощта на systemctl:

# systemctl start nginx
# systemctl активиране nginx

Създадена символна връзка от /etc/systemd/system/multi-user.target.wants/nginx.service към /usr/lib/systemd/system/nginx.service.

За да проверите дали уеб сървърът работи, отворете IP адреса на сървъра в браузъра.

Ако тестовата ви страница не се отвори, проверете настройките за разрешени услуги, портове, зони в firewalld на вашия сървър.

Настройте конфигурационен файл за отделен домейн build-centos.info. Създайте отделна директория за сайта и самия конфигурационен файл:

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

Отворете конфигурационния файл:

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

И добавете следното съдържание към него:

сървър слушайте 80; име на сървър build-centos.info; корен /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; местоположение / връщане 301 https: //build-centos.info$request_uri;  местоположение ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ return 301 https: //build-centos.info$request_uri;  местоположение ~ \ .php $ return 301 https: //build-centos.info$request_uri;  location = /favicon.ico log_not_found off; access_log изключен;  location = /robots.txt rewrite ^ /robots.txt почивка; позволете на всички; log_not_found off; access_log изключен;  местоположение ~ /\.ht отрича всички;  сървър слушайте 80; име на сървър www.build-centos.info; пренапишете ^ https: //build-centos.info$request_uri? постоянен;  сървър слушайте 443 ssl http2; име на сървър build-centos.info; корен /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; 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- 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-Security 'max-age = 604800'; местоположение / try_files $ uri $ uri / /index.php?$args;  местоположение ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $ access_log off; изтича макс;  местоположение ~ \ .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; включва 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 включен; fastcgi_intercept_errors включен; бързоcgi_ignore_client_abort изключен; 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 изключен;  location = /robots.txt разреши всички; log_not_found off; access_log изключен;  местоположение ~ /\.ht отрича всички;  сървър liste 443 ssl http2; име на сървър www.build-centos.info; пренапишете ^ https: //build-centos.info$request_uri? постоянен;  

Конфигурационният файл съдържа настройки за достъп чрез защитен протокол https, тъй като много популярни CMS в момента работят по подразбиране чрез него. В бъдеще ще инсталираме и конфигурираме безплатен сертификат Let's Encrypt SSL (подобно на инсталирането на Let's Encrypt сертификат на IIS сайт в Windows Server).

Инсталирайте php-fpm и допълнителни php модули

Nginx няма вграден PHP манипулатор, така че трябва да инсталираме PHP-FPM и редица php модули, които ще бъдат използвани за обработка на PHP скриптове.

Php-FPM Това е много лесен и бърз PHP мениджър на процеси. Той не използва HTTP протокола (като apache) и работи със специалния FastCGI протокол. Благодарение на своята лекота и простота, FPM ви позволява да обработвате PHP заявки много по-бързо. В този случай, в сравнение с подобна конфигурация с apache, ще се използва много по-малко памет.

Nginx от своя страна дава значителна печалба във връщането на статиката. В нашата конфигурация, ngnix ще действа като прокси сървър (кеширане и сървър на предния край), а php-fpm ще действа като резервен.

За да инсталирате най-новите версии на php, използвайте REMI хранилището:

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

След инсталирането редактирайте файла /etc/yum.repos.d/remi-php74.repo:

Стартирайте инсталацията PHP-FPM и популярни php модули:

# yum инсталирате 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-soap php-zip

Стартирайте услугата PHP-FPM и го добавете към стартиране:

# systemctl стартиране на php-fpm
# systemctl активира php-fpm

Създадена символна връзка от /etc/systemd/system/multi-user.target.wants/php-fpm.service към /usr/lib/systemd/system/php-fpm.service.

За да проверите дали услугата е стартирана, можете да стартирате командата:

# lsof -i: 9000

КОМАНДА PID ПОТРЕБИТЕЛ FD ТИП УСТРОЙСТВО НА УСТРОЙСТВО / ИЗКЛЮЧВАНЕ НАМЕЧАНИЕ 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: cslistep (95 LISTEN) TCP localhost: cslistener (LISTEN)

обслужване PHP-FPM трябва да преминете през Unix гнездо. Във конфигурационния файл /etc/php-fpm.d/www.conf изтрийте реда слушане = 127.0.0.1:9000 и добавете:

слушай = /var/run/php-fpm/php-fpm.sock liste.mode = 0660 liste.owner = nginx liste.group = nginx

За да стартирате php-fpm не от потребителя на апаш (по подразбиране), посочете следните параметри в конфигурационния файл:

потребител = nginx група = nginx

След промяна на конфигурацията php-fpm, трябва да рестартирате услугата:

# systemctl рестартирайте php-fpm

Инсталирайте Нека да шифроваме и свържем сертификата

За да издадете безплатен сертификат Let Encrypt, трябва да инсталирате необходимия certbot.

# yum инсталирате certbot

След това направете:

# certbot certonly

След като изпълните командата, ще трябва да попълните всички данни, като посочите пощенската кутия, домейна и т.н.:

# certbot certonly

Записване на журнала за отстраняване на грешки в /var/log/letsencrypt/letsencrypt.log Как бихте искали да се удостоверите с ACME CA? -------------------------------------------------- ----------------------------- 1: Завъртете временен уеб сървър (самостоятелен) 2: Поставете файлове в директорията webroot (webroot) - -------------------------------------------------- ---------------------------- Изберете подходящия номер [1-2], след това [въведете] (натиснете 'c', за да отмените): 1 Избрани плъгини: Автентификатор самостоятелен, Инсталатор Няма .org ------------------------------------------------ ------------------------------- Моля, прочетете Общите условия на https://letsencrypt.org/documents/LE- SA-V1.1.1 на август-1-2016.pdf. Трябва да се съгласите, за да се регистрирате в ACME сървъра на https://acme-v01.api.letsencrypt.org/directory ----------------------- -------------------------------------------------- ------ (A) gree / (C) ancel: A --------------------------------- ---------------------------------------------- Бихте ли желали да споделите своя имейл адрес с Фондацията за електронни граници, основополагащ партньор на проекта „Да кодираме“ и с нестопанската организация, която развива Certbot? Бихме искали да ви изпратим имейл за EFF и нашата работа за криптиране на мрежата, защита на нейните потребители и защита на цифрови права. -------------------------------------------------- ----------------------------- (Y) es / (N) o: N Моля, въведете името или съответно домейна си ( запетая и / или място разделено) (Въведете „c“, за да отмените): build-centos.info Получаване на нов сертификат Изпълнение на следните предизвикателства: tls-sni-01 предизвикателство за build-centos.info Изчакване за проверка ... Почистване на предизвикателства ВАЖНО ЗАБЕЛЕЖКИ: - Поздравления! Вашият сертификат и верига са запазени на: /etc/letsencrypt/live/build-centos.info/fullchain.pem Вашият ключов файл е запазен на: /etc/letsencrypt/live/build-centos.info/privkey.pem cert ще изтече на 2018-01-24. За да получите нова или оправена версия на този сертификат в бъдеще, просто стартирайте отново certbot. За да подновите интерактивно * всички * на вашите сертификати, стартирайте „certbot подновяване“ - Данните за акаунта ви са запазени в конфигурационната ви директория на Certbot на адрес / etc / letsencrypt. Вече трябва да направите защитено архивиране на тази папка. Тази конфигурационна директория ще съдържа също сертификати и частни ключове, получени от Certbot, така че правилните резервни копия на тази папка са идеални. 

За да бъде сертификатът правилно издаден, вашият домейн трябва да съществува и да бъде насочен към съответния уеб сървър.

След издаване на сертификата рестартирайте уеб сървъра nginx и проверете резултата.

# systemctl рестартирайте nginx

Връзката в браузъра е защитена.!

За да подновите автоматично сертификатите, променете конфигурационния файл /etc/letsencrypt/renewal/build-centos.info.conf както следва:

# renew_before_expiry = 30 дни
версия = 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
верига = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

# Опции, използвани в процеса на подновяване
[Renewalparams]
authentator = webroot
инсталатор = Няма
account = e9c86e6aa57b45f9614bc7c0015927a5
post_hook = nginx -s презареждане
[[Webroot_map]]
www.build-centos.info = /var/www/build-centos.info
build-centos.info = /var/www/build-centos.info

След като промените файла, добавете задачата към короната:

30 2 * * * root / usr / bin / certbot поднови --post-кука "nginx -s reload"

За да проверя дали nginx работи с php, създадох файл index.php и го добавих:

Инсталирайте MySQL / MariaDB на уеб сървър

Тази стъпка ще пропуснем напълно, тъй като сайтът вече има статия за инсталирането и настройката MariaDB. Възползвайте се от нея.

Конфигуриране на Nginx и PHP-FPM за проекти с високо натоварване

За да може вашият уеб сървър да работи с висока производителност и да може да обработва голям брой заявки от клиенти, един хардуер не е достатъчен. Важно е правилното конфигуриране на работата на пакета Nginx и PHP-FPM.

Настройка на Nginx

Отваряне на файл /etc/nginx/nginx.conf и променете конфигурацията на Nginx, както следва:

  • работник_процеси 2; - задайте броя на работните процеси, равен на броя на ядрата на сървъра.
  • работни връзки 1024; - определя броя на връзките в един работен процес. Задайте стойности от 1024 до 4096.
  • използвайте epoll; - оптимален метод за свързване за Linux.
  • multi_accept включен; - nginx ще приеме максималния брой връзки.

HTTP блок:

  • tcp_nodelay включен; - изпраща заглавки и старт на файла в една партида.
  • tcp_nopush включен;

За проекти, които съдържат голям брой статични файлове, не забравяйте да активирате gzip компресия:

gzip на;

Добавете голям брой типове файлове, така че всички проверки на googlespeed да преминат:
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 / plain text / vcard text / vnd.rim.location.xloc text / vnd.wap.wml text / vtt text / x-компонент text / x-cross-domain-policy;

Настройката за компресия ще ускори вашия проект.

  • keepalive_timeout 30; - уеб сървърът ще изчака 30 секунди, преди да затвори keepalive връзката
  • keepalive_requests 100; - максимален брой заявки на keepalive от един клиент
  • reset_timedout_connection включен; - активирайте тази опция, ако не искате връзката от клиента, който е спрял да отговаря, да бъде нулирана.
  • client_body_timeout 10; - уеб сървърът ще изчака 10 секунди за потвърждение на заявката от клиента, след това време връзката ще бъде нулирана.
  • send_timeout 2; - ако клиентът спре да чете отговора от уеб сървъра, nginx ще нулира връзката с него.

Ако вашият сайт не предвижда изтегляне на големи файлове, ограничете това до nginx:

  • client_max_body_size 2m; - сървърът няма да приема заявки над 2 MB.

Ако съдържанието на вашия проект не се променя толкова често, можете да използвате кеширане "изтича макс;„Или добавете подходящата опция към вашия конфигурационен файл на хоста за желания тип файл, например:

местоположение ~ * ^. +. (js | css | png | jpg | jpeg | gif | ico | woff) $
изтича 7г;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Кешът за посочените типове файлове ще се съхранява 7 дни. Можете да контролирате кеша, като използвате тази функция. След всички модификации, не забравяйте да рестартирате nginx:

# systemctl рестартирайте nginx

Настройка на php-fpm

Когато инсталирате php-fpm, веднага го прехвърлихте в unix сокет. Това дава значително увеличение на производителността. Според оценките, производителността нараства 2-3 пъти. Останалите параметри на php-fpm трябва да бъдат конфигурирани за всеки проект поотделно, помислете за примерна настройка за сървър с 1024 MB памет.

За php-fpm можем да отделим около 512 mb, оставяйки останалите под базата данни и nginx.

Към конфигурационния файл /etc/php-fpm/www.conf, добави:

  • pm.max_children = 18 - максимален брой детски процеси
  • pm.start_servers = 6 - брой дъщерни процеси, създадени при стартиране
  • pm.min_spare_servers = 4 - минимален брой неактивни сървърни процеси
  • pm.max_spare_servers = 16 - максимален брой неактивни сървърни процеси
  • pm.max_requests = 400 - броя на исканията на дъщерния процес, след което процесът ще бъде рестартиран.

Всички параметри трябва да бъдат променени, когато анализирате натоварването на вашия проект, тези стойности са теоретични.

На текущия сървър веднага инсталирах най-новата версия на CMS Bitrix, за да тествам производителността. Според мен това е CMS с най-много ресурси и резултатите не са лоши, като се има предвид, че това е виртуална машина на KVM с едно ядро ​​(vCPU) и 1024 RAM:

Не рисувах оптимизация на настройките на MariaDB, тъй като има съответна статия в сайта. Създадох параметрите за my.cnf според статията и базата данни показа отлични резултати.

Когато стартирате сайта, ще забележите с невъоръжени очи, че nginx + php-fpm ще обработва вашите заявки и ще връща страници много по-бързо от apache2 + mod_php. Ако имате възможност да провеждате стрес тестове по време на настройката на сървъра, тогава това несъмнено ще бъде плюс, но ако това не е възможно, можете да промените настройките за вашите ресурси въз основа на нашето ръководство.