yii2 docker-compose.yml

На старте уже должны стоять docker, docker-compose, php и php-composer.

Создаем папку с проектом и в ней папку docker.


mkdir lk_site

cd lk_site && mkdir docker

cd docker


В папке docker создаем файл docker-compose.yml для поднятия окружения разработки.


vim docker-compose.yml

 

start____________________________________________________________

# Последняя версия docker-compose

version: '3'


# Создаем общую сеть deafult для всех контейнеров

networks:

  default:

    driver: bridge

services:

  web:

    build: ./web

    # Подключаем к общей сети с другими контейнерами

    networks: 

       - default

    # Запускаем только после db

    depends_on: 

      - db    

    # Линкуем внешнюю папку с исходниками внутрь

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

      - "../conf/apache2:/etc/apache2/sites-available"

    ports:

      - 8085:80

    working_dir: ${APP_PATH_CONTAINER}

  db:

    image: mariadb

    # Подключаем к общей сети с другими контейнерами

    networks: 

      - default

    restart: always

    environment:

      MARIADB_ROOT_PASSWORD: example

      MARIADB_DATABASE: yii2db

      MARIADB_USER: userdb

      MARIADB_PASSWORD: secret

    volumes:

      - ${DB_PATH_HOST}:/var/lib/mysql

  adminer:

    image: adminer

    restart: always

    ports:

      - 8088:8080 

  composer:

    image: composer:2.0.8

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}

    command: composer install

  nvim:

    build: ./nvim

    tty: true

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}


end____________________________________________________________

    

В папке docker создаем файл .ENV

vim .ENV


start____________________________________________________________

#PATHS

DB_PATH_HOST= ../databases

APP_PATH_HOST= ../www

APP_PATH_CONTAINER= /var/www/html/

end____________________________________________________________


В папке web создаем файл конфигурации нашего контейнера Dockerfile.

    

mkdir web

cd web


vim Dockerfile


start____________________________________________________________

FROM php:7.4-apache


# Install system dependencies

RUN apt-get update && apt-get install -y \

    curl \

    libpng-dev \

    libonig-dev \

    libxml2-dev \

    zip \

    unzip


# Clear cache

