Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
wiki:nginx-phpfpm [2015/06/01 03:17] [Для сайта на основе Wordpress] |
wiki:nginx-phpfpm [2015/06/01 03:47] [Перенаправление обработки php-скриптов внутреннему серверу «PHP-FPM»] |
||
---|---|---|---|
Строка 308: | Строка 308: | ||
sudo nano /etc/nginx/common/locations/wordpress.inc</code> | sudo nano /etc/nginx/common/locations/wordpress.inc</code> | ||
Указываем виртуальную директорию (используется для удобства и читабельности) в которую будут перенаправляться запросы при необходимости | Указываем виртуальную директорию (используется для удобства и читабельности) в которую будут перенаправляться запросы при необходимости | ||
- | <code>location @wordpress | + | <code=php>location @wordpress |
{ | { | ||
rewrite "^/wordpress/(.*)$" "/wordpress/index.php?q=$1" last; | rewrite "^/wordpress/(.*)$" "/wordpress/index.php?q=$1" last; | ||
}</code> | }</code> | ||
Аналогично примеру выше предотвращаем обработку остальных директив «location» | Аналогично примеру выше предотвращаем обработку остальных директив «location» | ||
- | <code> | + | <code=php> |
location ^~ "/wordpress/" | location ^~ "/wordpress/" | ||
{ | { | ||
Строка 333: | Строка 333: | ||
return 404; | return 404; | ||
} | } | ||
- | # Перенаправление php-файлов к серверу «PHP-FPM» | + | # Перенаправление php-файлов к серверу «PHP-FPM» см. ниже по статье |
location ~ "^(/wordpress/.+?\.php)(/.*)?$" | location ~ "^(/wordpress/.+?\.php)(/.*)?$" | ||
{ | { | ||
- | # Проверяем существование файлов, пробуем исправит если нет, иначе выдаём ошибку | + | # Проверяем существование файлов, пробуем исправить если нет, иначе выдаём ошибку |
# $1 указывает на первую скобку в регулярном выражении выше - собственно адрес запрошенного php файла | # $1 указывает на первую скобку в регулярном выражении выше - собственно адрес запрошенного php файла | ||
try_files $1 $uri $uri/ $uri/index.php =404; | try_files $1 $uri $uri/ $uri/index.php =404; | ||
Строка 346: | Строка 346: | ||
} | } | ||
</code> | </code> | ||
- | Сохраняем и закрываем этот файл. | + | Сохраняем и закрываем этот файл. Опять же, он будет подключён автоматически. |
- | ==== Для сайта на основе Dokuwiki ==== | + | |
- | Ограничение доступа к базе данных и настройкам «Dokuwiki» (см. [[https://www.dokuwiki.org/security#web_access_security|Web Access Security]]), который, к примеру, находится в папке «/var/www/dokuwiki» | + | |
- | <code> | + | |
- | location ~* "^/dokuwiki/(data|conf|bin|inc)((/.*)?)$" | + | |
- | { | + | |
- | deny all; # запретить все для всех | + | |
- | return 404; # вернуть код ошибки | + | |
- | index /dokuwiki/doku.php; # индексный файл | + | |
- | } | + | |
- | </code> | + | |
- | ==== Для сайта на основе MediaWiki ==== | + | |
- | Ограничение доступа к файлам «MediaWiki» который, к примеру, находится в папке «/var/www/mediawiki» | + | |
- | location ~* "^/mediawiki/(cache|maintenance|includes|tests|serialized|extensions/Math/math|languages)((/.*)?)$" | + | |
- | { | + | |
- | deny all; # запретить все для всех | + | |
- | return 404; # вернуть код ошибки | + | |
- | } | + | |
- | ==== Для сайта на основе SMF ==== | + | |
- | Ограничение доступа к файлам «Simple Machines Forum», который, к примеру, находится в папке «/var/www/smf» | + | |
- | <code> | + | |
- | location ~* "^/smf/(cache|Packages|attachments)((/.*)?)$" | + | |
- | { | + | |
- | deny all; # запретить все для всех | + | |
- | return 404; # вернуть код ошибки | + | |
- | } | + | |
- | </code> | + | |
- | ==== Для сайта на основе phpBB ==== | + | |
- | Ограничение доступа к файлам «phpBB», который, к примеру, находится в папке «/var/www/phpbb» | + | |
- | <code> | + | |
- | location ~* "^/phpbb/(images/avatars/upload|files|cache|includes|store|config.php|common.php)((/.*)?)$" | + | |
- | { | + | |
- | deny all; # запретить все для всех | + | |
- | return 404; # вернуть код ошибки | + | |
- | } | + | |
- | </code> | + | |
- | ==== Для сайта на основе Drupal ==== | + | |
- | Настройки для сайта на основе «Drupal», который, к примеру, находится в папке «/var/www/drupal» и ограничение доступа к его файлам | + | |
- | <code> | + | |
- | location "/drupal/" | + | |
- | { | + | |
- | index /drupal/index.php; # индексный файл | + | |
- | try_files $uri $uri/ =404; # проверить есть ли файл из запроса на диске, иначе - вернуть ошибку | + | |
- | error_page 404 /drupal/index.php; # разрешить PHP сайту самому обрабатывать ошибку | + | |
- | } | + | |
- | location ~* "^/drupal/(.*\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)|(\..*|Entries.*|Repository|Root|Tag|Template))((/.*)?)$" | ||
- | { | ||
- | deny all; # запретить все для всех | ||
- | error_page 404 /drupal/index.php; # разрешить PHP сайту самому обрабатывать ошибку | ||
- | return 404; # вернуть код ошибки | ||
- | } | ||
- | </code> | ||
==== Для облачного хранилища на основе ownCloud ==== | ==== Для облачного хранилища на основе ownCloud ==== | ||
- | Для наиболее полной информации следует обратится к официальному руководству «OwnCloud» (см. [[http://doc.owncloud.org/server/6.0/admin_manual/installation/installation_source.html#nginx-configuration|Nginx Configuration]]). К примеру, «ownCloud» находится в папке «/var/www/owncloud». | + | Для наиболее полной информации следует обратится к официальному руководству «OwnCloud» (см. [[https://doc.owncloud.org/server/8.0/admin_manual/installation/nginx_configuration.html|Nginx Configuration]]). К примеру, «ownCloud» находится в папке «/var/www/owncloud». |
Создадим файл настроек для «ownCloud» и отредактируем его | Создадим файл настроек для «ownCloud» и отредактируем его | ||
- | <code>sudo touch /etc/nginx/common/locations/owncloud | + | <code>sudo touch /etc/nginx/common/locations/owncloud.inc |
- | sudo nano /etc/nginx/common/locations/owncloud</code> | + | sudo nano /etc/nginx/common/locations/owncloud.inc</code> |
- | + | Многое аналогично примеру для «Wordpress» | |
- | Добавим строчки базовых настроек | + | <code=php>location ^~ "/owncloud/" |
- | <code>location "/owncloud/" | + | |
{ | { | ||
+ | root "/var/www"; | ||
index index.php index.html index.htm; | index index.php index.html index.htm; | ||
try_files $uri $uri/ =404; | try_files $uri $uri/ =404; | ||
+ | # ownCloud предоставляет свои красивые страницы для ошибок 404 и 403 - используем их | ||
error_page 403 /owncloud/core/templates/403.php; | error_page 403 /owncloud/core/templates/403.php; | ||
error_page 404 /owncloud/core/templates/404.php; | error_page 404 /owncloud/core/templates/404.php; | ||
+ | |||
+ | # Отключаем сжатие - оно создаёт проблемы для клиента синхронизации ownCloud | ||
+ | gzip off; | ||
+ | # Переопределяем глобальную настройку описанную в главном файле | ||
+ | # увеличиваем максимальный размер загружаемых файлов | ||
+ | client_max_body_size 16G; | ||
+ | # Запрещаем читать секретные файлы | ||
+ | location ~* "^/owncloud/(\.user\.ini|data|config|db_structure\.xml|README)(/.*)?$" | ||
+ | { | ||
+ | deny all; | ||
+ | return 404; | ||
+ | } | ||
+ | location ~ "^(/owncloud/.+?\.php)(/.*)?$" | ||
+ | { | ||
+ | try_files $1 $uri $uri/ $uri/index.php =404; | ||
+ | include common/php-fpm; | ||
+ | } | ||
+ | include common/deny; | ||
+ | include common/cache; | ||
}</code> | }</code> | ||
- | И также строчки для ограничения доступа | ||
- | <code>location ~* "^/owncloud/(data|config|db_structure\.xml|README)((/.*)?)$" | ||
- | { | ||
- | deny all; | ||
- | error_page 403 /owncloud/core/templates/403.php; | ||
- | error_page 404 /owncloud/core/templates/404.php; | ||
- | return 404; | ||
- | }</code> | ||
- | Иначе пользователь может загрузить php-скрипт в «/owncloud/data/files/user/» и выполнить его вызвав «example.com/owncloud/data/user/files/foo.php». | ||
- | |||
- | Подключаем этот конфигурационный файл строчкой | ||
- | <code>include common/locations/owncloud;</code> | ||
- | в файле «/etc/nginx/sites-available/example.com». | ||
Начиная с версии «ownCloud» 8 появился отдельный файл для переопределения некоторых настроек «PHP-FPM» взамен указанных в «/etc/php5/fpm/php.ini». Открыть его можно командой | Начиная с версии «ownCloud» 8 появился отдельный файл для переопределения некоторых настроек «PHP-FPM» взамен указанных в «/etc/php5/fpm/php.ini». Открыть его можно командой | ||
Строка 436: | Строка 392: | ||
==== Базовые ограничения доступа ==== | ==== Базовые ограничения доступа ==== | ||
- | Далее идет запрет доступа к определенным каталогам, подкаталогам и файлам сайта (или «CMS», на основе которых он построен). Опишем это в конфигурационном файле «/etc/nginx/common/locations/deny» | + | Выше было написана строчка для подключение файла «/etc/common/deny» |
- | <code>sudo touch /etc/nginx/common/locations/deny | + | <code=php>include common/deny;</code> |
- | sudo nano /etc/nginx/common/locations/deny</code> | + | рассмотрим его содержание. В нём идет запрет доступа к некоторым стандартным файлам. Создадим этот файл |
- | <code># Ограничение доступа к разным файлам и папкам которые часто используются для хранения важной информации | + | <code=bash>sudo touch /etc/nginx/common/deny |
- | location ~* "/(engine|inc|data|conf|config|bin|info|install|module|profile|theme)((/.*)?)$" | + | sudo nano /etc/nginx/common/deny</code> |
- | { | + | с содержанием |
- | deny all; | + | <code=php># Запрет доступа к .htaccess и .htpasswd файлам |
- | return 404; | + | |
- | } | + | |
- | + | ||
- | # Запрет доступа к .htaccess и .htpasswd файлам | + | |
location ~* "/\.(htaccess|htpasswd)$" | location ~* "/\.(htaccess|htpasswd)$" | ||
{ | { | ||
Строка 454: | Строка 406: | ||
</code> | </code> | ||
- | <note important>Следует быть бдительным, неверно указанный шаблон здесь может сильно навредить, возможно лучше не дописывать эти директивы или указать их в конце, так как они имеют высокий приоритет. Например, с приведенным выше шаблоном блокировки, станет невозможна загрузка и скачивание с сервера файлов системы контроля версий «Mercurial», которые содержат папку с именем «data» подпадающую под данный шаблон. Ситуация усугубится если использовать «ownCloud» и «ownCloud Client», который попытается загрузить эти файлы на сервер, но потом их не найдёт, и в конце концов просто удалит их в источнике, что фактически приведет к потере файлов</note> | + | <note important>Следует быть бдительным, неверно указанный шаблон здесь может сильно навредить, возможно лучше не дописывать эти директивы или указать их в конце, так как они имеют высокий приоритет. Например, клиент ownCloud может начать удалять файлы которые не сможет загрузить на сервер из-за неправильного запрета где-то в конфигурационном файле</note> |
Следует переписать все файлы «.htaccess» в директивы «Nginx». Найти эти файлы среди файлов сайта можно, например, командой | Следует переписать все файлы «.htaccess» в директивы «Nginx». Найти эти файлы среди файлов сайта можно, например, командой | ||
- | <code bash>sudo find /var/www/ -name .htaccess</code> | + | <code=bash>sudo find /var/www/ -name .htaccess</code> |
- | Подключаем этот конфигурационный файл строчкой | + | ==== Перенаправление обработки php-скриптов внутреннему серверу «PHP-FPM» ==== |
- | <code>include common/locations/deny;</code> | + | |
- | в файле «/etc/nginx/sites-available/example.com». | + | |
- | На этом описание директорий завершено | + | В примерах выше использовался файл «/etc/nginx/common/php-fpm» — в нём идет перенаправление обработки php-скриптов внутреннему серверу «PHP-FPM» |
- | + | ||
- | ==== Перенаправление обработки php-скриптов внутреннему серверу «PHP-FPM» ==== | + | |
- | + | ||
- | Далее идет перенаправление обработки php-скриптов внутреннему серверу «PHP-FPM» | + | |
<note important> | <note important> | ||
Строка 473: | Строка 419: | ||
Также, в файле "/etc/php5/fpm/pool.d/www.conf" должно присутствовать ограничение на разширение имени | Также, в файле "/etc/php5/fpm/pool.d/www.conf" должно присутствовать ограничение на разширение имени | ||
исполняемых скриптов - "security.limit_extensions = .php .php3 .php4 .php5"</note> | исполняемых скриптов - "security.limit_extensions = .php .php3 .php4 .php5"</note> | ||
- | <note>Очень желательно в шаблоне указать явно где разрешено выполнение скриптов</note> | ||
- | <note>Важно следить что-бы выполнение скриптов не происходило в папках куда их можно свободно загрузить (например, если папка доступна одновременно FTP и HTTP серверу)</note> | ||
- | Добавляем в файл «/etc/nginx/sites-available/example.com» строчки, к примеру | + | Создаём этот файл |
- | <code> | + | |
- | # Направление PHP-скрипта для обработки FastCGI или PHP-FPM серверу | + | |
- | location ~ "^(/index\.php|/info\.php|/(wordpress|owncloud)/.+?\.php)(/.*)?$" | + | |
- | { | + | |
- | # Решение проблемы с уязвимостью (см. http://forum.nginx.org/read.php?2,88845,page=3) | + | |
- | # Не будет работать (ошибка 404) если файлы хранятся на другом сервере | + | |
- | try_files $1 $uri $uri/ $uri/index.php?q=$uri&$args $uri/index.php =404; | + | |
- | </code> | + | |
- | где «$1» -- отсылка к 1-й скобке регулярного выражения в директиве «location …» и т.д. | + | |
- | + | ||
- | Создаём файл с описанием настроек перенаправления к «PHP-FPM» | + | |
<code>sudo touch /etc/nginx/common/php-fpm | <code>sudo touch /etc/nginx/common/php-fpm | ||
sudo nano /etc/nginx/common/php-fpm</code> | sudo nano /etc/nginx/common/php-fpm</code> | ||
- | И в него добавляем строчки | + | с содержанием |
- | <code> | + | <code=php> |
# Настройки порта или сокета PHP-FPM производятся в файле "/etc/php5/fpm/pool.d/www.conf" | # Настройки порта или сокета PHP-FPM производятся в файле "/etc/php5/fpm/pool.d/www.conf" | ||
fastcgi_pass php-fpm; | fastcgi_pass php-fpm; | ||
Строка 503: | Строка 436: | ||
set $path_info $fastcgi_path_info; | set $path_info $fastcgi_path_info; | ||
fastcgi_param PATH_INFO $path_info; | fastcgi_param PATH_INFO $path_info; | ||
- | # Указание дополнительных переменных окружения PHP | + | # Additional variables |
- | fastcgi_param SERVER_ADMIN admin@example.com; | + | fastcgi_param SERVER_ADMIN email@example.com; |
fastcgi_param SERVER_SIGNATURE nginx/$nginx_version; | fastcgi_param SERVER_SIGNATURE nginx/$nginx_version; | ||
fastcgi_index index.php; | fastcgi_index index.php; | ||
</code> | </code> | ||
- | |||
- | Сохраняем и закрываем файл, подключаем его строчкой | ||
- | <code> include common/php-fpm;</code> | ||
- | в файле «/etc/nginx/sites-available/example.com». | ||
- | Закрываем фигурные скобки директивы «location» | ||
- | <code> | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Доступ к Nagios через Nginx ==== | ||
- | Если на сервере используется система мониторинга «Nagios», то обеспечение работы её веб-интерфейса тоже можно возложить на «Nginx», точнее на связку «Nginx+PHP-FPM/FastCGIWrap». Установим дополнительное ПО «FastCGIWrap» | ||
- | <code bash>sudo apt-get install fcgiwrap</code> | ||
- | это позволит открывать «*.cgi» файлы. | ||
- | |||
- | Открываем описанный выше файл со списком серверов выгрузки данных (upstream) | ||
- | <code bash>sudo nano /etc/nginx/common/upstream</code> | ||
- | и добавим в него строчки | ||
- | <code> | ||
- | upstream fcgiwrap | ||
- | { | ||
- | # FastCGIWrap сервер | ||
- | server unix:/var/run/fcgiwrap.socket; | ||
- | } | ||
- | </code> | ||
- | Создаём файл с параметрами для «FastCGIWrap» | ||
- | <code>sudo touch /etc/nginx/common/fcgiwrap | ||
- | sudo nano /etc/nginx/common/fcgiwrap</code> | ||
- | где укажем | ||
- | <code> | ||
- | # Отключаем сжатие для быстродействия | ||
- | gzip off; | ||
- | |||
- | # Стандартные параметры | ||
- | include fastcgi_params; | ||
- | |||
- | # Доп. параметры | ||
- | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | ||
- | fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name; | ||
- | fastcgi_param SERVER_ADMIN admin@example.com; | ||
- | fastcgi_param SERVER_SIGNATURE nginx/$nginx_version; | ||
- | |||
- | # Направление запроса к upstream-серверу | ||
- | fastcgi_pass fcgiwrap; | ||
- | </code> | ||
- | |||
- | Создаём файл с описанием настроек для «Nagios» | ||
- | <code bash>sudo touch /etc/nginx/common/locations/nagios</code> | ||
- | и откроем его для редактирования | ||
- | <code bash>sudo nano /etc/nginx/common/locations/nagios</code> | ||
- | И укажем необдимые параметры. | ||
- | В «Ubuntu» «Nagios» устанавливается в разные папки, «PHP»-файлы веб-интерфейса обычно находятся в «/usr/share/nagios3/htdocs/» | ||
- | <code> | ||
- | location "/nagios/" | ||
- | { | ||
- | index index.php index.html; | ||
- | try_files $uri $uri/ /nagios/index.php; | ||
- | alias "/usr/share/nagios3/htdocs/"; | ||
- | } | ||
- | </code> | ||
- | «CSS»-файлы для веб-инрфейса находятся в «/etc/nagios3/stylesheets/» | ||
- | <code> | ||
- | location ^~ "/nagios/stylesheets/" | ||
- | { | ||
- | alias "/etc/nagios3/stylesheets/"; | ||
- | } | ||
- | location ^~ "/nagios3/stylesheets/" | ||
- | { | ||
- | alias "/etc/nagios3/stylesheets/"; | ||
- | } | ||
- | </code> | ||
- | Картинки тоже прийдется описать отдельно | ||
- | <code> | ||
- | location ^~ "/nagios/images/" | ||
- | { | ||
- | alias "/usr/share/nagios3/htdocs/images/"; | ||
- | } | ||
- | location ^~ "/nagios3/images/" | ||
- | { | ||
- | alias "/usr/share/nagios3/htdocs/images/"; | ||
- | } | ||
- | </code> | ||
- | «JS»-скрипты | ||
- | <code> | ||
- | location ^~ "/nagios/js/" | ||
- | { | ||
- | alias "/usr/share/nagios3/htdocs/js/"; | ||
- | } | ||
- | location ^~ "/nagios3/js/" | ||
- | { | ||
- | alias "/usr/share/nagios3/htdocs/js/"; | ||
- | } | ||
- | </code> | ||
- | Перенаправление «PHP»-скриптов уже было описано выше, но тут требуется сделать дополнительные настройки, опишем все заново | ||
- | <code> | ||
- | location ~ "^/nagios/(.+?\.php)(/.*)?$" | ||
- | { | ||
- | # Папки nagios в /var/www нет, так что требуется сделать внутренне перенаправление в папку /usr/share/nagios3/htdocs/ | ||
- | root "/usr/share/nagios3/htdocs/"; | ||
- | # Проверка существования файла на диске | ||
- | # $1 - отсылка к первой скобке регулярного выражения в location | ||
- | # Если ничего не найдено, то открыть /nagios/index.php (можно поменять на =404) | ||
- | try_files $1 $uri $uri/ /nagios/index.php; | ||
- | # Собственно перенаправление | ||
- | rewrite "^/nagios/(.+?\.php)(/.*)?$" /$1$2 break; | ||
- | # Авторизация | ||
- | auth_basic "Authorization required to access Nagios"; | ||
- | auth_basic_user_file htpasswd; | ||
- | |||
- | # Перенаправление запросов к PHP-FPM | ||
- | include common/php-fpm; | ||
- | } | ||
- | </code> | ||
- | Подобным образом описываем перенаправление запросов к «CGI»-сприптам серверу «FastCGIWarp» | ||
- | <code> | ||
- | location ~* ^/cgi-bin/nagios3/(.+?\.cgi)$ | ||
- | { | ||
- | root "/usr/lib/cgi-bin/nagios3"; | ||
- | try_files $1 $uri $uri/ =404; | ||
- | rewrite "^/cgi-bin/nagios3/(.+?\.cgi)$" /$1 break; | ||
- | |||
- | auth_basic "Authorization required to access Nagios"; | ||
- | auth_basic_user_file htpasswd; | ||
- | |||
- | # Передаём скрипту параметры аутентификации | ||
- | fastcgi_param AUTH_USER $remote_user; | ||
- | fastcgi_param REMOTE_USER $remote_user; | ||
- | |||
- | include common/fcgiwrap; | ||
- | } | ||
- | </code> | ||
- | Сохраняем и закрываем файл. | ||
- | |||
- | А в файле «/etc/nginx/sites-available/example.com» дописываем | ||
- | <code> | ||
- | # Nagios | ||
- | include common/locations/nagios; | ||
- | </code> | ||
- | |||
- | Выше были описаны параметры аутентификации для доступа к «Nagios», однако сам файл с пользователем и хеш-суммой от пароля хранится в неизвестном для «Nginx» файле «/etc/nagios3/htpasswd.users». Просто перенесём эти настройки в известный для «Nginx» файл «/etc/nginx/htpasswd», например, командой выполненной от корневого пользователя «root» | ||
- | <code bash> | ||
- | cat /etc/nagios3/htpasswd.users >> /etc/nginx/htpasswd | ||
- | </code> | ||
- | хотя, конечно, лучше это сделать вручную. | ||
==== Кеширование ==== | ==== Кеширование ==== |