Одна команда — і чистий 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 — завдання створено.
На цьому налаштування завершено: сервер працює, а сертифікати оновлюються автоматично.