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