Настройка php-fpm в шаблонизаторе ISP 5, в режиме nginx + php-fpm

Чтобы написать одно название пришлось вспотеть, так как непросто его сформулировать. Как вы поняли основная суть статьи, рассказать для вас и запомнить для себя, как настроить поддержку php-fpm в работе сайтов, если у вас установлен ISP 5 manager и вы хотите, чтобы ваши сайты правильно обрабатывались конфигурацией nginx. Тема достаточно часто поднимается в вопросах и статьях, но в итоге я не смог найти решения, которое бы просто решало этот вопрос. Я даже расскажу предисторию этого, как всё складывалось изначально у меня.

Описание проблемы с nginx + php-fpm

У меня в работе сервера, где установлены и Centos и Debian. На каждом сервере есть созданные пользователи, которые имеют выбор работать в режиме apache + nginx, или cgi +nginx, или php-fpm + nginx. В итоге получается, что при переключении на режим php-fpm сайты работают только с главной страницей, при переходе на любую внутреннюю страницу возникает ошибка 502 или 404, то есть сайт конфигурация nginx + php-fpm не обрабатывается правильно. Это была проблема номер один.

Вторая проблема появилась после того, как я со специалистами пытался решить первую. Следует понимать, что php-fpm обрабатывает php содержимое иначе и не учитывает .htaccess, поэтому в папке vhosts для site.conf под nginx необходимо добавлять обработку в виде строки: try_files $uri $uri/ /index.php?q=$uri&$args;

Однако тут снова проблема, делать это вручную неудобно, представьте например 50-100 сайтов, которые добавляются, убираются, переключаются и надо отслеживать, чтобы в каждом конфиге была строка добавлена вручную try_files $uri $uri/ /index.php?q=$uri&$args;, тем более с учетом того, что это делать может только root. Надо было решать оба вопроса.

Первые попытки решить натолкнулись на то, что специалисты заявили: Это нельзя сделать автоматически. То есть дилемма такова, что только вручную. Но повезло по мере попыток обговорить этот вопрос с одним более понятливым специалистов, который реализовал ту идею, что была в понимании как сделать. Надо было внедрить в шаблонизатор ISP строчку для подключения режиме конфига в php-fpm. Мне до сих пор непонятно, почему по сути простое решение стало для многих такой трудной задачей. И решение появилось.

Для начала заходим в папку шаблонизаторов ISP manager 5 (неважно бизнес версия у вас или Lite), например в Centos 7.3 правильная папка такая: /localhost/usr/local/mgr5/etc/templates/default/

Далее находим в этой папке файлы шаблонизаторы для настройки конфигурации nginx в папку vhosts. Там будет 2 файла: nginx-vhosts-ssl.template и nginx-vhosts.template. Разница в обработке с ssl сертификатом и без него. Вот содержимое этих файлов, после добавления try_files $uri $uri/ /index.php?q=$uri&$args;

Шаблонизатор nginx-vhosts-ssl.template