RUN apt-get clean && rm -rf /var/lib/apt/lists/*


# Install PHP extensions

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# gd with-freetype требуется для капчи в yii2. После для проверки "php -r 'var_dump(gd_info());'"

RUN docker-php-ext-configure gd --with-freetype   && docker-php-ext-install gd


WORKDIR /var/www/html/

end____________________________________________________________


В папке nvim создаем файл конфигурации нашего контейнера Dockerfile astronvim.

    

cd .. && mkdir nvim

cd nvim


vim Dockerfile


start____________________________________________________________

FROM alpine:edge


# Install system dependencies

RUN apk add bash git lua nodejs npm lazygit bottom python3 go neovim ripgrep alpine-sdk --update


RUN git clone https://github.com/AstroNvim/AstroNvim ~/.config/nvim


RUN nvim --headless -c "autocmd User PackerComplete quitall"


WORKDIR /var/www/html/

end____________________________________________________________



Для apache2 создаем папку lk_site/conf/apache2 и файл 000-default.conf в ней. Файлик может изменяться, в зависимости от того, как вы хотите настроить apache2 на своем проекте. Его можно менять локально, т.к. он подключается через volume. Но надо не забывать внутри контейнера перезагружать apache2: service apache2 reload


cd ../.. && mkdir conf

cd conf && mkdir apache2

cd apache2


vim 000-default.conf


start____________________________________________________________

<VirtualHost *:80>                                                                              

        ServerName lk.site.ru


        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>

end____________________________________________________________


Все команды выполняются из корневой папки.


cd ..


Выполняем команду создания проекта:

composer create-project --prefer-dist yiisoft/yii2-app-advanced:2.0.47 www


В файле composer.json меняем это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org"

        }

    ]

на это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org",

            "options": {

            "ssl": {

          "verify_peer": false

            }

            }

        }

    ]


Запускаем окружение:

docker-compose -f docker/docker-compose.yml up -d --build


Инициализируем проект:

www/init --env=Development --overwrite=All


Открываем в редакторе файл www/common/config/main-local.php и заполняем его данными для подключения к БД.


Подключаемся к контейнеру:

docker exec -it docker_web_1 bash


Выполняем команду миграции БД:

php /var/www/html/yii migrate


Создаем папку для логов mkdir /var/www/html/log


И выходим exit



Тормозим сервис:

docker-compose -f docker/docker-compose.yml down


Запускаем его заново:

docker-compose -f docker/docker-compose.yml up -d


Открываем localhost:8085 в браузере и смотрим на новый сайт.


Шпаргалка:

Из папки doker

docker-compose ps - вывести список контенеров в папке docker

docker-compose stop web

docker-compose stop db

docker-compose rm web - удуалить



Применение

Основные команды для Docker:


docker-compose up -d

чтобы запустить все службы в вашем стеке в фоновом режиме


docker-compose ps

вывести список запущенных сервисов


docker-compose logs -f

просматривать журналы для всех служб, непрерывно


docker-compose stop

чтобы изящно остановить все службы в вашем стеке


docker-compose kill

немедленно остановить все службы в вашем стеке


docker-compose down -v

чтобы остановить и удалить все службы, помните о потере данных, когда не используются хост-тома


Для запуска команд в контейнере


docker-compose run --rm web composer install

запускает установку композитора в новом контейнере


docker-compose exec web bash

выполняет bash в запущенной php службе

mc unknown terminal tmux

bash-4.2$ mc
Unknown terminal: screen.xterm-256colorCheck the TERM environment variable. Also make sure that the terminal is defined in the terminfo database. Alternatively, set the TERMCAP environment variable to the desired termcap entry.

Решение: 
bash-4.2$ export TERM=xterm

Также можно добавить export TERM=xterm в .profile если есть права. 

Разделить экран Vim по горизонтали и вертикали, запускает vim в режиме diff

 

Разделение Экрана Vim По Вертикали

  • Войдите в командный режим, нажав кнопку ESC.
  • Нажмите комбинацию клавиш Ctrl + w , а затем букву «v«.
Разделение экрана VIM по вертикали
Разделение экрана VIM по вертикали

Чтобы перейти к правой панели, нажмите Ctrl + w, а затем букву «l«.

Навигация по экранам VIM
Навигация по экранам VIM

Чтобы вернуться к левой панели, используйте комбинацию Ctrl + w, а затем букву «h«.

Разделение Экрана Vim По Горизонтали

Чтобы разделить экран vim по горизонтали или открыть новое рабочее пространство в нижней части активного выделения, нажмите Ctrl + w, а затем букву «s«. В приведенном ниже примере левый раздел был разделен на два рабочих пространства.

Разделение экрана VIM по горизонтали
Разделение экрана VIM по горизонтали

Для перехода в нижний раздел нажмите Ctrl + w кнопку, а затем букву «j«.

Перейдите к нижнему экрану VIM
Перейдите к нижнему экрану VIM

Чтобы вернуться в верхний раздел, нажмите Ctrl + w кнопку, а затем букву «k«.

Перейдите к верхнему экрану VIM
Перейдите к верхнему экрану VIM

Увеличение ширины текущего рабочего пространства Vim

Чтобы увеличить ширину текущего выделения в Редакторе Vim, нажмите Ctrl + w кнопку, а вскоре после этого-комбинацию SHIFT + «>».

В приведенном ниже примере я увеличил ширину левой панели.

Увеличение Ширины Рабочего Пространства Vim
Увеличение Ширины Рабочего Пространства Vim

Чтобы уменьшить ширину текущего выделения Vim-файла, нажмите Ctrl + w , а потом комбинацию SHIFT + «<» .

На скриншоте ниже хорошо видно, что левый раздел уменьшился в ширину.

Уменьшить Ширину Рабочего Пространства Vim
Уменьшить Ширину Рабочего Пространства Vim

Увеличение высоты текущего рабочего пространства Vim

Чтобы увеличить высоту текущего рабочего пространства, используйте комбинационное нажатие Ctrl + «w», а затем комбинацию SHIFT + «+» .

Увеличение Высоты Рабочего Пространства Vim
Увеличение Высоты Рабочего Пространства Vim

Чтобы уменьшить высоту рабочей области, нажмите Ctrl + w , а потом  знак минус.

Уменьшение Высоты Рабочего Пространства Vim
Уменьшение Высоты Рабочего Пространства Vim

Чтобы убедиться , что высота верхнего и нижнего рабочих пространств одинакова, нажмите Ctrl + w , а потом знак равно = .

Установите равные размеры рабочего пространства Vim

vimdiff

vimdiff показывает три версии программы Hello World

$ vim -d [параметры] файл1 файл2 [файл3 [файл4]]

Опция -o открывает файлы в горизонтальных окнах. Параметр -O открывает файлы в вертикальных окнах, что является значением по умолчанию. Вертикальные окна помещают файлы рядом, а строки выравниваются, что упрощает использование.

Навигация между окнами

В каждом окне есть файл, открытый в vim . Так что все команды vim доступны для редактирования текста в каждом окне. Когда вы редактируете файл в одном из окон, вывод, выделяющий различия, обновляется.

В vim четыре основные команды для перемещения курсора влево, вниз, вверх и вправо — это h , j , k и l соответственно. Так что неудивительно, что команды для перемещения курсора из одного окна в другое есть,

CTRL wh: Перейти к окну слева
CTRL wj: Перейти к окну ниже
CTRL wk: Перейти к окну выше
CTRL wl: Перейти к окну справа

Открыть файл

  1. Esc
  2. :e filename.txt

Выход из программы

Вы можете сохранить измененные файлы в каждом окне с помощью команды :w и закрыть отдельное окно буфера с помощью команды :q . Это займет некоторое время для нескольких окон. Команда :qa закрывает все файловые окна, если ни один файл не был изменен. Кроме того, :qa! command force закрывает все окна буфера, и любые изменения, сделанные в любом из файлов, отбрасываются. Если вы хотите сохранить любые файлы, которые могли быть изменены, и выйти из всех файловых окон, используйте команду :xa .


Шпаргалка по работе с Tmux

 

Шпаргалка по работе с Tmux



Например, на работе правим файлы в Vim. Окно терминала с открытыми файлами, процессами. Отключаемся от сессии. Далее подключаемся к этой сессии из дома и получаем те же окна с открытыми файлами в Vim, процессами и т.д. Можно продолжить работу с того же момента, на котором остановились. Также удобно при разрыве связи. Дополнительно можно работать совместно с другими в терминале, если подключены к одной сессии. Каждый видит, что делает другой.

1. Установка


CentOS (нужен подключенный репо EPEL)
# yum install tmux 

Fedora
# dnf install tmux

Ubuntu/Debian
# apt-get install tmux

2. Конфигурационные файлы


(пользователя, системный):

~/.tmux.conf
/etc/tmux.conf

С версии 2.1 для включения режима мыши (скролл, изменение размера панели, выбор панели и др.) нужно добавить в tmux.conf:

set -g mouse on

До версии 2.1

set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on
set -g mode-mouse on

3. Работа с Tmux


Старт
# tmux //без параметров будет создана сессия 0
# tmux new -s session1 //новая сессия session1. Название отображается снизу-слева в квадратных скобках в статус строке. Далее идет перечисление окон. Текущее окно помечается звездочкой.

Префикс (с него начинаются команды)
<C-b> (CTRL + b)

Новое окно (нажать CTRL+b, затем нажать с)
<C-b c>

Список окон
<C-b w> // переключиться курсором вверх-вниз

Переключение
<C-b n> // следующее окно
<C-b p> // предыдущее окно
<C-b 0> // переключиться на номер окна

Окна можно делить на панели (Panes)
Как в тайловых (мозаичных) оконных менеджерах.

Деление окна горизонтально
<C-b ">
либо команда
# tmux split-window -h

Деление окна вертикально
<C-b %>
либо команда
# tmux split-window -v

Переход между панелей
<C-b стрелки курсора> // либо режим мыши

Изменение размеров панелей
<C-b c-стрелки> // либо режим мыши

Закрытие окон
<C-b x> // нужно подтвердить y
либо
# exit

Отключение от сессии
<C-b d>
либо
# tmux detach

Список сессий
# tmux ls

Подключиться к работающей сессии
# tmux attach //подключение к сессии, либо к единственной, либо последней созданной
# tmux attach -t session1 // подключение к сессии session1

Выбрать сессию
<C-b s>

Завершение сессии
# tmux kill-session -t session1

Завершить все сессии
# tmux kill-server

Список поддерживаемых комманд
# tmux list-commands

SSH-ключи для серверов

Создать SSH ключ в Linux

  1. Введите команду ssh-keygen и нажмите Enter.
  2. Если команда ssh-keygen не найдена, установите пакет openssh командой: yum –y install openssh-server openssh-clients

Добавить SSH ключ на сервер

  1. Введите команду: ssh-copy-id root@123.123.123.123
  2. Нажмите Enter и введите пароль от вашего сервера.
где root — логин вашего сервера,
123.123.123.123 — IP-адрес сервера.

Сохранить из дампа команды SQL для создания таблиц в базе

file.py

__________________________________________________________________________________


import mmap

import re


from contextlib import closing


filename = '/home/copoka/lgek/admin_lgek'


pattern = re.compile(rb'(?sm)^CREATE TABLE .*?;', re.S)

with open(filename, 'r+b', 0) as f, \

        closing(mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)) as s:

    MyList = re.findall(pattern, s)  # return matched strings from the file



MyFile = open('/home/copoka/lgek/output.txt', 'w')

for x in MyList:

    x = str(x).replace('\\n', '\n')

    MyFile.write(x + '\n')

    print (x)

MyFile.close()

__________________________________________________________________________


https://regex101.com/r/6cOCrn/2

Дамп конкретной таблицы из дампа всей базы

 #!/bin/sh

PATH=/bin:/usr/bin/


ls *.gz | sed 's/\..*//'

