nginx-vhost.sh
Генерация конфигурации nginx virtual host за одну команду. Создаёт server block, директории для webroot и логов, проверяет синтаксис. Поддерживает два режима: статический сайт и reverse proxy (proxy_pass).
Зависимости
nginxbash 4+- Запуск от root (создаёт файлы в /etc/nginx)
Использование
chmod +x nginx-vhost.sh # Статический сайт sudo ./nginx-vhost.sh example.com static # Reverse proxy на локальный порт sudo ./nginx-vhost.sh api.example.com proxy 3000 # Проверка результата cat /etc/nginx/sites-available/example.com.conf
Код
#!/usr/bin/env bash
set -euo pipefail
# nginx-vhost.sh — генератор конфигурации nginx virtual host
# Использование: sudo ./nginx-vhost.sh <domain> <static|proxy> [port]
DOMAIN="${1:?Укажите домен}"
MODE="${2:?Укажите режим: static или proxy}"
PORT="${3:-3000}"
CONF_DIR="/etc/nginx/sites-available"
ENABLED_DIR="/etc/nginx/sites-enabled"
WEBROOT="/var/www/$DOMAIN"
LOGDIR="/var/log/nginx"
CONF_FILE="$CONF_DIR/$DOMAIN.conf"
if [ "$(id -u)" -ne 0 ]; then
echo "Ошибка: запустите от root или через sudo" >&2
exit 1
fi
if [ -f "$CONF_FILE" ]; then
echo "Ошибка: конфиг $CONF_FILE уже существует" >&2
exit 1
fi
# Создаём директории
mkdir -p "$WEBROOT"
chown -R www-data:www-data "$WEBROOT"
echo "▸ Генерация конфига: $MODE"
if [ "$MODE" = "static" ]; then
cat > "$CONF_FILE" <<EOF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
root $WEBROOT;
index index.html;
access_log $LOGDIR/${DOMAIN}_access.log;
error_log $LOGDIR/${DOMAIN}_error.log;
location / {
try_files \$uri \$uri/ =404;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
EOF
elif [ "$MODE" = "proxy" ]; then
cat > "$CONF_FILE" <<EOF
server {
listen 80;
server_name $DOMAIN;
access_log $LOGDIR/${DOMAIN}_access.log;
error_log $LOGDIR/${DOMAIN}_error.log;
location / {
proxy_pass http://127.0.0.1:$PORT;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
else
echo "Ошибка: режим должен быть static или proxy" >&2
exit 1
fi
# Активируем сайт
ln -sf "$CONF_FILE" "$ENABLED_DIR/$DOMAIN.conf"
# Проверяем синтаксис
if nginx -t 2>&1; then
echo ""
echo "✓ Конфиг создан: $CONF_FILE"
echo " Симлинк: $ENABLED_DIR/$DOMAIN.conf"
[ "$MODE" = "static" ] && echo " Webroot: $WEBROOT"
echo ""
echo " Примените: sudo systemctl reload nginx"
else
echo "⚠ Ошибка синтаксиса nginx. Проверьте конфиг." >&2
rm -f "$ENABLED_DIR/$DOMAIN.conf"
exit 1
fi