что такое php fpm

Nginx, Php-Fpm и что это вообще?

FPM

SAPI, он же Server API. В php есть несколько таких API для разных вариантов его работы:

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

Один процесс одновременно обрабатывает один запрос. Это абсолютно так же свойственно для PHP-FPM, как и для Apache.

Количество процессов определяет, сколько одновременно может «висеть» запросов в обработке.

NGINX

Благодаря этой архитектуре nginx на порядки быстрее обрабатывает запросы, чем любой другой сервер и благодаря ей же потребляет при этом сильно меньше ресурсов. Как это происходит?

В эту схему отлично вписалась асинхронная работа со статическими файлами. Благодаря тому, что в современном мире с файлами можно работать почти так же асинхронно, как и с backend, Nginx отлично разделяет работу на две части: статику отдает с диска, динамику обрабатывает в PHP-FPM.

В чем выигрыш?

У вас на странице 100 картинок+js+css-ок? Значит, большая их часть будет висеть в очереди внутри сервера Apache и ждать, когда пользователь получит предыдущие 35 ответов.

В случае с Nginx + PHP-FPM важнее всего количество процессов PHP-FPM. Мы можем поставить его таким же равным тридцати пяти. Что это значит? Это значит, что мы можем одновременно обрабатывать 35 запросов к динамике, запросы же к статике nginx разгребет своими силами в количестве 3000+ одновременных почти на любой слабой VPS.

Расход оперативной памяти при использовании Nginx+PHP-FPM меньше, чем на «голом» Apache, при равном количестве процессов (FPM и Apache). Скорость обработки запросов выше.

На расход CPU внутри PHP замена Apache на FPM никак не скажется. CPU в первую очередь кушает Ваш PHP-код, а пока его никто не оптимизирует, работать быстрее и экономичнее он не начнет.

Итог

Все проблемы PHP (процесс на запрос, не оптимальный код самого проекта) никуда не деваются.

Появляется возможность перелопачивать тонны запросов за статикой, которой нет в Apache.

Вы экономите оперативную память, что сказывается на цене оборудования или VPS.

Появляется море приятного функционала самого Nginx.

Пропадает возможность использовать htaccess, но честно скажу, конфигурация nginx куда более простая и понятная, чем htaccess.

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Установка PHP и модулей на Ubuntu/Debian

В Debian/Ubuntu это делается легко и просто, зачастую не требуется ничего собирать

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Капризы WebSocket и при чём здесь костыли

Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор

Curl в PHP

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Почему timeout для curl в php необходим

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

IoT Highload: особенности и подводные камни

Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Установка PHP и модулей на Ubuntu/Debian

В Debian/Ubuntu это делается легко и просто, зачастую не требуется ничего собирать

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Капризы WebSocket и при чём здесь костыли

Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор

Curl в PHP

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Почему timeout для curl в php необходим

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

IoT Highload: особенности и подводные камни

Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

О безопасности, рисках и вложениях

Как сделать так, чтобы Ваш IT-отдел не стал местом утечки информации, за которую Вы отвечаете?

Источник

PHP-FPM — менеджер процессов PHP FastCGI

PHP-FPM — это альтернативная реализация PHP FastCGI с несколькими дополнительными возможностями, которые обычно используются для высоконагруженных сайтов.

FastCGI, PHP и PHP-FPM

FastCGI это высокопроизводительный и масштабируемый интерфейс для взаимодействия web-сервера и приложений, дальнейшее развитие технологии CGI. Основное преимущество FastCGI в изолировании динамического языка от web-сервера — запуск FastCGI процесса возможен под пользователем, отличным от пользователя web-сервера, а также процесс может находиться в chroot’е, отличном от chroot’а web-сервера. Помимо всего прочего, эта технология позволяет запускать web-сервера и CGI процессы (php скрипты, в случае php-fpm) на различных хостах, что улучшает масштабируемость и также способствует безопасности без существенной потери в производительности.

PHP «умеет» работать в режиме FastCGI и без PHP-FPM, но PHP-FPM устраняет ряд проблем мешающих использовать PHP в режиме FastCGI на высоконагруженных системах.

PHP-FPM — это:

Использование PHP-FPM

Наиболее часто используется связка nginx и PHP-FPM, которая работает эффективнее «классического» использования Apache с mod_php, а в ряде случаев показывает более высокую производительность, нежели более «продвинутое» использование в качестве фронтенда веб-сервера nginx, а в качестве бекенда — Apache с mod_php.

Язык программирования PHP