echo "Enter dump"

read DUMPDB


gunzip $DUMPDB

cat $DUMPDB | awk '/CREATE TABLE/ {print($3)}' | sed -e s/\`//g


echo "Enter table"

read TABLE


cat $DUMPDB | sed "/ SET /d" | awk '/CREATE TABLE `'$TABLE'`/,/UNLOCK TABLES/' > $TABLE.sql

Config nginx-fpm for yii2

 upstream phpfpm {

    #server unix:/var/run/php5-fpm.sock;

    #avoid sockets for nginx-fpm on Linux, they are good for BSD

    server 127.0.0.1:9070; #адрес сокета php-fpm

}

server {

    listen       10.0.0.78:80; #IPservera:port

    server_name  domain.ru;

    root /home/admin/web/domain.ru/www;

    index index.php index.html index.htm;

    charset utf-8;

    client_max_body_size 128M;

    

    access_log  /var/log/nginx/domain.ru.access.log  main;

    error_log /var/log/nginx/domain.ru.error.log error;

    

location = /favicon.ico {

        log_not_found off;

        access_log off;

}

location = /robots.txt {

        allow all;

        log_not_found off;

        access_log off;

}


    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).

    location ~ /\. {

        deny all;

        access_log off;

        log_not_found off;

    }

    # END restrictions.conf


    # Typically I create a yiiframework.conf file that I then include across all of my yii vhosts

    #include conf.d/yiiframework.conf;

    # I've included the content of my yiiframework.conf in-line for this example


    # BEGIN yiiframework.conf

    # Block access to protected, framework, and nbproject (artifact from Netbeans)

    location ~ /(protected|framework|nbproject) {

        deny all;

        access_log off;

        log_not_found off;

    }


    # Block access to theme-folder views directories

    location ~ /themes/\w+/views {

        deny all;

        access_log off;

        log_not_found off;

    }


    # Attempt the uri, uri+/, then fall back to yii's index.php with args included

    # Note: old examples use IF statements, which nginx considers evil, this approach is more widely supported

    location / {

        try_files $uri $uri/ /index.php?$args;

    }

    # END yiiframework.conf


    # Tell browser to cache image files for 24 hours, do not log missing images

    # I typically keep this after the yii rules, so that there is no conflict with content served by Yii

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {

        expires 24h;

        log_not_found off;

    }


    # Block for processing PHP files

    # Specifically matches URIs ending in .php

    location ~ \.php$ {

        try_files $uri =404;


        # Fix for server variables that behave differently under nginx/php-fpm than typically expected

        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        # Include the standard fastcgi_params file included with nginx

        include fastcgi_params;

        fastcgi_param PATH_INFO        $fastcgi_path_info;

        fastcgi_index index.php;

        # Override the SCRIPT_FILENAME variable set by fastcgi_params

        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection

        fastcgi_pass phpfpm;

fastcgi_param php_admin_value "max_execution_time = 180";

fastcgi_param    php_admin_flag "log_errors = on";

fastcgi_param    php_admin_value "memory_limit = 320m";

fastcgi_param    php_admin_value "error_reporting = E_ALL";

fastcgi_param    php_admin_flag "display_errors = on";

fastcgi_param    php_admin_flag "display_startup_errors = on";

fastcgi_param    php_value        "error_reporting = E_ALL";

fastcgi_param    php_flag         "display_errors = on";

fastcgi_param    php_flag         "display_startup_errors = on";


    }


    # deny access to .htaccess files, if Apache's document root

    # concurs with nginx's one

    #

    #location ~ /\.ht {

    #    deny  all;

    #}

}


Установка, запуск нескольких версий PHP из набора Software Collections SCL на Centos

 Введение



Использование Apache с PHP-FPM — один из лучших вариантов хостинга приложений PHP, особенно с точки зрения производительности.


В этом обучающем руководстве мы настроим два сайта PHP для работы на одном экземпляре сервера. Каждый сайт будет использовать собственный домен, и на каждом домене будет использоваться собственная версия PHP. Первый сайт <^>site1.your_domain развернет PHP 7.0. Второй сайт site2.your_domainsite2.your_domain<^>` развернет PHP 7.2.


