ngnix+fpm, rewrite для umicms
ymkin
nginx-forum на nginx.us
Вт Фев 14 20:38:06 UTC 2012
ngnix+fpm, rewrite для umicms
Задача: построение конфигурации сайта
под umicms [http://www.umi-cms.ru/]
сравнение вариантов ngnix+apache и ngnix+fpm
Система: Ubuntu Server 11.10, apache-2.2.20, nginx-1.0.5,
php5-fpm-5.3.6.
Дистрибутив umicms содержит файл .htaccess с
набором правил преобразования url:
####################### UMI_CMS_HTACCESS_BEGIN
###########################
RewriteEngine On
#php_value auto_prepend_file "/libs/opaf.umi.php"
#To avoid manual css and js files recompile. Debug only.
#RewriteRule
(commonClient\.js)|(compressed\.js)|(compiled\.js)|(compiled\.css)|(compressed\.css)
developerTools/preCompile.php [L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(sys\-temp|cache|xmldb|static|packages)\/.*$ /500/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^robots\.txt$ /sbots.php?path=$1%{QUERY_STRING} [L]
RewriteRule ^sitemap\.xml$ /sitemap.php [L]
RewriteRule ^config\.ini$ / [L,R]
RewriteRule ^install\.ini$ / [L,R]
RewriteRule ^install\.log$ / [L,R]
RewriteRule ^umi\.nginx\.conf$ / [L,R]
RewriteRule ^dbview\.php$ / [L,R]
RewriteCond %{REQUEST_URI} !^styles
RewriteCond %{REQUEST_URI} !^css
RewriteCond %{REQUEST_URI} !\.css
RewriteCond %{REQUEST_URI} !^js
RewriteCond %{REQUEST_URI} !\.js
RewriteCond %{REQUEST_URI} !^images
RewriteCond %{REQUEST_URI} !^webstat
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.xml$ index.php?xmlMode=force&path=$1&%{QUERY_STRING}
[L]
RewriteRule
^\/?(udata|upage|uobject|ufs|usel|ulang|utype|umess|uhttp):?(\/\/)?(.*)$
releaseStreams.php?scheme=$1&path=$3?%{QUERY_STRING} [L]
RewriteRule ^(.*)\.json$
index.php?jsonMode=force&viewMode=full&path=$1&%{QUERY_STRING} [L]
RewriteCond %{REQUEST_URI} !^styles
RewriteCond %{REQUEST_URI} !^css
RewriteCond %{REQUEST_URI} !\.css
RewriteCond %{REQUEST_URI} !^js
RewriteCond %{REQUEST_URI} !\.js
RewriteCond %{REQUEST_URI} !^images
RewriteCond %{REQUEST_URI} !(\.ico|\.ICO)$
RewriteCond %{REQUEST_URI} !(\.jpg|\.JPG)$
RewriteCond %{REQUEST_URI} !(\.jpeg|\.JPEG)$
RewriteCond %{REQUEST_URI} !(\.png|\.PNG)$
RewriteCond %{REQUEST_URI} !(\.gif|\.GIF)$
RewriteCond %{REQUEST_URI} !(\.css|\.CSS)$
RewriteCond %{REQUEST_URI} !(\.js|\.JS)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?path=$1&%{QUERY_STRING} [L]
RewriteCond %{REQUEST_URI} (\.ico|\.ICO)$
RewriteCond %{REQUEST_URI} (\.jpg|\.JPG)$
RewriteCond %{REQUEST_URI} (\.jpeg|\.JPEG)$
RewriteCond %{REQUEST_URI} (\.png|\.PNG)$
RewriteCond %{REQUEST_URI} (\.gif|\.GIF)$
RewriteCond %{REQUEST_URI} (\.css|\.CSS)$
RewriteCond %{REQUEST_URI} (\.js|\.JS)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ [R=404]
<IfModule mod_mime.c>
AddType application/x-java-applet .class
AddType text/x-component .htc
</IfModule>
<IfModule mod_security.c>
SecFilterScanPOST Off
</IfModule>
<Files "whatsnew.txt">
Deny from all
</Files>
######################## UMI_CMS_HTACCESS_END
############################
На странице системных требований umicms
[http://www.umi-cms.ru/support/umi_cms_system_requirements/] есть
пример для ngnix+fpm
[http://www.umi-cms.ru/support/umi_cms_system_requirements/nginx_conf/],
но он перегружен конструкциями if() и не
работает (по-крайней мере у меня).
Пробуем создать более оптимальный
набор обработчиков, с учетом таких
особенностей umicms:
- лицензия umicms привязана к доменному
имени и ip-адресу (была получена при
работе сайта под apache),
- umicms формирует статический кеш страниц
в формате nginx.
Глобальные конфигурационные файлы nginx
содержат обычный набор настроек и
определение
upstream backend-apache { server 127.0.0.1:8080; }
Конфигурация виртуального хоста может
быть переключена на работу с backend-apache
или fpm (location @fallback).
Вариант с apache работоспособен
полностью, а вариант с fpm имеет проблемы
в преобразовании url.
Я определяю именованые location для
обработки запросов статических файлов
(@files), передачи запросов бекэнду (@fallback)
и общего rewrite (@umi). Остальные location служат
для rewrite по разным правилам, в
соответствии с htaccess. Переходы между
location выполняются обработчиками
error_page 405 = @files;
error_page 400 = @fallback;
######## Виртуальный хост ########
server {
listen *:80;
server_name .test.name.ru;
access_log /srv/www/test/log/nginx.access.log;
error_log /srv/www/test/log/nginx.error.log notice;
rewrite_log on;
location @fallback {
# proxy_pass http://backend-apache;
# include proxy.conf;
# include proxy_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
root /srv/www/test/www;
# Устанавливаем значение константы,
требуемое при проверке лицензии
fastcgi_param SERVER_ADDR 127.0.0.1;
}
location @files {
root /srv/www/test/www;
}
location @umi {
# Тут проблема (1)
# rewrite ^ /?path=$uri&$args last;
rewrite ^ /index.php?path=$uri&$args last;
}
error_page 405 = @files;
error_page 400 = @fallback;
server_name_in_redirect off;
location ~ \.php$ {
return 400;
}
location /admin {
return 400;
}
location /robots.txt {
rewrite ^ /sbots.php last;
}
location ~ ^(.*)\.json$ {
rewrite ^
/index.php?jsonMode=force&viewMode=full&path=$1&$query_string last;
}
location ~ ^(.*)\.xml$ {
rewrite ^ /index.php?xmlMode=force&path=$1&$query_string last;
}
location ~ ^/(udata|upage|uobject|ufs|usel|ulang|utype):?(\/\/)?(.*)$
{
rewrite ^ /releaseStreams.php?scheme=$1&path=$3?$query_string
last;
}
location ~*
(config\.ini|install\.ini|install\.log|umi\.nginx\.conf|dbview\.php) {
rewrite ^ / permanent;
}
location ~ ^/(css|styles) {
return 405;
}
location ~*
^.+\.(ico|jpg|jpeg|gif|png|svg|js|css|htc|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$
{
return 405;
}
location / {
if ($is_args = '?') { return 400; }
if ($request_method = 'POST') { return 400; }
if ($cookie_umicms_session) { return 400; }
# Обработка статического кеша umicms
try_files $uri/index.html @umi;
root /srv/www/test/www/sys-temp/static-cache/$host;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
# deny access to .htaccess files
#
location ~ /\.ht {
deny all;
}
}
###################
Наблюдаемые проблемы:
1) Правило rewrite в location @umi - На одном
сайте, и для ngnix+apache и для ngnix+fpm подходит
rewrite ^ /index.php?path=$uri&$args last;
На другом сайте, в ngnix+apache это правило
приводит к зацикливанию, а работает
rewrite ^ /?path=$uri&$args last;
2) Страницы админзоны не работают.
Прошу прокомментировать и указать на
ошибки.
Posted at Nginx Forum: http://forum.nginx.org/read.php?21,222390,222390#msg-222390
Подробная информация о списке рассылки nginx-ru