server {
server_name {% $NAME %} [% $ALIASES %];
ssl on;
ssl_certificate [% $SSL_CRT_BUNDLE_PATH %];
ssl_certificate_key [% $SSL_KEY_PATH %];
{% if $STRICT_SSL == on %}
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000;";
{% endif %}
charset [% $CHARSET %];
{% if $DIRINDEX != "" %}
index [% $DIRINDEX %];
{% endif %}
disable_symlinks if_not_owner from=$root_path;
include {% $NGINX_VHOST_INCLUDES %};
include {% $INCLUDE_RESOURCE_PATH %};
{% if $LOG_ACCESS == on %}
access_log [% $ACCESS_LOG_PATH %];
{% elif $NO_TRAFF_COUNT == on %}
access_log off;
{% endif %}
{% if $LOG_ERROR == on %}
error_log {% $ERROR_LOG_PATH %} notice;
{% else %}
error_log /dev/null crit;
{% endif %}
{% if $SSI == on %}
ssi on;
{% endif %}
set $root_path {% $VIRTUAL_DOCROOT %};
{% if $AUTOSUBDOMAIN != off and $AUTOSUBDOMAIN != "" %}
{% if $AUTOSUBDOMAIN == autosubdomain_subdir %}
set $subdomain "";
{% elif $AUTOSUBDOMAIN == autosubdomain_dir %}
set $subdomain {% $AUTOSUBDOMAIN_SUBDOMAIN_PART %};
{% endif %}
if ($host ~* ^((.*).{% $NAME %})$) {
{% if $AUTOSUBDOMAIN == autosubdomain_dir %}
set $subdomain $1;
{% elif $AUTOSUBDOMAIN == autosubdomain_subdir %}
set $subdomain $2;
{% endif %}
}
root $root_path/$subdomain;
{% else %}
root $root_path;
{% endif %}
{% if $FOREGROUND == on %}
listen {% $NGINX_SSL_LISTEN_ON %} default_server;
{% else %}
listen {% $NGINX_SSL_LISTEN_ON %};
{% endif %}
{% if $USER_RESOURCES %}
include {% $USER_NGINX_RESOURCES_PATH %};
{% endif %}
{% if $SRV_GZIP == on %}
gzip on;
gzip_comp_level [% $GZIP_LEVEL %];
gzip_disable "msie6";
gzip_types [% $GZIP_TYPES %];
{% endif %}
{% if $REDIRECT_TO_APACHE != on and $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
location / {
{% if $PHP == on %}
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~ [^/]\.ph(p\d*|tml)$ {
{% if $PHP_MODE == php_mode_fcgi_nginxfpm %}
try_files /does_not_exists @php;
{% else %}
try_files /does_not_exists @fallback;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
{% if $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
try_files $uri $uri/ @fallback;
}
location / {
try_files /does_not_exists @fallback;
}
{% endif %}
}
{% if $ANALYZER != off and $ANALYZER != "" %}
location {% $WEBSTAT_LOCATION %} {
charset [% $WEBSTAT_ENCODING %];
index index.html;
{% if $PHP == on %}
location ~ [^/]\.ph(p\d*|tml)$ {
{% if $PHP_MODE == php_mode_fcgi_nginxfpm %}
try_files /does_not_exists @php;
{% else %}
try_files /does_not_exists @fallback;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
{% if $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
try_files $uri $uri/ @fallback;
}
location {% $WEBSTAT_LOCATION %} {
try_files /does_not_exists @fallback;
}
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location @fallback {
proxy_pass {% $BACKEND_BIND_URI %};
proxy_redirect {% $BACKEND_BIND_URI %} /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
{% if $NO_TRAFF_COUNT == on %}
access_log off;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_PHPFPM == on %}
location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f {% $EMAIL %}";
fastcgi_pass {% $PHPFPM_USER_SOCKET_PATH %};
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
{% endif %}
}

Шаблонизатор nginx  – nginx-vhosts.template

server {
server_name {% $NAME %} [% $ALIASES %];
charset [% $CHARSET %];
{% if $DIRINDEX != "" %}
index [% $DIRINDEX %];
{% endif %}
disable_symlinks if_not_owner from=$root_path;
include {% $NGINX_VHOST_INCLUDES %};
include {% $INCLUDE_RESOURCE_PATH %};
{% if $LOG_ACCESS == on %}
access_log [% $ACCESS_LOG_PATH %];
{% elif $NO_TRAFF_COUNT == on %}
access_log off;
{% endif %}
{% if $LOG_ERROR == on %}
error_log {% $ERROR_LOG_PATH %} notice;
{% else %}
error_log /dev/null crit;
{% endif %}
{% if $SSI == on %}
ssi on;
{% endif %}
{% if $REDIRECT_HTTP == on %}
return 301 https://$host:{% $SSL_PORT %}$request_uri;
{% endif %}
set $root_path {% $VIRTUAL_DOCROOT %};
{% if $AUTOSUBDOMAIN != off and $AUTOSUBDOMAIN != "" %}
{% if $AUTOSUBDOMAIN == autosubdomain_subdir %}
set $subdomain "";
{% elif $AUTOSUBDOMAIN == autosubdomain_dir %}
set $subdomain {% $AUTOSUBDOMAIN_SUBDOMAIN_PART %};
{% endif %}
if ($host ~* ^((.*).{% $NAME %})$) {
{% if $AUTOSUBDOMAIN == autosubdomain_dir %}
set $subdomain $1;
{% elif $AUTOSUBDOMAIN == autosubdomain_subdir %}
set $subdomain $2;
{% endif %}
}
root $root_path/$subdomain;
{% else %}
root $root_path;
{% endif %}
{% if $FOREGROUND == on %}
listen {% $NGINX_LISTEN_ON %} default_server;
{% else %}
listen {% $NGINX_LISTEN_ON %};
{% endif %}
{% if $USER_RESOURCES %}
include {% $USER_NGINX_RESOURCES_PATH %};
{% endif %}
{% if $SRV_GZIP == on %}
gzip on;
gzip_comp_level [% $GZIP_LEVEL %];
gzip_disable "msie6";
gzip_types [% $GZIP_TYPES %];
{% endif %}
{% if $REDIRECT_TO_APACHE != on and $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
location / {
{% if $PHP == on %}
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~ [^/]\.ph(p\d*|tml)$ {
{% if $PHP_MODE == php_mode_fcgi_nginxfpm %}
try_files /does_not_exists @php;
{% else %}
try_files /does_not_exists @fallback;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
{% if $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
try_files $uri $uri/ @fallback;
}
location / {
try_files /does_not_exists @fallback;
}
{% endif %}
}
{% if $ANALYZER != off and $ANALYZER != "" %}
location {% $WEBSTAT_LOCATION %} {
charset [% $WEBSTAT_ENCODING %];
index index.html;
{% if $PHP == on %}
location ~ [^/]\.ph(p\d*|tml)$ {
{% if $PHP_MODE == php_mode_fcgi_nginxfpm %}
try_files /does_not_exists @php;
{% else %}
try_files /does_not_exists @fallback;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
{% if $SRV_CACHE == on %}
expires [% $EXPIRES_VALUE %];
{% endif %}
try_files $uri $uri/ @fallback;
}
location {% $WEBSTAT_LOCATION %} {
try_files /does_not_exists @fallback;
}
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_APACHE == on %}
location @fallback {
proxy_pass {% $BACKEND_BIND_URI %};
proxy_redirect {% $BACKEND_BIND_URI %} /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
{% if $NO_TRAFF_COUNT == on %}
access_log off;
{% endif %}
}
{% endif %}
{% if $REDIRECT_TO_PHPFPM == on %}
location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f {% $EMAIL %}";
fastcgi_pass {% $PHPFPM_USER_SOCKET_PATH %};
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
{% endif %}
}
{% if $SSL == on %}
{% import etc/templates/default/nginx-vhosts-ssl.template %}
{% endif %}

Строка была добавлена перед обработкой php то есть тут:

{% if $PHP == on %}
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~ [^/]\.ph(p\d*|tml)$ {

После этого сохраняем, делаем рестарт и проверяем. Для проверки я переключаю сайт на php-fpm и вижу что всё работает прекрасно.

Наверно есть более изящное и более глубокое решение. Я не считаю себя крупным специалистом в этом, однако передо мной стояли 2 задачи:

1. Работоспособность сайта при переключении в режим php-fpm в ISP 5
2. Автоматическая генерация правильного site.conf nginx при работе с доменом в режиме php-fpm

Обе задачи были решены. Надеюсь и вам этот способ пригодится. Да и скорость работы гораздо выше чем на apache или cgi.

5 КОММЕНТАРИИ

  1. А как быть с WP и CGI….обычному протоколу http ставится все работает….А как только юзер подрубает https начинается танцы….Как в шаблон добавить.
    try_files $uri $uri/ /index.php?$args; # permalinks
    А то уже голову сломал….По твоему способу выкидывает ошибку…
    А с php-fpm помогло за что и спасибо….А вот как решить с обычным CGI и https (на wp и joomla и подомных cms) проблема….

  2. так как на стоковом вп на https сразу ошибка….Mixed Content: The page at и хотелось как бы исправить это чтобы пользователь сразу без лишнего гемора ставил и работал.

  3. Понял в чем дело. Да будет ошибка. Тоже сталкивался. Для этого берем плагин simple ssl к wordpress и ставим его, включаем перенаправление и ошибки не будет. Глубже пока не копал, но попробуй сделать так, должно помочь. А вот с джумлой вопрос потруднее, я с ней не работал по https и вообще давно её не ставил. Думаю там тоже должно быть решение именно к системе.

  4. Cстабильная версия: 5.90.3 выпущена 04.03.2017
    имеет данную проблему….Устраняется она добавлением в шаблонизатор пару строчек
    В apache2-vhosts.template и apache2-vhosts-ssl.template (ОБЯЗАТЕЛЬНО правки делайте в двух файлах) нужно добавить строчку
    Мой вариант как я добавил у себя просто добавил строчку в шаблоне
    {% else %}
    ErrorLog /dev/null
    SetEnvIf X-Forwarded-Proto https HTTPS=on
    {% endif %}

    Следом идем и правим nginx-vhosts.template и nginx-vhosts-ssl.template (ОБЯЗАТЕЛЬНО правки делайте в двух файлах)
    В секции шаблона просто допишите proxy_set_header X-Forwarded-Https “on”; proxy_set_header X-Forwarded-Port “443”; вот кусочек для примера (осторожно он не полон лучше сами допишите в своем файле две строчки!)
    location @fallback {
    proxy_pass {% $BACKEND_BIND_URI %};
    proxy_redirect {% $BACKEND_BIND_URI %} /;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Https “on”;
    proxy_set_header X-Forwarded-Port “443”;

    В бета версия: 5.96.1 выпущенной 13.03.2017 данный баг устранили!!!

  5. Ну вот уже хорошо. Ispsystem я писал несколько моментов, они обещали устранить также.

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь

СЕГОДНЯ ЧИТАЮТ

Полный обзор админ панели WordPress: функционал, пункты меню, настройки

Итак, вы только что установили WordPress и вошли в свой новый WordPress через «site.com/wp-admin». Что теперь? Если вы не знакомы с WordPress, ваше первое знакомство...

Настройка php-fpm в шаблонизаторе ISP 5, в режиме nginx + php-fpm

Чтобы написать одно название пришлось вспотеть, так как непросто его сформулировать. Как вы поняли основная суть статьи, рассказать для вас и запомнить для себя,...

Файл .htaccess подробное описание, где находится, настройка и оптимизация

Файл .htaccess - это файл конфигурации, который определяет, как веб-сервер отвечает на запросы. WordPress .htaccess файл может быть использован для повышения вашего сайта производительности,...

Оптимизация картинок и графики на сайте и сервере с помощью скрипта

Один из важных показателей оптимизации сайта, это показатели поисковых и других сервисов по скорости работы сайта и техническим параметрам. Их целый список, но зачастую...

Обзор WordPress редактора Gutenberg: все плюсы и минусы, как с ним работать

С выпуском WordPress 5.0 новый  редактор Gutenberg наконец-то появился у всех на панели. Хорошие это или плохие новости - все еще спорный вопрос для многих,...

Яндекс начинает бороться с агрессивной рекламой на сайтах

Только недавно Google объявил, что будет контролировать уровень рекламной насыщенности через Chrome, а тут уже и Яндекс подхватил инициативу, также высказавшись о необходимости фильтрации...

ПОХОЖИЕ МАТЕРИАЛЫ

Хак Woocommerce для отображения цену в руб и грв

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

BulletProof Security плагин WordPress: безопасность, сканер, файрвол

Защита безопасности сайта на WordPress: Сканер вредоносного кода, Файрвол, защита формы авторизации, создание резервных копий базы данных, анти-спам и многое другое. Смотрите раздел Основные...

BuddyPress плагин для создания социальной сети на WordPress (профили, группы)

Вы ищете современный, надежный и утонченный движок социальной сети? BuddyPress — это набор компонентов, составляющих социальную сеть, с отличными дополнениями из обширной библиотеки плагинов...

Age Gate плагин WordPress для создания ограничения по возрасту при входу на сайт

Существует много применения для ограничения контента по возрасту, такие как трейлеры фильмов, алкоголь или другие «взрослые» темы. Данный плагин позволяет установить возрастное ограничение на...

Simple Masonry Gallery простой плагин для организации галереи Masonry на сайте

Добавьте эффект Masonry к изображению. Поддерживает блок и шорткод. Добавьте эффект к изображениям, вставляемым в запись WordPress, пользовательские записи и страницы. Добавляет эффект в...

Direct Checkout for WooCommerce плагин для оптимизации оформления товаров Woocommerce

WooCommerce Direct Checkout - это плагин, позволяющий сократить количество шагов в процессе оформления заказа Woocommerce. Вы можете упростить процесс оформления заказа, пропустив страницу корзины...