← все скрипты

nginx-vhost.sh

bash ~ 70 строк обновлён 28 февраля 2026

Генерация конфигурации nginx virtual host за одну команду. Создаёт server block, директории для webroot и логов, проверяет синтаксис. Поддерживает два режима: статический сайт и reverse proxy (proxy_pass).

Зависимости

Использование

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