Verification: a143cc29221c9be0

Nginx php fpm мы apache php mysql

Nginx php fpm мы apache php mysql

Введение

Перед тем, как начать изучение этого руководства, убедитесь, что вы вошли в систему как пользователь с правами sudo .

Установка PHP 7.2 с Apache

Если вы используете Apache в качестве веб-сервера для установки PHP и модуля Apache PHP, выполните следующую команду:

sudo apt install php libapache2-mod-php 

   После установки пакетов перезапустите службу Apache:

sudo systemctl restart apache2 

Установка PHP 7.2 с Nginx

В отличие от Apache, Nginx не имеет встроенной поддержки обработки файлов PHP, поэтому нам нужно установить отдельное приложение, такое как PHP FPM («менеджер процессов fastCGI»), которое будет обрабатывать файлы PHP.

Чтобы установить пакеты PHP и PHP FPM, выполните следующую команду:

sudo apt install php-fpm 

   После установки пакетов вы можете проверить статус службы PHP FPM с помощью:

systemctl status php7.2-fpm 
* php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-06-30 23:56:14 PDT; 1min 28s ago
     Docs: man:php-fpm7.2(8)
 Main PID: 10080 (php-fpm7.2)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
    Tasks: 3 (limit: 2321)
   CGroup: /system.slice/php7.2-fpm.service
           |-10080 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
 

   Теперь вы можете отредактировать блок сервера Nginx и добавить следующие строки, чтобы Nginx мог обрабатывать файлы PHP:

server {

    # . . . other code

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
} 

sudo systemctl restart nginx 

Установка расширений PHP

Чтобы расширить основные функции PHP, вы можете установить некоторые дополнительные расширения. Расширения PHP доступны в виде пакетов и могут быть легко установлены с помощью:

sudo apt install php-[extname] 


Например, если вы хотите установить расширения MySQL и GD PHP, вы должны выполнить следующую команду:

sudo apt install php-mysql php-gd 

После установки нового расширения PHP не забудьте перезапустить Apache или службу PHP FPM, в зависимости от ваших настроек.

Тестирование обработки PHP

Чтобы проверить, правильно ли настроен ваш веб-сервер для обработки PHP, создайте новый файл с именем info.php внутри /var/www/html каталога со следующим кодом:

/var/www/html/info.php

Сохраните файл, откройте нужный браузер и посетите http://your_server_ip/info.php

phpinfo Функция будет печатать информацию о конфигурации PHP , как показано на рисунке ниже:


Установка PHP 7.3 в Ubuntu 18.04

PHP 7.3 - это последняя стабильная версия PHP. Выполните следующие действия, чтобы установить PHP 7.3 в Ubuntu 18.04.

  1. Начните с включения репозитория Ondrej PHP:

    sudo apt install software-properties-common sudo add-apt-repository ppa:ondrej/php 
    
    
  2. Установите PHP 7.3 и некоторые из наиболее распространенных модулей PHP:

    sudo apt install php7.3 php7.3-common php7.3-opcache php7.3-cli php7.3-gd php7.3-curl php7.3-mysql 
    
    
  3. Чтобы проверить установку, выполните следующую команду, которая распечатает версию PHP:

    php -v 
    PHP 7.3.1-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Jan 13 2019 10:19:33) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
        with Zend OPcache v7.3.1-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies 
    
    

Установка PHP 7.1 в Ubuntu 18.04

Используйте PHP 7.1 только в том случае, если вы собираетесь устанавливать приложения, несовместимые с PHP 7.2.

Чтобы установить PHP 7.1, выполните следующие действия:

  1. Включите репозиторий Ondrej PHP, набрав:

    sudo apt install software-properties-common sudo add-apt-repository ppa:ondrej/php 
    
    
  2. Установите PHP 7.1 и несколько наиболее распространенных модулей PHP:

    sudo apt install php7.1 php7.1-common php7.1-opcache php7.1-mcrypt php7.1-cli php7.1-gd php7.1-curl php7.1-mysql 
    
    
  3. Проверьте установку, набрав:

    php -v 
    PHP 7.1.20-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Jul 25 2018 10:07:09) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
      with Zend OPcache v7.1.20-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies 
    
    

1: Установка PHP 7.2 и PHP 7.3

Выполнив предварительные требования к мануалу, мы можем установить PHP версий 7.2 и 7.3, а также PHP-FPM и несколько дополнительных расширений. Для начала нам необходимо включить репозиторий Ondrej PHP.