PHP — язык программирования, который наиболее распространён в сфере веб-разработки.

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

PHP — язык для веб-разработки, который можно назвать основным для «масс-маркета», то есть для разработки типовых сайтов на коробочных CMS.

PHP — скриптовый язык общего назначения, часто применяемый для разработки веб-сайтов.

PHP — интерпретируемый язык программирования, позволяющий создавать программы в процедурном и объектно-ориентированном стиле. PHP — хороший язык для разработки проектов на CMS. И c технической точки зрения современный PHP весьма неплох. Но экосистема языка и особенности кадрового рынка делают PHP не самым лучшим выбором для разработки сложных проектов.

Источник

PHP → Коротко о CGI, FastCGI, PHP-FPM и mod_php

Решил навести в голове порядок о том, как работают вместе веб-сервер и PHP.

Common Gateway Interface, «общий интерфейс шлюза» — это стандарт, который описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры HTTP-запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа.

В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, в том числе на shell.

CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP. Хотя сам PHP интерпретатор позволяет работать в режиме CGI (см. ниже).

Основной момент: «CGI» это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).

FastCGI

Дальнейшее развитие технологии CGI, является более производительным и безопасным, снимает множество ограничений CGI-программ.

FastCGI программа работает следующим образом: программа единожды загружается в память в качестве демона (независимо от HTTP-сервера), а затем входит в цикл обработки запросов от HTTP-сервера. Один и тот же процесс обрабатывает несколько различных запросов один за другим, что отличается от работы в CGI-режиме, когда на каждый запрос создается отдельный процесс, «умирающий» после окончания обработки.

Написание FastCGI программ-демонов сложнее чем CGI, нужны дополнительные библиотеки, зависящие от языка.

Опять же, сама аббревиатура FastCGI это не язык программирования и не отдельная программа, это как и в случае CGI — просто спецификация.

PHP в режиме CGI

PHP в режиме CGI это самый старый способ выполнения php-скриптов веб-сервером. Режим доступен по умолчанию, однако может быть отключён при компиляции.

Для Apache нужен модуль mod_cgi (поставляется вместе с Apache). Nginx из коробки поддержки не имеет, хотя существуют дополнительные инструменты.

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

PHP в режиме FastCGI

Помимо CGI режима, PHP из коробки умеет работать и в FastCGI режиме (с версии 5.3 даже в двух FastCGI режимах). Режим включается флагом при компиляции интерпретатора, флаг зависит от версии PHP.

Для работы с Apache нужен модуль mod_fcgid или mod_fastcgi, либо связка из mod_proxy_fcgi + PHP-FPM.

Nginx умеет работать с FastCGI приложениями из коробки, но именно для PHP дополнительно нужен PHP-FPM (см. ниже).

Следует помнить, что при работе PHP в режиме FastCGI в памяти висит сам php интерпретатор, а не какой-то конкретный php-скрипт.

PHP-FPM

FastCGI Process Manager, «Менеджер процессов FastCGI». Это альтернативная реализация FastCGI режима в PHP с несколькими дополнительными возможностями, которые обычно используются для высоконагруженных сайтов.

Изначально PHP-FPM представлял из себя набор патчей от Андрея Нигматулина, которые устраняли ряд проблем, мешающих полноценно использовать PHP в режиме FastCGI (список улучшений). С версии PHP 5.3 набор патчей включён в ядро, а дополнительные возможности PHP-FPM включаются флагом при компиляции.

PHP-FPM используется в основном в связке с Nginx, без установки Apache.

mod_php

Это модуль для Apache, позволяющий ему выполнять php скрипты. Является наверно самым популярным и простым способом подружить Apache и PHP. Модуль не использует ни CGI, ни FastCGI. Есть свои минусы — скрипты работают под пользователем веб-сервера, невозможно использовать больше одной версии PHP.

Источник

Русские Блоги

Nginx + Php-fpm подробный принцип работы

Примеры в реальной жизни

1. Экспедитор: посетите google.com

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Как показано выше, так как Google заблокирован стеной, нам нужно перейти через vpn через стену, чтобы получить доступ к google.com.

vpn воспринимается как «мы» (мы подключаемся к vpn), vpn не воспринимается как «сервер google» (Google знает только, что поступают запросы http).

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

2. Обратный прокси: балансировка нагрузки через обратный прокси

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Как показано выше, когда мы заходим на сайт baidu.com, у baidu есть прокси-сервер, с помощью которого вы можете выполнять балансировку нагрузки и маршрутизировать на разные серверы.

