Nginx разные версии php

Multiple Websites with Different PHP Versions and Nginx on Ubuntu 20.04

Nginx is a lightweight and high-performance web server. PHP-FPM is a robust FastCGI Process Manager for PHP. This guide will help you set up multiple websites with Nginx and different PHP versions on a single Ubuntu 20.04 server.

For simplicity, this tutorial assumes you want to set up two websites, the first running with PHP 5.6 and the second running with PHP 8.0.

Prerequisites

  • Deploy a new Ubuntu 20.04 server at Vultr.
  • Follow Vultr’s best practices guides to create a sudo user and update the Ubuntu server.
  • Have two fully qualified domain names that point to your server’s IP address, such as site1.example.com and site2.example.com .

1. Install Software Packages

$ sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php 
$ apt-cache search ^php5.6 | cut -f1 -d' ' 
$ sudo apt -y install php5.6 php5.6-fpm php5.6-mysql 
$ apt-cache search ^php8.0 | cut -f1 -d' ' 
$ sudo apt -y install php8.0-cli php8.0-fpm php8.0-pgsql 

You now have two different versions of PHP coexisting on your server. In command-line mode, the PHP 5.6 interpreter is php5.6 , and the PHP 8.0 interpreter is php8.0 .

Читайте также:  Util package program in java

Currently, php is an alias of php8.0 . If you want to make php an alias of php5.6 , run the following command and select the appropriate option.

$ sudo update-alternatives --config php 

You can also install other PHP versions if needed.

2. Upload Source Code

For security, create a dedicated user for each website. Each user will own all the source code files of the respective website. In addition, the PHP-FPM processes for each website will also run under the corresponding user so the two websites will be completely independent of each other.

The First Website

$ sudo chown -R site1:site1 /var/www/site1 

The Second Website

$ sudo chown -R site2:site2 /var/www/site2 

3. Configure PHP

Configure PHP 5.6 for the First Website

  1. List all the time zones that your Ubuntu system supports. Use the UP / DOWN keys to move through the list, and press Q to exit.
$ timedatectl list-timezones 
$ sudo timedatectl set-timezone America/New_York 
$ sudo nano /etc/php/5.6/fpm/php.ini 
date.timezone = America/New_York 
max_execution_time memory_limit post_max_size upload_max_filesize 
$ sudo cp /etc/php/5.6/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/site1.conf 
$ sudo mv /etc/php/5.6/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/www.conf.default 
$ sudo nano /etc/php/5.6/fpm/pool.d/site1.conf 
  • Replace [www] with [site1]
  • Replace user = www-data with user = site1
  • Replace group = www-data with group = site1 (do not touch the listen.group = www-data setting)

Make sure the listen = /run/php/php5.6-fpm.sock setting does not start with ; . This setting makes PHP-FPM listen on a Unix socket specified by the /run/php/php5.6-fpm.sock file.

catch_workers_output = yes php_flag[display_errors] = off php_admin_flag[log_errors] = on php_admin_value[error_log] = /var/log/php-fpm/site1/error.log php_admin_value[session.save_path] = /var/lib/php/sessions/site1 
$ sudo mkdir -p /var/log/php-fpm/site1 $ sudo mkdir -p /var/lib/php/sessions/site1 
$ sudo chown site1:site1 /var/log/php-fpm/site1 $ sudo chmod 700 /var/log/php-fpm/site1 $ sudo chown site1:site1 /var/lib/php/sessions/site1 $ sudo chmod 700 /var/lib/php/sessions/site1 
$ sudo systemctl restart php5.6-fpm.service 

Configure PHP 8.0 for the Second Website

$ sudo nano /etc/php/8.0/fpm/php.ini 
date.timezone = America/New_York 
max_execution_time memory_limit post_max_size upload_max_filesize 
$ sudo cp /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/site2.conf 
$ sudo mv /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.default 
$ sudo nano /etc/php/8.0/fpm/pool.d/site2.conf 
  • Replace [www] with [site2]
  • Replace user = www-data with user = site2
  • Replace group = www-data with group = site2 (do not touch the listen.group = www-data setting)
Читайте также:  Python camelcase to underscore

Make sure the listen = /run/php/php8.0-fpm.sock setting does not start with ; . This setting makes PHP-FPM listen on a Unix socket specified by the /run/php/php8.0-fpm.sock file.

catch_workers_output = yes php_flag[display_errors] = off php_admin_flag[log_errors] = on php_admin_value[error_log] = /var/log/php-fpm/site2/error.log php_admin_value[session.save_path] = /var/lib/php/sessions/site2 
$ sudo mkdir -p /var/log/php-fpm/site2 $ sudo mkdir -p /var/lib/php/sessions/site2 
$ sudo chown site2:site2 /var/log/php-fpm/site2 $ sudo chmod 700 /var/log/php-fpm/site2 $ sudo chown site2:site2 /var/lib/php/sessions/site2 $ sudo chmod 700 /var/lib/php/sessions/site2 
$ sudo systemctl restart php8.0-fpm.service 

4. Configure Nginx

Configure Nginx for the First Website

$ sudo nano /etc/nginx/sites-available/site1-http.conf 
$ sudo ln -s /etc/nginx/sites-available/site1-http.conf /etc/nginx/sites-enabled/site1-http.conf 

Configure Nginx for the Second Website

