Если вам приходилось настраивать 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/undefined кладётся сайт-затычка при вызове несуществующих сайтов.
Если в каком-то сайте надо обрабатывать все html файлы как PHP, то в корень этого сайта надо положить пустой файл «.parse_html».
Ниже приведён конфигурационный файл сайта. Его можно положить в /etc/nginx/sites_enabled/default.
Ограничение, пожалуй, одно: рерайт только на index.php в корне. Но для 99.9% сайтов, что мне приходится окучивать, этот вариант подходит.
Чтоб создать новый сайт на сервере с такой конфигурацией, достаточно создать директорию с именем сайта и залить в неё содержимое. А конфигурационный файл остаётся единственным и неизменным.
Конфиг делает следующее:
1. Отрезает «www» от адреса, дабы сервер нашел директорию с сайтом невзирая на эти буквы в URL.
2. Выдаёт отдельную страничку при запросе несуществующего сайта.
3. Делает стандартный редирект на index.php в корне сайта при запросе несуществующего пути.
4. Перенаправляет запрос на php-fpm при вызове .php файлов.
5. Добавляет возможность обработки .htm(l) файлов как PHP.
Директории для сайтов создаются в /var/www/all/.
Симлинки с www на без www не требуются.
В директорию /var/www/all/undefined кладётся сайт-затычка при вызове несуществующих сайтов.
Если в каком-то сайте надо обрабатывать все 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; } }
