Одна команда — и чистый 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:
Было:

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

Перезагрузите конфиг через консоль:
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 — задача создана.
На этом настройка завершена: сервер работает, а сертификаты обновляются автоматически.