Этот прокси-сервер незаметен для «мы» (мы можем только ощущать, что мы обращаемся к серверу Baidu, и мы не знаем, что в середине находится прокси-сервер для балансировки нагрузки).

Этот прокси-сервер воспринимается для «server1 server2 server3» (маршрут балансировки нагрузки прокси-сервера на разные серверы)
Не воспринимаемый людьми, но воспринимаемый серверами, мы называем его обратным прокси-сервером

подводить итоги

2. Первое знакомство с Nginx и Php-fpm.

Что такое Nginx

Что такое Php-fpm

1. cgi, протокол fast-cgi

Ранние веб-серверы обрабатывали только статические файлы, такие как html, но с развитием технологии появились динамические языки, такие как php.
Веб-сервер не может справиться с этим, что мне делать? Тогда пусть интерпретатор php справится с этим!
Хорошо передать его интерпретатору php, но как интерпретатор php взаимодействует с веб-сервером?

Чтобы разрешить взаимодействие между различными языковыми интерпретаторами (такими как PHP и Python-интерпретаторы) и веб-сервером, появился протокол cgi. Пока вы пишете программу в соответствии с протоколом cgi, вы можете установить связь между переводчиком языка и веб-сервером. Например, программа php-cgi.

Вы обнаружили, что это пустая трата ресурсов?

В результате появилась улучшенная версия cgi, fast-cgi. Fast-cgi не убивает процесс после обработки запроса каждый раз, но сохраняет процесс так, чтобы процесс мог обрабатывать несколько запросов одновременно. Это избавляет от необходимости каждый раз пересматривать процесс, значительно повышая эффективность.

2. Что такое php-fpm

3. Как Nginx сочетается с Php-fpm

Как мы уже говорили выше, Nginx не только обрабатывает HTTP-запросы, но и действует как обратный прокси-сервер. Nginx перенаправляет динамические запросы на внутренний Php-fpm через функцию обратного прокси.

Давайте настроим новый Nginx + Php-fpm

1. Настройте файл nginx.conf

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

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

2. Добавьте соответствующий сервер

Введите путь, указанный выше, и добавьте сервер.

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Ниже мы объясним значение элементов конфигурации:

Вкратце: когда мы посещаем www.example.com, процесс обработки выглядит следующим образом:

Ниже мы включаем php-fpm php для обработки этого запроса.

Откройте файл php-fpm.conf, мы увидим следующую конфигурацию:

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

То есть: модуль php-fpm прослушивает порт 127.0.0.1:9000 и ожидает обработки запросов.

4. Резюме

Сочетание nginx и php-fpm, весь процесс выглядит следующим образом.

V. Отображение эффекта

1. Запустите модули nginx и php-fpm.

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Успешно началось, мы проверяем процесс php-fpm

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Как показано выше, есть главный процесс и 3 рабочих процесса.

Источник

Настройка производительного веб-сервера на NGINX + PHP-FPM

PHP-FPM (Fast Process Manager) – это отдельная реализация обработчика FastCGI для выполнения PHP скриптов. На базе связки веб-сервера NGINX (который обрабатывает статику) и PHP-FPM вы можете построить более быстрый и производительный веб-сервер для своих веб-проектов по сравнению с использованием «классической» связки NGINX, Apache и модуль mod_php (стек LAMP).

Подключение репозитория, обновление сервера

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

Репозиторий установился, но пакетов для обновлений не найдено, так как установлен свежий образ CentOS.

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Установка и настройка веб-сервера Nginx

Для установки свежей версии Nginx, подключим репозиторий разработчика, выполнив команду:

Или создав конфигурационный файл репозитория /etc/yum.repos.d/nginx.repo со следующим содержимым:

Если вы используете CentOS 8, измените версию в URL.

Установите пакет веб-сервера Nginx с помощью менеджера пакетов yum (или dnf):

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Теперь можно запустить nginx и добавить его в автозагрузку с помощью systemctl:

# systemctl start nginx
# systemctl enable nginx

Чтобы проверить, что веб-сервер работает, откройте в браузере IP-адрес сервера.

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Если у вас тестовая страница не открылась, проверьте настройки разрешенных служб, портов, зон в firewalld на своем сервере.

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

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

И добавим в него следующее содержимое:

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

Установка php-fpm и дополнительных модулей php

В Nginx нет встроенного обработчика PHP, поэтому мы должны установить php-fpm и ряд модулей php, которые будут использоваться для обработки PHP скриптов.