Предварительные требования

Один сервер CentOS 7 с не менее чем 1 ГБ оперативной памяти, настроенный согласно руководству Начальная настройка сервера CentOS 7, с пользователем non-root user с привилегиями sudo и брандмауэром.

Веб-сервер Apache, установленный и настроенный в соответствии с указаниями руководства Установка веб-сервера Apache в CentOS 7​​​.

Доменное имя, настроенное так, чтобы указывать на ваш сервер CentOS 7. 

  

Шаг 1 — Установка PHP версий 7.0 и 7.2 с помощью PHP-FPM

После выполнения предварительных требований мы установим версии PHP 7.0 и 7.2. Репозиторий SCL (Software Collections) содержит множество версий стеков PHP для систем CentOS 7. Если вам нужна абсолютно новая версия PHP, которой нет на SCL, проверьте remi PPA (персональные архивы пакетов).


Начнем с установки репозитория SCL в вашу систему:


sudo yum install centos-release-scl -y

Сначала узнаем, какие версии PHP 7 доступны в SCL:


sudo yum list rh-php7[0-9].x86_64

Вывод будет выглядеть следующим образом:


Output

Available Packages

rh-php70.x86_64                                 2.3-1.el7                                 centos-sclo-rh

rh-php71.x86_64                                 1-1.el7                                   centos-sclo-rh