Прежде чем добавить репозиторий в свою систему, установите software-properties-common:

sudo apt-get install software-properties-common -y

Этот пакет предоставляет команду apt-add-repository, с помощью которой вы сможете добавить PPA-репозиторий ondrej/php.

Теперь добавьте репозиторий ondrej/php в вашу систему. Этот PPA (Personal Package Archive) содержит более современные версии PHP, чем официальные репозитории Ubuntu, а также позволит вам установить несколько версий PHP в одной системе.

sudo add-apt-repository ppa:ondrej/php

Обновите репозиторий:

sudo apt-get update -y

Затем установите php7.2, php7.2-fpm, php7.2-mysql, libapache2-mod-php7.2 и libapache2-mod-fcgid с помощью следующей команды:

sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 libapache2-mod-fcgid -y

  • php7.2 – это метапакет, который можно использовать для запуска приложений PHP.
  • php7.2-fpm предоставляет интерпретатор Fast Process Manager, который работает как демон и принимает запросы Fast/CGI.
  • php7.2-mysql подключает PHP к базе данных MySQL.
  • libapahce2-mod-php7.2 предоставляет PHP модуль для веб-сервера Apache.
  • libapache2-mod-fcgid содержит идентификатор mod_fcgid, который запускает несколько экземпляров программы CGI для обработки одновременных запросов.

Теперь повторите весь процесс для PHP версии 7.3. Установите php7.3, php7.3-fpm, php7.3-mysql и libapache2-mod-php7.3:

sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y

После установки обеих версий PHP запустите сервис php7.2-fpm:

sudo systemctl start php7.2-fpm

Затем проверьте статус этого сервиса с помощью следующей команды:

sudo systemctl status php7.2-fpm

Вы увидите следующий результат:

php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-06-05 11:25:07 UTC; 1min 38s ago
Docs: man:php-fpm7.2(8)
Main PID: 13703 (php-fpm7.2)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 2353)
Memory: 6.2M
CGroup: /system.slice/php7.2-fpm.service
├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
├─13719 php-fpm: pool www
└─13720 php-fpm: pool www
Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...
Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

Повторите этот процесс для версии 7.3; запустите сервис php7.3-fpm:

sudo systemctl start php7.3-fpm

А затем проверьте состояние сервиса с помощью следующей команды:

sudo systemctl status php7.3-fpm

Вы увидите следующий результат:

php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago
Docs: man:php-fpm7.3(8)
Process: 23470 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.3/fpm/pool.d/www.conf 73 (code=ex>
Main PID: 23452 (php-fpm7.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 2353)
Memory: 7.1M
CGroup: /system.slice/php7.3-fpm.service
├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─23468 php-fpm: pool www
└─23469 php-fpm: pool www
Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager...
Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 FastCGI Process Manager.

В заключение вам нужно включить пару модулей, чтобы сервис Apache2 мог поддерживать несколько версий PHP одновременно:

sudo a2enmod actions fcgid alias proxy_fcgi

  • actions используется для выполнения сценариев CGI на основе типа медиа или метода запроса.
  • fcgid – это высокопроизводительная альтернатива mod_cgi, которая запускает достаточное количество экземпляров программы CGI для обработки одновременных запросов.
  • alias обеспечивает отображение различных частей файловой системы хоста в дереве документов и перенаправление URL.
  • proxy_fcgi позволяет Apache перенаправлять запросы в PHP-FPM.

Перезапустите Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Теперь на вашем сервере есть две версии PHP. После этого мы можем создать структуру каталогов для каждого сайта, который должен обслуживаться этим сервером.

2: Создание структуры каталогов для сайтов

Теперь мы создадим корневые каталоги для каждого сайта, который будет развернут на этом сервере. В нашем мануале мы развернем 2 сайта: site1.your_domain и site2.your_domain. Создавая каталоги, укажите домены ваших сайтов.

sudo mkdir /var/www/site1.your_domain
sudo mkdir /var/www/site2.your_domain

По умолчанию веб-сервер Apache запускается как пользователь и группа www-data. Чтобы убедиться, что права собственности и доступа на корневые каталоги сайтов установлены верно, выполните следующие команды:

sudo chown -R www-data:www-data /var/www/site1.your_domain
sudo chown -R www-data:www-data /var/www/site2.your_domain
sudo chmod -R 755 /var/www/site1.your_domain
sudo chmod -R 755 /var/www/site2.your_domain

Затем внутри каждого корневого каталога мы создадим файл info.php. Позже он поможет нам отобразить информацию о версии PHP каждого веб-сайта. Начните с site1:

sudo nano /var/www/site1.your_domain/info.php

Добавьте в файл следующую строку:

php phpinfo(); ?>

Сохраните и закройте файл. Теперь скопируйте созданный вами файл info.php для site2:

sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

Теперь у вас есть корневые каталоги, необходимые каждому сайту для обслуживания данных. Затем мы настроим свой веб-сервер Apache для поддержки двух разных версий PHP.

3: Настройка Apache для поддержки двух сайтов

В этом разделе мы создадим два конфигурационных файла виртуального хоста. Это позволит двум веб-сайтам одновременно работать с двумя разными версиями PHP.

Чтобы Apache обслуживал этот контент, необходимо создать файл виртуального хоста с правильными директивами. Вместо того чтобы редактировать стандартный виртуальный хост /etc/apache2/sites-available/000-default.conf, мы создадим два новых файла в каталоге /etc/apache2/sites-available/.

Сначала создайте конфигурационный файл виртуального хоста для сайта site1.your_domain. Здесь мы настроим Apache для обработки контента с помощью php7.2.

sudo nano /etc/apache2/sites-available/site1.your_domain.conf

Вставьте в файл следующие строки. Убедитесь, что вы указали правильный путь к корневому каталогу, ServerName и версию PHP.


ServerAdmin admin@site1.your_domain
ServerName site1.your_domain
DocumentRoot /var/www/site1.your_domain
DirectoryIndex info.php

Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all


# From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"

ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined

В DocumentRoot укажите путь к корневому каталогу вашего веб-сайта. В ServerAdmin укажите адрес электронной почты для администратора сайта your_domain. В директиве ServerName определяется URL-адрес первого поддомена. Директива SetHandler позволяет запускать PHP как процесс fastCGI.

Сохраните и закройте файл.

Затем создайте новый конфигурационный файл виртуального хоста для сайта site2.your_domain. Этот поддомен будет обслуживаться версией php7.3.

sudo nano /etc/apache2/sites-available/site2.your_domain.conf

Добавьте следующий код в файл. Убедитесь, что путь к корневому каталогу, ServerName и версия PHP соответствуют вашей конфигурации.


ServerAdmin admin@site2.your_domain
ServerName site2.your_domain
DocumentRoot /var/www/site2.your_domain
DirectoryIndex info.php

Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all


# 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"

ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined

Сохраните и закройте файл. Затем проверьте конфигурации Apache на наличие синтаксических ошибок с помощью следующей команды:

sudo apachectl configtest

Если ошибок нет, вы увидите вывод:

Syntax OK

Теперь включите новые виртуальные хосты:

sudo a2ensite site1.your_domain
sudo a2ensite site2.your_domain

Отключите стандартный виртуальный хост, так как в дальнейшем он нам не понадобится:

sudo a2dissite 000-default.conf

После этого можно перезапустить сервис Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Теперь, когда мы настроили Apache для обслуживания каждого сайта, мы должны протестировать сайты и убедиться, что все работает правильно.

4: Тестирование настройки

Итак, мы уже настроили два веб-сайта, которые работают на двух разных версиях PHP. Давайте проверим результаты.

Откройте браузер и посетите оба сайта.

http://site1.your_domain
http://site2.your_domain

Вы увидите две страницы с информацией о PHP. Обратите внимание на заголовки этих страниц. На первой странице указано, что site1.your_domain использует PHP версии 7.2. Вторая страница сообщает, что site2.your_domain развернул PHP версии 7.3.

Теперь, когда вы проверили свои сайты, удалите файлы info.php. Они содержат конфиденциальную информацию о вашем сервере и доступны неавторизованным пользователям – следовательно, они представляют собой уязвимость системы безопасности. Чтобы удалить оба файла, введите:

sudo rm -rf /var/www/site1.your_domain/info.php
sudo rm -rf /var/www/site2.your_domain/info.php

Теперь у вас есть сервер Ubuntu 20.04, обслуживающий два веб-сайта с двумя разными версиями PHP.

Установка второй версии PHP

Устанавливать PHP можно из исходников или пакетов. Делается это командами

./configure (с набором параметров, указываемых через --)
make
make install

Обратите внимание, что make install не будет создавать INI-файл.

Но мы такой подход использовать не будет, потому что он требует тщательного конфигурирования в последствии. Я буду ставить PHP из пакетов репозитария REMI.

Для начала, откройте https://rpms.remirepo.net/wizard/ и выберите нужную версию PHP и операционной системы в Wizard и укажите, что тип установки: Multiple versions simultaneously. Мастер предложит вам последовательность команд для данной версии.

В моем случае это CentOS 7 и PHP 7.3:

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
yum install yum-utils -y
yum-config-manager --enable remi-php73 
yum install php73 -y 
yum install php73-php-fpm -y

Проверяем установленную версию:

и конфигурацию, которую он использует:

Видим, что многих полезных модулей не хватает. Доустановим их:

yum -y install php73-php-bcmath php73-php-gd php73-php-mbstring php73-php-mysqlnd php73-php-pdo php73-php-pdo-dblib php73-php-pecl-http php73-php-pecl-http-debuginfo php73-php-pecl-mcrypt php73-php-pecl-mysql php73-php-pecl-propro php73-php-pecl-raphf php73-php-pecl-zip php73-php-soap php73-php-xml php73-php-xmlrpc

Включаем загрузку и запустим PHP-FPM

systemctl enable php73-php-fpm
systemctl start php73-php-fpm

Настройка Apache и PHP-FPM

Apache продолжает использовать версию PHP по умолчанию. Есть вариант проксирования трафика на FastCGI через FPM (FPM/FastCGI) или использование обертки CGI для FastCGI (CGI/FastCGI). Второй метод считается устаревшим и не рекомендуется.

FPM запускается как сервис и по умолчанию случают подключения на 127.0.0.1:9000. Проверить это можно командой:

netstat -na | grep "9000"

Если у вас уже установлен FPM для другой версии PHP, то вам надо разнести их по портам. Для этого надо изменить привязку к порту в конфигурационном файле (в данном примере с 9000 на 9072):

sed -i 's/:9000/:9072/' /etc/opt/remi/php73/php-fpm.d/www.conf

После перезапуска службы php73-php-fpm, проверяйте, что она слушает на новом порту. Но в моем случае это не потребовалось.

В conf файлах нужного вам сайта Apache необходимо указать новый обработчик для файлов с расширением PHP:

VirtualHost *:*>
	# mod_proxy_fcgi options
	IfModule mod_proxy_fcgi.c>
		FilesMatch \.php$>
		   SetHandler "proxy:fcgi://127.0.0.1:9000"
		FilesMatch>
	IfModule>
 
VirtualHost>

В главном файле конфигурации Apache необходимо включить модуль proxy_fcgi_module. По умолчанию, этот модуль отключен или даже не установлен. Чтобы его включить, в файле /usr/local/apache/conf/httpd.conf раскомментируйте строчку

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

а если FastCGI вообще не установлен, то сначала его можно доустановить командой:

и перезапустите Apache:

Далее, необходимо в файле конфигурации php-fpm указать логин и пароль пользователя, под которым работает apache. В моем случае это nobody (по умолчанию там прописано apache). Изменения делаются в файле /etc/opt/remi/php73/php-fpm.d/www.conf:

user = nobody
group = nobody

Как мы видим, в стандартной конфигурации PHP-FPM использует TCP сокет, однако более быстрым решением считается Unix сокет. Чтобы его использовать, в том же файле пропишите:

1
2
3
  listen = /run/php-fpm/www.sock
  listen.owner = apache
  listen.mode = 0660

Ну и замените пользователя на реального пользователя apache (в моем случае, nobody). В таком сценарии в конфигурации Apache должно быть:

SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"

Если у вас разные frontend и backend сервера Apache и FPM, то пропишите разные IP

listen = 10.0.0.2:9000  
 
listen.allowed_clients = 10.0.0.1

а в httpd.conf:

SetHandler "proxy:fcgi://10.0.0.2:9000"

А еще один сценарий, когда у вас несколько бэкенд серверов PHP-FPM для балансировки:

  # Load balancer creation
  
    BalancerMember fcgi://10.0.0.2:9000
    BalancerMember fcgi://10.0.0.3:9000
    BalancerMember fcgi://10.0.0.4:9000
  
  # Redirect PHP execution to the balancer
  
    SetHandler "proxy:balancer://phpfpmlb"
 

И последний вариант, когда отдельно взятое приложение или путь использует отдельную версию FPM:

  # Use PHP 7.1 by default
  
    SetHandler "proxy:fcgi://127.0.0.1:9071"
  
  # Some legacy application use PHP 5.4
  
    
      SetHandler "proxy:fcgi://127.0.0.1:9000"
    
  

После этого перезагрузите php-fpm или Apache:

systemctl reload php73-php-fpm httpd