$ sudo nano /etc/nginx/sites-available/site2-http.conf 
$ sudo ln -s /etc/nginx/sites-available/site2-http.conf /etc/nginx/sites-enabled/site2-http.conf 
$ sudo usermod -aG site1,site2 www-data 
$ sudo systemctl reload nginx.service 

5. Verify the Setup

http://site1.example.com/info.php http://site2.example.com/info.php 
$ sudo rm /var/www/site1/info.php $ sudo rm /var/www/site2/info.php 

You now have two websites running with two different versions of PHP on the same server. You can set up as many websites as you want as long as your server has enough resources.

Want to contribute?

You could earn up to $600 by adding new articles.

Источник

Несколько версий PHP на хосте с помощью Docker

Часто перед разработчиками PHP встаёт задача проверить работу веб-приложения под несколько версий интерпретатора. Решить её можно разными способами. Можно банально установить разные версии PHP на один хост, но это чревато конфликтами библиотек и другими сложностями. Вторая крайность — сделать несколько изолированных виртуальных машин с разным окружением, но здесь не обойтись без чрезмерного использования аппаратных ресурсов и излишней траты времени на разворачивание рабочего окружения. На настоящий момент наиболее просто решить данную задачу можно с помощью Docker.

image

Ниже я опишу рабочее решение под Ubuntu 18, где в качестве стека используется связка Nginx + PHP-FPM. Данное решение легко масштабируется: контейнер с PHP-FPM занимает всего 300 Мб в памяти, а добавить контейнеры с другими версиями интерпретатора можно тремя командами (или в зависимости от предпочтений даже одной — run). Второй плюс этого решения в том, что разработчику не нужно переключать веб-сервер между интерпретаторами, так как они уже разнесены в разные контейнеры (код приложения при этом используется один и тот же).

Дополнение: Судя по комментариям, некоторые читатели не поняли, для каких случаев подходит описанное решение. Поэтому хочу обратить внимание, что всё нижеизложенное предназначено для использования ИСКЛЮЧИТЕЛЬНО на рабочей станции разработчика, а также может с некоторыми оговорками подойти для стейдж-сервера.

1. Устанавливаем Docker

sudo apt update sudo apt install ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce

2. Устанавливаем контейнеры с нужными версиями PHP

В качестве примера создания рабочего окружения использованы PHP версий 7.1 и 7.2 из официального Docker-репозитория PHP. По аналогии при наличии образа можно установить какие угодно версии PHP:

sudo docker pull php:7.1.25-fpm-stretch sudo docker create --name=fpm71 -p 127.0.0.1:9071:9000 -v /var/www:/var/www php:7.1.25-fpm-stretch sudo docker start fpm71 sudo docker pull php:7.2.13-fpm-stretch sudo docker create --name=fpm72 -p 127.0.0.1:9072:9000 -v /var/www:/var/www php:7.2.13-fpm-stretch sudo docker start fpm72

PHP-FPM по умолчанию работает на 9000 порту. При создании образов мы опубликовали 9000-е порты контейнеров на свободные 9071 и 9072 порты хост-машины (номера взяты произвольно из непривилегированного диапазона). Далее на эти порты мы будем проксировать запросы на обработку PHP (параметр fastcgi_pass в конфигурации виртуальных хостов Nginx).

Также понадобилось пробросить внутрь контейнеров каталог с проектами (/var/www), иначе PHP-FPM ругается, что не видит файлов (если знаете, как сделать этот момент лучше/правильней, то пишите в комментарии).

Проверяем, что контейнеры запущены, а порты опубликованы правильно:

sudo docker ps -a sudo netstat -lpn

3. Настраиваем окружение для виртуальных хостов

127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2 

Создаём каталог для проекта:

sudo mkdir -p /var/www/project.local echo '' | sudo tee /var/www/project.local/index.php 

Название для проекта (project.local) и виртуальных хостов (project.local.php71/72) я взял произвольно, но вы можете использовать удобные для вас названия (только не забудьте при этом поменять настройки виртуальных хостов).

Изначально в индексный файл была положена только одна команда phpinfo, после настройки и проверки работоспособности системы, index.php нужно будет заменить на тот, что используется в проекте.

4. Устанавливаем nginx и настраиваем виртуальные хосты

Создаём файл /etc/nginx/sites-available/project.local.php71 с описанием первого виртуального хоста (он будет использоваться для проверки работы проекта под PHP v.7.1):

Точно так же файл /etc/nginx/sites-available/project.local.php72 для второго виртуального хоста:

Теперь делаем симлинки на вышесозданные конфигурации виртуальных хостов и перегружаем Nginx:

cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/project.local.php71 sudo ln -s ../sites-available/project.local.php72 sudo systemctl reload nginx

5. Проверяем

curl --silent http://project.local.php71/index.php | grep -o "PHP Version [0-9\.]\" curl --silent http://project.local.php72/index.php | grep -o "PHP Version [0-9\.]\" 

В качестве результата мы должны получить версию PHP (как результат обработки команды phpinfo интерпретаторами разных версий).

Теперь осталось лишь залить свой проект в папку /var/www/project.local и можно проверять его работу в интерпретаторе PHP 7.1 по адресу http://project.local.php71 и PHP 7.2 по http://project.local.php71.

Источник

Оцените статью