rh-php72.x86_64                                 1-2.el7                                   centos-sclo-rh

rh-php73.x86_64                                 1-1.el7                                   centos-sclo-rh

Вы заметите, что доступна также новейшая версия, PHP 7.3. Но в наших примерах мы установим версии 7.0 и 7.2.


Начнем с более ранней версии. Установите rh-php70 и rh-php70-php-fpm​​​:


sudo yum install rh-php70  rh-php70-php-fpm -y

rh-php70 — это метапакет, который запускает приложения PHP.

rh-php70-php-fpm​​​ предоставляет интерпретатор Fast Process Manager, который работает как демон и принимает запросы Fast/CGI.

Повторите процедуру для PHP версии 7.2. Установите rh-php72 и rh-php72-php-fpm​​​.


sudo yum install rh-php72  rh-php72-php-fpm -y

Далее запустите следующие команды для начала использования обеих коллекций Software Collections:


sudo scl enable rh-php70 bash

sudo scl enable rh-php72 bash

По умолчанию обе версии PHP прослушивают порт 9000. Но в этом обучающем руководстве мы хотим запустить две версии одновременно. Поэтому назначим два новых порта:


Для этого откройте /etc/opt/rh/rh-php70/php-fpm.d/www.conf в предпочитаемом текстовом редакторе и измените каждое представление 9000 на 9002. Затем сохраните и закройте файл и повторите процедуру для /etc/opt/rh/rh-php72/php-fpm.d/www.conf, только сейчас замените 9000 на 9003. Вы можете использовать эти две команды sed​​​ поочередно, чтобы выполнить замены:


sudo sed -i 's/:9000/:9002/'  /etc/opt/rh/rh-php70/php-fpm.d/www.conf

sudo sed -i 's/:9000/:9003/'  /etc/opt/rh/rh-php72/php-fpm.d/www.conf

Сейчас вы назначили выделенный порт для каждой из ваших служб PHP. Перед выполнением этих изменений необходимо, тем не менее, добавить порты в вашу конфигурацию SELinux.


SELinux — это сокращение от Security Enhanced Linux, которое активируется по умолчанию на CentOS 7. Необходимо добавить новые порты 9002 и 9003 в вашу базу данных SELinux и назначить их для ваших служб httpd, иначе ваши приложения не будут запускаться. Для выполнения этой задачи используйте команду semanage:


sudo semanage port -a -t http_port_t -p tcp 9002

sudo semanage port -a -t http_port_t -p tcp 9003

Флаг -a указывает на то, что вы добавляете объект в базу данных. Флаг -t указывает тип объекта, которым в данном случае является http_port_t​​​. А флаг -p определяет протокол tcp​​​. Дополнительную информацию о SELinux и команде semanage можно найти в этом обучающем руководстве или обратившись к официальной документации SELinux.


Теперь вы готовы запустить и активировать ваши службы PHP. Начнем со службы rh-php70-php-fpm и активируем ее запуск во время загрузки:


sudo systemctl start rh-php70-php-fpm

sudo systemctl enable rh-php70-php-fpm

Затем проверьте статус службы rh-php70-php-fpm:


sudo systemctl status rh-php70-php-fpm

Вывод будет выглядеть следующим образом:


Output

● rh-php70-php-fpm.service - The PHP FastCGI Process Manager

   Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)

   Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago

 Main PID: 1852 (php-fpm)

   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

   CGroup: /system.slice/rh-php70-php-fpm.service

           ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)

           ├─1853 php-fpm: pool www

           ├─1854 php-fpm: pool www

           ├─1855 php-fpm: pool www

           ├─1856 php-fpm: pool www

           └─1857 php-fpm: pool www


Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...

Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.


Повторите эту процедуру, запустите службу rh-php72-php-fpm и активируйте ее запуск во время загрузки:


sudo systemctl start rh-php72-php-fpm

sudo systemctl enable rh-php72-php-fpm

Затем проверьте статус службы rh-php72-php-fpm:


sudo systemctl status rh-php72-php-fpm

Другой вывод будет выглядеть следующим образом:


Output

● rh-php72-php-fpm.service - The PHP FastCGI Process Manager

   Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)

   Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago

 Main PID: 1876 (php-fpm)

   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

   CGroup: /system.slice/rh-php72-php-fpm.service

           ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)

           ├─1877 php-fpm: pool www

           ├─1878 php-fpm: pool www

           ├─1879 php-fpm: pool www

           ├─1880 php-fpm: pool www

           └─1881 php-fpm: pool www


Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...

Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.


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


Шаг 2 — Создание структур каталогов для обоих сайтов

В этом разделе мы создадим корневой каталог документов и страницу индекса для каждого из двух сайтов.


Вначале создайте корневые каталоги документов для site1.your_domain и site2.your_domain:


sudo mkdir /var/www/site1.your_domain

sudo mkdir /var/www/site2.your_domain

По умолчанию веб-сервер Apache работает как пользователь apache и группа apache. Поэтому /var/www/ и все его файлы и подкаталоги также должны принадлежать им. Запустите следующие команды для проверки правильности владения и разрешений корневых каталогов вашего веб-сайта:


sudo chown -R apache:apache /var/www/site1.your_domain

sudo chown -R apache:apache /var/www/site2.your_domain

sudo chmod -R 755 /var/www/site1.your_domain

sudo chmod -R 755 /var/www/site2.your_domain

Команда chown меняет владельца двух каталогов веб-сайта на пользователя apache и группу apache. Команда chmod меняет разрешения, связанные с этим и другими пользователями и группами.


