У меня появилась идея написать простой скрипт для создания файла конфигурации Nginx на основе набора файлов, которые можно было бы запустить. В моем случае это будут файлы .php из приложения. Сценарий просто создает запись конфигурации Nginx для каждого отдельного файла .php в каталоге, где будут находиться файлы .php.
На мой взгляд, указание каждого отдельного файла приложения запретило бы несанкционированное выполнение, и когда рассматриваемое приложение запускается очень просто из указанных файлов php, его должно быть легко реализовать в конфигурации Nginx. Возможно, сценарий также сможет понять, как установить общие пределы скорости для доступных пользователю файлов php и файлов, которые никогда не нужно будет видеть пользователю.
Таким образом, как я вижу идеальный сценарий, он будет создавать конфигурацию, основанную как минимум на этих свойствах:
Я задаю этот вопрос, чтобы собрать доказательства для дальнейшего продвижения, а также потому, что я не мог легко найти сценарий, который был бы направлен на создание такой конфигурации для nginx. (Может просто потому, что так легко писать ..). В конечном итоге цель - дополнительная безопасность, и поэтому я также ищу мнения о том, как такая конфигурация Nginx повлияет на нее, и является ли это вообще хорошей идеей.
Веб-служба обычно является общественной. Все (каждый файл), который вы храните в своем корневая веб-папка или любую подпапку вашего корневая веб-папка публично. Вы можете определить исключения этого поведения в конфигурации вашего веб-сервера.
Чтобы защитить файлы, сценарии и папки от общего доступа, я рекомендую хранить их не в корневой папке Интернета или ниже ее.
Следование этим общим правилам - хороший способ получить безопасный веб-сервер или сервер веб-приложений.
Чтобы быть более конкретным в отношении вашего случая, я бы рекомендовал хранить (как уже упоминал Майкл Хэмптон) только ваш index.php (и все необходимые изображения и общедоступные JavaScripts) в вашей корневой веб-папке.
Все классы PHP, которые вам понадобятся для предоставления вашего API или приложения, должны храниться отдельно от вашей корневой веб-папки, а также ваших файлов Composer (обычно хранящихся в папке vendor).
Пример структуры:
/project_root
/htdocs (web root folder)
index.php
favicon.ico
robots.txt
/images
logo.png
background.png
/javascript
script.js
/src
/php
/api
/controller
/overview
get.php
/login
get.php
put.php
delete.php
post.php
/javascript
base.js
/reload
plugin.js
/vendor
autoload.php
В приведенном выше примере следующая конфигурация Nginx предоставит ваше приложение:
server {
...
# take care to deliver public static content if file exists
# or execute /index.php if not
location / {
try_files $uri /index.php;
}
...
# do not execute /index.php if requested image or JavaScript does not exists
location ~ ^/(images|javascript)/ {
try_files $uri =404;
}
...
# execute PHP files
location ~ \.php$ {
try_files $uri /index.php;
include fastcgi_params;
fastcgi_keep_conn on;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}