Nginx в свою очередь дает существенный выигрыш при отдаче статики. В нашей конфигурации ngnix будет выступать прокси-сервером (кэширующим и front-end сервером), а в качестве бэкенда будет работать php-fpm.

Для установки свежих версий php, используем репозиторий REMI:

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

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Запустите установку php-fpm и популярных модулей php:

# yum install 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. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Запустите сервис php-fpm и добавитье его в автозагрузку:

# systemctl start php-fpm
# systemctl enable php-fpm

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

Сервис php-fpm нужно запустить через unix-сокет. В конфигурационном файле /etc/php-fpm.d/www.conf удалите строку listen = 127.0.0.1:9000 и добавьте:

Чтобы запускать php-fpm не от пользователя apache (по-умолчанию), укажите следующие параметры в конфигурационном файле:

После изменения конфигурационного php-fpm нужно перезапустить сервис:

# systemctl restart php-fpm

Установка Let’s Encrypt и подключение сертификата

Чтобы выпустить бесплатный сертификат Let’s Encrypt, нужно установить нужное certbot.

# yum install certbot

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

Чтобы сертификат был корректно выпущен, ваш домен должен быть существующим и направлен на соответствующий веб-сервер.

После выпуска сертификата, выполните перезагрузку веб-сервера nginx и проверье результат.

# systemctl restart nginx

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Соединение в браузере защищено!

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

# renew_before_expiry = 30 days
version = 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
chain = /etc/letsencrypt/live/build-centos.info/chain.pem
fullchain = /etc/letsencrypt/live/build-centos.info/fullchain.pem

После изменения файла, добавьте в крон задание:

Чтобы проверить, что nginx работает с php, я создал файл index.php и добавил в него:

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Установка MySQL/MariaDB на веб сервере

Данный шаг мы полностью пропустим, так как на сайте уже есть статья по установке и тюнингу MariaDB. Воспользуйтесь ей.

Настройка Nginx и PHP-FPM для высоконагруженных проектов

Чтобы ваш веб-сервер работал с высокой производительностью и мог обработать большое количество запросов от клиентов, одного железа недостаточно. Важно правильно настроить работу связки nginx и php-fpm.

Настройка nginx

Откройте файл /etc/nginx/nginx.conf и изменит конфигурацию Nginx следующим образом:

Для проектов в которых содержится большое количество статических файлов, обязательно включайте 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-component text/x-cross-domain-policy;

Настройка сжатия позволит ускорить ваш проект.

Если на вашем сайте не предусмотрена загрузка больших файлов, ограничьте это с помощью nginx:

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Если контент на вашем проекте меняется не так часто, вы можете использовать кеширование «expires max;» Либо добавьте соответствующую опцию в конфигурационный файл вашего хоста для нужного типа файлов, например:

* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ <
expires 7d;

Кеш для указанных типов файлов будет хранится 7 дней. Вы можете управлять кешем с помощью данной функции. После всех модификаций, не забывайте выполнять перезапуск nginx:

# systemctl restart nginx

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

При установке php-fpm вы сразу перевели его на unix-сокет. Это дает существенных прирост в производительности. По оценкам производительность вырастает в 2-3 раза. Остальные же параметры php-fpm нужно настраивать под каждый проект отдельно, рассмотрим пример настройки для сервера с 1024 Мб памяти.

Для php-fpm мы можем выделить примерно 512 мб, оставив остальное под БД и nginx.

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

Все параметры нужно изменять при анализе нагрузки на ваш проект, данные значения теоретические.

На текущий сервер я сразу же установил последнюю версию CMS Bitrix, для проверки производительности. На мой взгляд это самая ресурсоемкая CMS и результаты получились неплохие, если учитывать, что это виртуальная машина на KVM с одним ядром (vCPU) и 1024 ОЗУ:

что такое php fpm. Смотреть фото что такое php fpm. Смотреть картинку что такое php fpm. Картинка про что такое php fpm. Фото что такое php fpm

Оптимизацию настроек MariaDB я не расписывал, так как есть соответствующая статья на сайте. Я сформировал параметры для my.cnf по статье и база показала отличный результат.

При запуске сайте вы заметите невооруженным взглядом, что nginx + php-fpm будет намного быстрее обрабатывать ваши запросы и возвращать страницы, чем apache2 + mod_php. Если у вас есть возможность провести нагрузочные тесты во время настройки сервера, то это несомненно будет плюсом, если же такой возможности нет, вы можете изменить параметры для своих ресурсов исходя из нашего мануала.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *