Одна команда — і чистий 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 — завдання створено.

На цьому налаштування завершено: сервер працює, а сертифікати оновлюються автоматично.