Untitled

 avatar
unknown
sh
16 days ago
4.5 kB
3
Indexable
#!/bin/sh
#
# Скрипт автоматической установки и настройки nginx, PHP, SSL (self-signed),
# а также включения и настройки PF-файервола на FreeBSD.
#
# ВНИМАНИЕ:
# 1. Перезапишет /usr/local/etc/nginx/nginx.conf и /etc/pf.conf
# 2. Меняйте ext_if="vtnet0" на нужный вам интерфейс
# 3. Запускать ТОЛЬКО от root (или через sudo)

LOGFILE="/var/log/nginx_php_pf_setup.log"

# Перенаправляем вывод (stdout и stderr) в лог
exec > "$LOGFILE" 2>&1

echo "=== Начало работы скрипта установки и настройки (лог: $LOGFILE) ==="
echo "1. Обновляем репозитории и устанавливаем пакеты..."

pkg update -y
pkg install -y nginx php84 php84-extensions

echo "2. Настраиваем автозапуск сервисов в /etc/rc.conf..."

# Функция для аккуратного добавления строки в /etc/rc.conf
add_rcconf_line() {
    local LINE="$1"
    if ! grep -q "^${LINE}\$" /etc/rc.conf; then
        echo "$LINE" >> /etc/rc.conf
    fi
}

add_rcconf_line 'nginx_enable="yes"'
add_rcconf_line 'php_fpm_enable="yes"'
add_rcconf_line 'pf_enable="yes"'
add_rcconf_line 'pflog_enable="yes"'

echo "3. Создаём минимальный конфиг /usr/local/etc/nginx/nginx.conf..."

cat << 'EOF' > /usr/local/etc/nginx/nginx.conf
user  www;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    # Для удобства можно раскомментировать логи:
    # access_log  /var/log/nginx/access.log;
    # error_log   /var/log/nginx/error.log;

    # HTTP-сервер
    server {
        listen       80;
        server_name  _;

        root   /usr/local/www/nginx;
        index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }

    # HTTPS-сервер
    server {
        listen 443 ssl;
        server_name _;

        # Указываем пути к сертификату и ключу
        ssl_certificate     /usr/local/etc/nginx/ssl/server.crt;
        ssl_certificate_key /usr/local/etc/nginx/ssl/server.key;

        root   /usr/local/www/nginx;
        index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }
}
EOF

echo "4. Создаём тестовый PHP-файл info.php..."

cat << 'EOF' > /usr/local/www/nginx/info.php
<?php
phpinfo();
exit(0);
?>
EOF

echo "5. Генерируем самоподписанный SSL-сертификат..."

mkdir -p /usr/local/etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /usr/local/etc/nginx/ssl/server.key \
  -out /usr/local/etc/nginx/ssl/server.crt \
  -subj "/C=US/ST=Test/L=Test/O=Test/OU=Test/CN=192.168.56.201"

echo "6. Настраиваем PF-файервол (/etc/pf.conf)..."

# ВНИМАНИЕ: замените vtnet0 на нужный вам интерфейс (em0, re0, enp0s3 и т.п.)
cat << 'EOF' > /etc/pf.conf
ext_if="vtnet0"

set skip on lo0

# 1. По умолчанию всё блокируем
block all

# 2. Разрешаем исходящие соединения
pass out quick on $ext_if from any to any keep state

# 3. Разрешаем входящие соединения на SSH (22), HTTP (80) и HTTPS (443)
pass in on $ext_if proto tcp to any port { 22, 80, 443 } keep state

# 4. Пример защиты от DDoS на SSH:
table <ssh_guys> persist
block in quick from <ssh_guys> to any

pass in on $ext_if proto tcp to any port 22 \
  keep state (max-src-conn 5, max-src-conn-rate 3/60, overload <ssh_guys> flush)
EOF

echo "7. Запускаем службы..."

service php_fpm restart
service nginx restart
service pf start
service pflog start

echo "=== Установка и базовая настройка завершены успешно! ==="
echo "Проверяйте логи здесь: $LOGFILE"
Leave a Comment