Одна команда — и чистый VPS или выделенный сервер за пару минут превращается в готовый веб-хостинг: без панели управления, без лишних пакетов и с конфигом, который сам подхватывает новые домены.

Скрипт полностью рабочий: конфиги отлаживались годами и проверены на сотнях VPS и выделенных серверов, а мы сами пользуемся ими ежедневно. Тем не менее многое зависит от хостера, его настроек и других внешних факторов — пожалуйста, проверяйте работоспособность перед запуском в продакшен.

Информация#

Что делает#

Полностью автоматически, с нуля, настраивает VPS или выделенный сервер для работы веб-сервера.

Устанавливает:

  • Nginx
  • PHP-FPM версий 7.4 и 8.2 (переключается в конфиге)
  • MariaDB

В чём польза#

  • Автоматизация — универсальный конфиг избавляет от ручной настройки каждого домена (о нём ниже)
  • Безопасность — нет панели управления, значит, сервер невозможно взломать через её уязвимости
  • Чистая система — никаких ненужных пакетов и лишнего ПО
  • Гибкость — доступна тонкая настройка всего, включая сложные пробросы и редиректы внутри сервера

Что такое универсальный конфиг#

Это конфиг веб-сервера, который автоматически определяет, на какой домен пришёл запрос, и направляет его в нужную директорию. Достаточно создать в /var/www/ папку с названием домена (например, /var/www/google.com) и загрузить туда файлы — сайт заработает сразу, без дополнительных настроек.

Базовое использование#

Важно! Скрипт на 100% корректно работает на Rocky 9 и с вероятностью 99,99% — на CentOS 9. Использовать Rocky 8 или CentOS 8 можно, но нежелательно.

Только чистый сервер! Никаких LAMP и прочих сборок — только чистая ОС. Запросите её у своего хостера.

curl -s https://repo.privateflare.com/webhostscript/webhostscript.bash | bash

Через пару минут сервер будет готов. Подключайтесь по SFTP (FileZilla, WinSCP, Transmit) и загружайте лендинги и сайты.

Чтобы проверить работоспособность, направьте любой домен на IP сервера и откройте его в браузере. Предварительно создайте информационный файл:

echo "<? phpinfo();" > /var/www/noroot/index.php

После проверки обязательно удалите его:

rm -f /var/www/noroot/index.php

Расширенное использование#

Все действия выполняются по SFTP: FileZilla (Windows), WinSCP (Windows, рекомендуется) или Transmit (macOS).

Использование индивидуальных конфигов для доменов#

Пригодится, когда на сервере с обычными вайтами, лендингами и другими простыми сайтами нужно разместить, например, блог на WordPress.

Сначала отредактируйте основной конфиг Nginx — он находится в директории /etc/nginx:

Было:

image

Добавьте строку include conf.d/*.conf;. Стало:

image

Перезагрузите конфиг через консоль:

nginx -t && nginx -s reload

Затем скопируйте нужный шаблон: host_nossl.conf_ (в этом примере используется конфиг без SSL-сертификатов и HTTPS) в google.com.conf.

Откройте новый файл google.com.conf и массовой заменой поменяйте VHOST на свой домен (google.com). Остальное настройте под свои задачи. Например, для WordPress конфиг будет выглядеть так:

server {
    listen 80;
    server_name google.com; # <-- изменили

    #access_log off;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log main;

    root /var/www/google.com; # <-- изменили
    index index.php index.html;

    location ~ /.well-known {
        root /var/www/noroot;
    }

    location / {
        try_files $uri $uri/ /index.php?$args; # <-- изменили
    }

    location ~ \.php$ {
        index index.php;
        include php82.conf; # <-- изменили
    }
}

Сохраните файл и перезагрузите конфиги:

nginx -t && nginx -s reload

После этого блог уже должен работать.

Использование SSL (TLS) сертификатов#

Пригодится, если вы используете хостинг напрямую, без PrivateFlare или Cloudflare.

Сгенерируйте сертификат.

Важно! Let’s Encrypt иногда выпускает сертификаты не с первого раза — из-за технических работ, неполного обновления DNS-записей или по другим причинам. Мы не связаны с этой организацией и не можем повлиять на её работу. При неполадках проверьте A-записи и повторите попытку позже.

# в этом примере google.com - ваш домен, замените его на свой
# user@gmail.com - ваша почта, её тоже замените на свою
certbot certonly -d google.com -n --email user@gmail.com --agree-tos --webroot -w /var/www/noroot

Если сертификат успешно сгенерировался, вы увидите примерно такое сообщение:

Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/api.param.me/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/api.param.me/privkey.pem
   Your cert will expire on 2019-06-27. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"

Дальше действуйте так же, но используйте шаблон host_ssl.conf_. Итоговый конфиг будет выглядеть так:

server {
    listen 80;
    server_name google.com; # <-- изменили

    #access_log off;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log main;

    location ~ /.well-known {
        root /var/www/noroot;
    }

    location / {
        # try_files $uri $uri/ /index.php?$args;
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    http2 on;
    server_name google.com; # <-- изменили

    client_max_body_size 32m;

    root /var/www/google.com;
    index index.php index.html;

    ssl_certificate     /etc/letsencrypt/live/google.com/fullchain.pem; # <-- изменили
    ssl_certificate_key /etc/letsencrypt/live/google.com/privkey.pem; # <-- изменили
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_stapling on;
    ssl_stapling_verify on;

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log main;

    location / {
        try_files $uri $uri/ /index.php?$args; # <-- изменили
    }

    location ~ \.php$ {
        index index.php;
        include php82.conf;
    }
}

Создайте cron-задачу для обновления сертификатов. Выполните в консоли команду:

export EDITOR=nano && crontab -e

и добавьте строку:

0 0 1 * * /usr/bin/certbot renew --post-hook "systemctl reload nginx" > /var/log/renewals.log

Нажмите Control+X и подтвердите сохранение клавишей Y — задача создана.

На этом настройка завершена: сервер работает, а сертификаты обновляются автоматически.