Nginx: правильная структура каталогов для нескольких сайтов
Рекомендуемая структура каталогов для хостинга нескольких сайтов на одном сервере. Организация public, logs, releases директорий.
Правильная структура каталогов для хостинга нескольких сайтов. Обеспечивает безопасность, масштабируемость и удобство управления.
Рекомендуемая структура
/var/www/
├── site1.ru/
│ ├── public/ # Корневая директория сайта (указывается в root)
│ ├── logs/ # Логи сайта
│ └── releases/ # Релизы для деплоя (опционально)
├── site2.ru/
│ ├── public/
│ └── logs/
└── api.site3.ru/
├── public/
└── logs/
Создание структуры для нового сайта
# Создаём директории для сайта
mkdir -p /var/www/site1.ru/{public,logs,releases}
# Устанавливаем права
chown -R www-data:www-data /var/www/site1.ru
chmod -R 755 /var/www/site1.ru
chmod -R 644 /var/www/site1.ru/public/*
# Создаём тестовый файл
echo "Hello from site1.ru" > /var/www/site1.ru/public/index.html
Структура с деплоем (releases)
/var/www/
├── site1.ru/
│ ├── public -> releases/current/public
│ ├── logs/
│ └── releases/
│ ├── current -> 20260127-120000
│ ├── 20260127-120000/
│ │ └── public/
│ └── 20260126-150000/
│ └── public/
Скрипт для создания структуры сайта
#!/bin/bash
# Создание структуры каталогов для нового сайта
SITE_DOMAIN=$1
if [ -z "$SITE_DOMAIN" ]; then
echo "Usage: $0 <domain>"
exit 1
fi
SITE_DIR="/var/www/$SITE_DOMAIN"
# Создаём директории
mkdir -p "$SITE_DIR"/{public,logs,releases}
# Устанавливаем права
chown -R www-data:www-data "$SITE_DIR"
chmod -R 755 "$SITE_DIR"
chmod -R 644 "$SITE_DIR/public"/* 2>/dev/null || true
# Создаём тестовый index.html
cat > "$SITE_DIR/public/index.html" <<EOF
<!DOCTYPE html>
<html>
<head>
<title>$SITE_DOMAIN</title>
</head>
<body>
<h1>Welcome to $SITE_DOMAIN</h1>
<p>Site is ready!</p>
</body>
</html>
EOF
echo "✅ Структура создана для $SITE_DOMAIN"
echo "📁 Директория: $SITE_DIR"
Использование:
chmod +x create-site-structure.sh
./create-site-structure.sh site1.ru
Структура для PHP проектов
/var/www/
├── site1.ru/
│ ├── public/ # Document root (указывается в root)
│ │ ├── index.php
│ │ └── assets/
│ ├── app/ # Код приложения (недоступен из веба)
│ ├── config/ # Конфигурационные файлы
│ ├── vendor/ # Зависимости
│ ├── logs/ # Логи приложения и nginx
│ └── .env # Переменные окружения (недоступен из веба)
Структура для Node.js проектов
/var/www/
├── site1.ru/
│ ├── public/ # Статика (если нужна)
│ ├── app/ # Код приложения
│ ├── node_modules/ # Зависимости
│ ├── logs/ # Логи
│ └── .env # Переменные окружения
Структура для Python проектов
/var/www/
├── site1.ru/
│ ├── public/ # Статика
│ ├── app/ # Код приложения
│ ├── venv/ # Виртуальное окружение
│ ├── logs/ # Логи
│ └── .env # Переменные окружения
Почему public — must have
❌ Плохо (без public)
/var/www/site1.ru/
├── index.html
├── .env # Доступен из веба!
├── config.php # Доступен из веба!
└── vendor/ # Доступен из веба!
✅ Хорошо (с public)
/var/www/site1.ru/
├── public/ # Только это доступно из веба
│ ├── index.html
│ └── assets/
├── .env # Недоступен из веба
├── config.php # Недоступен из веба
└── vendor/ # Недоступен из веба
Соответствующая конфигурация Nginx
server {
listen 80;
server_name site1.ru;
# root указывает на public директорию
root /var/www/site1.ru/public;
index index.html index.php;
access_log /var/www/site1.ru/logs/access.log;
error_log /var/www/site1.ru/logs/error.log;
location / {
try_files $uri $uri/ =404;
}
}
Проверка прав доступа
# Проверка прав на директорию
ls -la /var/www/site1.ru/
# Проверка, что nginx может читать файлы
sudo -u www-data cat /var/www/site1.ru/public/index.html
# Проверка, что nginx может писать в logs
sudo -u www-data touch /var/www/site1.ru/logs/test.log
rm /var/www/site1.ru/logs/test.log
Usage:
Создавайте структуру каталогов перед настройкой virtual host. Используйте public/ как корневую директорию для всех типов проектов (PHP, Node.js, Python, статика).
Notes:
⚠️ public/ директория защищает конфигурационные файлы, .env, vendor от прямого доступа через веб. Единая структура упрощает CI/CD и деплой. Логи в отдельной директории упрощают ротацию и мониторинг.