Далее вы создадите файл info.php в корневом каталоге каждого сайта. В нем будет отображаться информация о версии PHP для каждого сайта. Начнем с site1:


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

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


/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/httpd/conf.d/.


Вначале создайте новый файл конфигурации виртуального хоста для сайта site1.your_domain. Здесь вы предписываете Apache использовать для рендеринга содержимого PHP 7.0:


sudo vi /etc/httpd/conf.d/site1.your_domain.conf

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


/etc/httpd/conf.d/site1.your_domain.conf


<VirtualHost *:80>

     ServerAdmin admin@site1.your_domain

     ServerName site1.your_domain

     DocumentRoot /var/www/site1.your_domain

     DirectoryIndex info.php

     SetHandler "proxy:fcgi://127.0.0.1:9002

     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

     AddHandler php70-fcgi .php

     Action php70-fcgi /cgi-bin/php70.fcgi

     ErrorLog /var/log/httpd/site1.your_domain_error.log

     CustomLog /var/log/httpd/site1.your_domain_access.log combined

</VirtualHost>

Для DocumentRoot вы указываете путь корневого каталога вашего веб-сайта. Для ServerAdmin вы добавляете адрес электронной почты, к которому имеет доступ администратор сайта your_domain. Для ServerName вы добавляете url для вашего первого субдомена. Для SetHandler вы указываете порт 9002. Остальные директивы также настраивают вашу службу для развертывания PHP 7.0.


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


Теперь создайте новый файл конфигурации виртуального хоста для сайта site2.your_domain. Для этого субдомена мы будем развертывать PHP 7.2:


sudo vi /etc/httpd/conf.d/site2.your_domain.conf

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


/etc/httpd/conf.d/site2.your_domain.conf

<VirtualHost *:80>

     ServerAdmin admin@site2.your_domain

     ServerName site2.your_domain

     DocumentRoot /var/www/site2.your_domain

     DirectoryIndex info.php

     SetHandler "proxy:fcgi://127.0.0.1:9003

     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

     AddHandler php72-fcgi .php

     Action php72-fcgi /cgi-bin/php72.fcgi

     ErrorLog /var/log/httpd/site2.your_domain_error.log

     CustomLog /var/log/httpd/site2.your_domain_access.log combined

</VirtualHost>

Сохраните файл и закройте его после завершения. Проверьте файл конфигурации Apache на наличие синтаксических ошибок:


sudo apachectl configtest

Вы увидите вывод с текстом Syntax OK:


Output

Syntax OK

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


sudo systemctl restart httpd

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


Шаг 4 — Тестирование сайтов

Мы настроили два сайта для работы с двумя разными версиями PHP. Теперь проверим результаты.


Откройте в браузере сайты http://site1.your_domain и http://site2.your_domain. Вы увидите две страницы, выглядящие следующим образом:


Информационная страницаPHP 7.0 Информационная страница PHP 7.2


Обратите внимание на заголовки. На первой странице указано, что на сайте site1.your_domain развернута версия PHP 7.0. На второй странице указано, что на сайте site2.your_domain развернута версия PHP 7.2.


Мы протестировали сайты и теперь можем удалить файлы info.php. Эти файлы представляют собой угрозу безопасности, поскольку они содержат важную информацию о вашем сервере и при этом доступны неуполномоченным пользователям. Удалите файлы:


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

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

Теперь у вас имеется один сервер CentOS 7, обслуживающий два сайта с двумя разными версиями PHP. Однако PHP-FPM можно применять и для других целей.


Заключение

Мы объединили виртуальные хосты и PHP-FPM для обслуживания нескольких сайтов и нескольких версий PHP на одном сервере. Количество сайтов PHP и версий PHP, которые может обслуживать ваш сервер Apache, зависит исключительно от вычислительной мощности сервера.


Теперь вы можете рассмотреть возможность изучения более расширенных функций PHP-FPM, например порождение процесса или правил регистрации sdtout и stderr​​​​​. Или же теперь вы можете защитить свои веб-сайты. Для этого используйте наш обучающий модуль по защите сайтов с помощью бесплатных сертификатов TLS/SSL от Let’s Encrypt.

Поиск по этому блогу