Чтобы написать одно название пришлось вспотеть, так как непросто его сформулировать. Как вы поняли основная суть статьи, рассказать для вас и запомнить для себя, как настроить поддержку 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 я писал несколько моментов, они обещали устранить также.

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

Отправить комментарий?
Напишите ваше имя