Skip to content

Полезно знать по конфигураии nginx

Roman edited this page Aug 22, 2013 · 4 revisions

Статья на хабре про настройку nginx

Полезное

server {
	#...

	#rewrite_log  on;
	rewrite  ^/billing/ps/(.*)$  /pdb/billing/web/ps/$1 last;

	#...
}
server
{
	#...

	set $project_root "D:/Work/projects/web/pdblimb";
	root $project_root;
	
	#...
}

Поиск в нескольких папках

Ветка про этот тут

Пример запроса:

http://server.com/media/video/13.mp4

данный файл лежит в каком-то из каталогов:

/raid9550/1/video/13.mp4
/raid9550/2/video/13.mp4
/raid9550/3/video/13.mp4
/raid9550/4/video/13.mp4

Решение:

location /media/video/ 
{
	location ~ ^/media(.+)$ 
	{
		root /root9550;
		try_files /1$1
		 		  /2$1
				  /3$1
				  /4$1
				  =404;
	}
}

Использование alias

# Задаёт замену для указанного location'а. Например, при такой конфигурации 

location /i/ {
    alias /data/w3/images/;
}

# на запрос “/i/top.gif” будет отдан файл /data/w3/images/top.gif. 

# В значении параметра путь можно использовать переменные, кроме $document_root и $realpath_root. 

# Если alias используется внутри location'а, заданного регулярным выражением, 
# то регулярное выражение должно содержать выделения, а сам alias — ссылки на 
# эти выделения (0.7.40), например: 
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}


# Если location и последняя часть значения директивы совпадают: 
location /images/ {
    alias /data/w3/images/;
}

# то лучше воспользоваться директивой root: 
location /images/ {
    root /data/w3;
}

Поиск файлов в одной папке:

Запрос: http://server.com/screen/pic.jpg искать в /content/screen/pic.jpg

location /screen/
{
	location ~ ^/screen(.+).jpg$ 
	{
		root /content/screen;
		try_files $1.jpg =404;
	}
}

либо так, если не обязательно .jpg

location /screen/
{
	root /content;
	break;
}

Пример настройки прокстирования на другой сервер:

Допустим нам надо чтобы все запросы на server.com шли через домен other.biz (другой сервер)

server 
{
	server_name other.biz;

	error_log	off;

	location / 
	{
  		proxy_pass http://server.com;
 		proxy_redirect http://server.com/ /;
 		proxy_set_header Host server.com;

	    # Если надо передавать реальный IP то:
#		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#		proxy_set_header X-Real-IP $remote_addr;
#		proxy_set_header X-Front-Real-IP $remote_addr;
	}
}

Nginx и memcached

Самый простой пример - проверяем есть ли страница в кеше и, если есть, достаем из кеша, иначе - делаем запрос к бекенду.

server {
  location / {
    set $memcached_key $uri; # Ключ для проверки в memcached
    memcached_pass     127.0.0.1:11211; # Параметры подключения
    default_type       text/html; # Заголовок по умолчанию
    error_page         404 = @fallback; # 404 - данные в кеше не найдены
  }

  location @fallback {
    proxy_pass backend; # Бекенд
  }
}

Rewrite

Флаги вконце rewrite:

  • last - завершает обработку текущего набора директив модуля ngx_http_rewrite_module, после чего ищется новый location, соответствующий изменённому URI;
  • break - завершает обработку текущего набора директив модуля ngx_http_rewrite_module;

Пример:

location /sid {
   rewrite ^/sid/([0-9]+)/$ /index.php?sid=$1 last;
}

Если в строке замены указаны новые аргументы запроса, то предыдущие аргументы запроса добавляются после них. Если такое поведение нежелательно, можно отказаться от этого добавления, указав в конце строки замены знак вопроса, например:

rewrite ^/users/(.*)$ /show?user=$1? last;

location ищутся последовательно, но location ~ - с регулярными выражениями ищутся после обычных локейшинов.

Clone this wiki locally