Настройка работы сайтов на nginx + php-fpm с помощью шаблонизатора ISP 5
Чтобы написать одно название пришлось вспотеть, так как непросто его сформулировать. Как вы поняли основная суть статьи, рассказать для вас и запомнить для себя, как настроить поддержку 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 необходимо добавлять обработку в виде строки:
1 |
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 сертификатом и без него. Вот содержимое этих файлов, после добавления
1 |
try_files $uri $uri/ /index.php?q=$uri&$args; |
Шаблонизатор nginx-vhosts-ssl.template
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
server { server_name {% $NAME %} [% $ALIASES %]; ssl_certificate [% $SSL_CRT_BUNDLE_PATH %]; ssl_certificate_key [% $SSL_KEY_PATH %]; ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; {% if $HSTS == on %} add_header Strict-Transport-Security "max-age=31536000;"; {% endif %} {% if $SSL_DHPARAM == 2048 %} ssl_dhparam /etc/ssl/certs/dhparam2048.pem; {% elif $SSL_DHPARAM == 4096 %} ssl_dhparam /etc/ssl/certs/dhparam4096.pem; {% 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 %} listen {% $NGINX_SSL_LISTEN_ON %} [% $LISTEN_SSL_FLAGS %]; {% 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 THIS_BLOCK_FOR_REMOVE_EXPIRES %} expires [% $EXPIRES_VALUE %]; {% endif %} location / { {% if $PHP == on %} try_files $uri $uri/ /index.php?q=$uri&$args; location ~ [^/].ph(pd*|tml)$ { {% if $PHP_MODE == php_mode_fcgi_nginxfpm %} try_files /does_not_exists @php; {% else %} try_files /does_not_exists @fallback; {% endif %} } {% endif %} 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 %} {% if $REDIRECT_TO_APACHE == on %} try_files $uri $uri/ @fallback; {% endif %} } {% if $REDIRECT_TO_APACHE == on %} 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(pd*|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; proxy_set_header X-Forwarded-Port $server_port; {% 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(?:pd*|tml))(/?.+)$; try_files $uri =404; include fastcgi_params; } {% endif %} } |
Шаблонизатор nginx — nginx-vhosts.template
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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 %} listen {% $NGINX_LISTEN_ON %} [% $LISTEN_FLAGS %]; {% 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 THIS_BLOCK_FOR_REMOVE_EXPIRES %} expires [% $EXPIRES_VALUE %]; {% endif %} location / { {% if $PHP == on %} try_files $uri $uri/ /index.php?q=$uri&$args; location ~ [^/].ph(pd*|tml)$ { {% if $PHP_MODE == php_mode_fcgi_nginxfpm %} try_files /does_not_exists @php; {% else %} try_files /does_not_exists @fallback; {% endif %} } {% endif %} 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 %} {% if $REDIRECT_TO_APACHE == on %} try_files $uri $uri/ @fallback; {% endif %} } {% if $REDIRECT_TO_APACHE == on %} 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(pd*|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; proxy_set_header X-Forwarded-Port $server_port; {% 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(?:pd*|tml))(/?.+)$; try_files $uri =404; include fastcgi_params; } {% endif %} } {% if $SSL == on %} {% import etc/templates/nginx-vhosts-ssl.template %} {% endif %} |
Строка была добавлена перед обработкой php то есть тут:
После этого сохраняем, делаем рестарт и проверяем. Для проверки я переключаю сайт на php-fpm и вижу что всё работает прекрасно.
Наверно есть более изящное и более глубокое решение. Я не считаю себя крупным специалистом в этом, однако передо мной стояли 2 задачи:
1. Работоспособность сайта при переключении в режим php-fpm в ISP 5
2. Автоматическая генерация правильного site.conf nginx при работе с доменом в режиме php-fpm
Обе задачи были решены. Надеюсь и вам этот способ пригодится. Да и скорость работы гораздо выше чем на apache или cgi.