server {
listen 80; #ip-v4
server_name velo;
root /var/www/velo;
#index index.html index_FC.php; #не используется в контексте конфигурации
location ~ \\w+.(js|gif|jpg|png|css|htm)$ { #статика, отдаваемая напрямую
try_files $uri =404;
expires 24h;
}
location ~ ^/(robots.txt|sitemap.xml|favicon.ico)$ { #статика, отдаваемая напрямую
try_files $uri =404;
expires 48h;
}
location / {#все остальные запросы направляются на index_FC.php
rewrite (.+)/$ $1 permanent; #убираем '/' на конце URI
try_files 1 /index_FC.php?$args; #(С) похоже на хак:-), $args - необходимо для GET
}
location /index_FC.php {#единственный скрипт для FastCGI-server-а
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
#fastcgi_index index_FC.php; #не используется в контексте конфигурации
include fastcgi.conf;
}
}
server { #редирект с сайта www.velo на velo
server_name www.velo;
return 301 $scheme://velo$request_uri;
}
https://www.nginx.com/resources/admin-guide/
1)Настройка виртуального хоста
Пример конфигурации виртуального хоста с детальными комментариями содержится в файле конфигурации по умолчанию default.
Скопируем, этот файл, отредактируем под себя, сделаем нужную нам корневую папку виртуального хоста, сделаем симлинк на файл нашей конфигурации в папке sites-available, проверим конфигурацию и рестартанем веб-сервер.
Пусть наш сайт, к примеру, называется velo и под него сделана запись в hosts
cp default velo-site
ln -s /etc/nginx/sites-available/velo-site /etc/nginx/sites-enabled/velo-site
Поправим конфигурацию:
# Конфигурация виртуального хоста для velo
server {
listen 80; #ip-v4
listen [::]:80; #ip-v6
server_name velo;
root /var/www/velo;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Проверка конфигурации:
nginx -t
Делаем рестарт nginx
/etc/init.d/nginx restart (force-reload)
Наслаждаемся файлом index.html, который мы положили ранее в папку /var/www/velo
2) Установка php-интерпретатора php7.0-fpm
aptitude php7.0-fpm (php7.0-cgi - не нужен)
При установке php7.0-fpm в консоль выводятся подсказки:
NOTICE: Not enabling PHP 7.0 FPM by default.
NOTICE: To enable PHP 7.0 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.0-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Created symlink /etc/systemd/system/multi-user.target.wants/php7.0-fpm.service → /lib/systemd/system/php7.0-fpm.service.
Останавливаем сервер nginx и php-fpm и идем редактировать конфигурацию fpm-сервера
/etc/init.d/nginx stop
/etc/init.d/php7.0-fpm stop
PS
Мой список модулей php, необходимых для работы большинства сайтов.
3)Конфигурационные файлы php7.0-fpm
Свойства соединения Nginx и интерпретатора PHP-FPM задаются в файлах конфигурации php-fpm:
/etc/php/7.0/fpm/php-fpm.conf
/etc/php/7.0/fpm/pool.d/*.conf
Если с интерпретатором есть проблема(к примеру, мы неправильно указали адрес unix-сокета), то ошибки пишутся в 3 лога:
/var/log/php7.0-fpm.log (путь определяется в файлах конфигурации)
/var/log/syslog
/var/log/daemon.log
В папке /etc/php/7.0/fpm/pool.d/ находится файл www.conf, который нам нужен(это имя для пула по умолчанию www).
В нем нас интересуют 3 строчки
user = www-data (имя пользователя, с чьими привилегиями будут исполняться php-скрипты)
group = www-data
Адрес, который принимает запросы FastCGI:
listen = /var/run/php/php7.0-fpm.sock
Данный адрес мы будем использовать в конфигурационном файле виртуального хоста
После редактирования конфигурационных файлов php7.0-fpm, если оно нам вообще потребовалось, нужно сделать рестарт сервера интерпретатора:
/etc/init.d/php7.0-fpm restart
4) Настройка виртуального хоста для работы с PHP-FPM
Сразу добавим в секции server index.php сюда:
server {
......
index index.html index_FC.php;
.....
}
В противном случае мы будем получать щелбан от сервера 403 Forbidden при попытке обратиться к нашему сайту по адресу "/"
Далее окунаемся в первоисточники, чтобы настроить наш виртуальный хост для работы с PHP
(C) https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/ - отсюда берем конфигурационный файл, корректируем его под себя:
Вариант-1 - не рабочий
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index_FC.php;
include fastcgi_params;
}
И "все плохо" - наблюдаем белый лист тестовой страницы, ошибок в логах нет от слова "совсем". Вообще ничего.
Тогда идем в папку sites-available и из файла default берем кусок кода вместо прежнего(не забываем рестартовать nginx после смены конфигурации):
Вариант-2 - все работает
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
Все работает, пытаемся, разобраться, почему не работал Вариант-1. Для этого открываем файл snippets/fastcgi-php.conf:
Конфигурация Вариант-1 подключала fastcgi_params, а Вариант-2 подключает fastcgi.conf
Файл fastcgi.conf содержит определение серверной переменной, которого недостает в файле fastcgi_params:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Эту строчку можно добавить в конфигурацию Вариант-1 и все заработает(проверено).
Вариант-3(Хеллоу-ворлд для теста)
#Минимальная конфигурация
server {
listen 80; #ip-v4
server_name velo;
root /var/www/velo;
index index_FC.php index.html;
location / {# First attempt to serve request as file, then as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location ~ \.php$ {#pass PHP scripts to FastCGI server
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index_FC.php;
include fastcgi.conf;
}
}
Она подключает 1 файл c c перечнем серверных переменных.
5) Дополнительная настройка виртуального хоста
"You should always start simple and build from there." (С)nginx devs
Конфигурация Вариант-3 годится только для теста, для реальных задач она совершенно непригодна. К примеру, она позволяет обращаться к файлам .htaccess, которые могут остаться от Apache, позволяет запустить произвольный php-файл, не перенаправляет произвольные запросы на фронт-контроллер итп.
У каждой CMS свои требования, что можно отдавать, а что нельзя, что логировать, а что - нет, примеры настроек можно глянуть здесь: https://www.nginx.com/resources/wiki/start/#full-stack-howtos
Чем проще конфигурация виртуального хоста - тем лучше: поскольку nginx-у не потребуется на каждый чих запускать проверки с гроздьями регулярных выражений. Копипастить готовые решения из интернета - не самая лучшая затея, тем более, что в конфигурациях, копируемых друг у друга, множатся и тиражируются ошибки, о чем говорят и разработчики nginx.
Постановка задачи.
1) Нам требуется все запросы, что не относятся к статике (картинки, js, css) - перенаправлять на фронт-контроллер index_FC.php вместе с параметрами GET
2) Разрешить отдавать favicon.ico, robots.txt, sitemap.xml и статику
3) Разрешить интерпретатору запускать на исполнение только файл фронт-контроллера index_FC.php.
4) Запретить отдачу и скачивание всего остального.
5) Сделать редирект домена www.site на домен site, сделать принудительный редирект с http протокола на протокол https
6) Убирать слеш в конце URI - velo/uri/ -> velo/uri
Директивы nginx:
http://nginx.org/ru/docs/http/ngx_http_core_module.html
http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html
При создании собственной конфигурации очень полезна будет информация о распространенных ошибках и ловушках: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
Покурив мануалы и набив шишек, получаем следующее решение поставленной задачи:
Вариант-4.
#Рабочая конфигурация