Один конфиг Nginx для работы с кучей разных сайтов

в 15:07, , рубрики: nginx, настройка, метки: ,

Если вам приходилось настраивать Nginx под нужды веб-студии, сеошников или киберсквоттеров ;), то уже наверняка знаете про символ подчёркивания в качестве server_name. Тем не менее несколько других небесполезных приёмчиков из моего примера почерпнуть можно.

Чтоб создать новый сайт на сервере с такой конфигурацией, достаточно создать директорию с именем сайта и залить в неё содержимое. А конфигурационный файл остаётся единственным и неизменным.

Конфиг делает следующее:
1. Отрезает «www» от адреса, дабы сервер нашел директорию с сайтом невзирая на эти буквы в URL.
2. Выдаёт отдельную страничку при запросе несуществующего сайта.
3. Делает стандартный редирект на index.php в корне сайта при запросе несуществующего пути.
4. Перенаправляет запрос на php-fpm при вызове .php файлов.
5. Добавляет возможность обработки .htm(l) файлов как PHP.

Директории для сайтов создаются в /var/www/all/.
Симлинки с www на без www не требуются.
В директорию /var/www/all/undefuned кладётся сайт-затычка при вызове несуществующих сайтов.
Если в каком-то сайте надо обрабатывать все html файлы как PHP, то в корень этого сайта надо положить пустой файл «.parse_html».
Ниже приведён конфигурационный файл сайта. Его можно положить в /etc/nginx/sites_enabled/default.

Ограничение, пожалуй, одно: рерайт только на index.php в корне. Но для 99.9% сайтов, что мне приходится окучивать, этот вариант подходит.

server {
	listen 80 default; # этот конфиг - умолчательный для 80 порта
	server_name _;  # хитрый ключик, обозначающий, что этот конфиг применим для любого сайта

	set $sathost $host;  # В sathost будет лежать имя сайта. Так же должна называться директрия с сайтом
	# убираем www
	if ( $host ~ ^(www.)?(.+)$ ) {
		set $sathost $2;
	}
	
	root   /var/www/all/$sathost; # конень сайта определяем автоматически
	index index.php index.html index.htm; # в каком порядке искать индексные файлы

	access_log off;	
#	access_log /var/log/nginx/all/$sathost_access.log; # такая комбинация, к сожалению, не работает. жду пока допилят
	error_log  /var/log/nginx/all.error.log error;

	location / {   # правила ниже применяются для любых запросов
                if (!-d /var/www/all/$sathost) { # если не нашли директорию с именем запрошенного сайта
		# переадресуем на сайт под названием undefined, который лежит в /all/undefined
		set $sathost undefined;
		rewrite ^ /index.php last;
                }

		# начало rewrite
		set $rflag 1;   # так как логического объединения в условных выражениях нет, то вводим переменную для сложения двух условий. flag указывает на необходимость сделать переадресацию
		if (-e $request_filename) { # если есть запрошенный файл, то переадресация не нужна
			set $rflag 0;
		}
		if (!-f /var/www/all/$sathost/index.php) { # если нет index.php в корне сайта, то переадресация тоже не нужна, ибо некуда
			set $rflag 0;
		}
		if ($rflag = 1) {  #
			rewrite  ^ /index.php  last;
		}
		# конец rewrite

		if (-f $request_filename) { # для статических файлов включаем кэш на час
			expires  1h;
			break;
		}
	}

	location ~ .php$ { # этот блок сработает при запросе .php файлов
		root   /var/www/all/$sathost;
		fastcgi_pass   127.0.0.1:9000; # тут висит php-fpm
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  /var/www/all/$sathost/$fastcgi_script_name;
		include fastcgi_params;
		break;
	}

	location ~ .htm(l?)$ { # этот блок работает при вызове .html или .htm
		# если в корне сайта лежит файл «.parse_html», то обрабатываем HTML как PHP
		fastcgi_param  SCRIPT_FILENAME  /var/www/all/$sathost/$fastcgi_script_name;
		include fastcgi_params;
		if (!-f $request_filename) { # даже если запросили .html, это не значит что он у нас есть
		    # соотвественно, если файла нет, то тоже делаем rewrite
		    rewrite  ^ /index.php  last;
		}
		if (-f /var/www/all/$sathost/.parse_html) { # проверяем на наличие метки
		    # если в директории сайта лежит ключевой файлик, то все html обрабатываем как php
		    fastcgi_pass   127.0.0.1:9000;
		}
		break;
	}
	

	location ~ /.ht { # в файлах, начинающихся на «.ht» могут лежать пароли или оставшиеся настройки от Апача - отдавать это ни к чему.
		deny  all;
	}
}

Автор: unwrecker

Поделиться

* - обязательные к заполнению поля