Данный playbook для Ansible устанавливает на удаленный сервер Nginx, PHP, MySQL и SSL сертификат Let's Encrypt.
Требования для запуска:
- Локальная или удаленная машина на Ubuntu, с которой будет производиться настройка удаленного сервера.
- Установленный на машине, с которой идет настройка, Ansible и несколько пакетов из Ansible Galaxy для Nginx, PHP, Cerbot.
- Удаленный сервер на Ubuntu, который будет настраиваться.
- Сгенерированные SSH ключи для пользователя root и www.
- Доступ к DNS панели и собственный домен, для настройки SSL сертификата.
Арендовать любой сервер на Ubuntu (достаточно 10 Гб диск, 1Гб оперативной памяти, и 1-ядерный процессор 2Ггц).
Купить домен (если необходим), для настройки SSL сертификата. Также необходимо иметь доступ к изменению DNS записей (обычно есть в веб-панели хостера), чтобы прописать ip своего сервера.
Можно установить Ansible на локальную машину с Ubuntu или другим дистрибутивом, который поддерживает Ansible. Также можно все действия проводить в Ubuntu из WSL2 для Windows 10.
- Открываем терминал, переходим в папку с SSH ключами:
cd ~/.ssh/
- Смотрим, что есть в папке, чтобы не перезаписать уже существующие ключи:
ls -la
- Генерируем ключ для пользователя root с удаленного сервера:
ssh-keygen
- Далее нас спрашивают, какое имя файла ключа указать, по умолчанию ставится всегда id_rsa, напишем свое собственное имя, так как ключей может понадобиться больше чем 1. Вы можете указать любое другое имя, которого нет в папке с ключами:
www_root_key
-
После нескольких вопросов (их можно пропустить, либо можете задать свои параметры, если это нужно), будет сгенерировано два ключа:
www_root_key
иwww_root_key.pub
, приватный и публичный соответственно. -
Далее нужно добавить соответствие ключ-пользователь-хост, чтобы SSH понимал, какой ключ использовать для подключения к нужному серверу. Для этого смотрим, есть ли в папке файл
config
, если есть, открываем его с помощью редактора nano (вся информация по нему есть в сети):
nano config
- Если файл уже был, вы можете увидеть там записи подобного плана (все параметры и их назначение можно найти в сети, здесь один из вариантов настройки, если у вас стандартный порт подключения по SSH 22 и тд.):
Host YOUR.OWN.IP.ADDRESS
- указываете ip адрес вашего сервера, куда будете подключаться
HostName YOUR.OWN.IP.ADDRESS
- тоже самое
IdentityFile ~/.ssh/www_root_key
- файл приватного ключа для пользователя root
IdentitiesOnly yes
- использование файлов идентификации только из конфига
User root
- под каким пользователем осуществлять подключение
- Если файла не было, создаем его и уже потом открываем через nano:
touch config
-
Создаем такую же конфигурацию для вашего собственного сервера и SSH ключа, просто добавить запись в файл config ниже существующих через строку.
-
Сохраняем файл config (
ctrl+O -> Enter -> ctrl+X
). -
Точно также как для root создаем файлы ключей для пользователя www и добавляем их в config, указывая
User www
. -
Копируем публичный ключ на сервер для пользователя root (для пользователя www ключ будет копироваться с помощью Ansible):
ssh-copy-id -i ~/.ssh/www_root_key root@YOUR.OWN.IP.ADDRESS
-
Появится запрос пароля для root, введите его.
-
Теперь и вы и Ansible сможет подключаться к серверу по SSH ключу. Чтобы проверить работоспособность ключа, выполните команду:
ssh root@YOUR.OWN.IP.ADDRESS
Если запроса пароля не было и вы вошли на удаленный сервер под пользователем root, то все работает верно.
- Выйдите с удаленного сервера:
exit
Теперь необходимо установить Ansible на локальную машину (важно для Ubuntu версии старше, чем 20.04, возможно потребуется предварительно добавить репозиторий с Ansible):
sudo apt install ansible
- Клонируйте репозиторий с данным playbook в локальную папку ansible:
git clone git@github.com:quoterbox/ansible-start-lemp.git ansible
- Перейдите в папку ansible, отсюда вы чуть позже будете запускать playbook для настройки сервера:
cd ansible/
- Установить нужные вам пакеты из Ansible Galaxy, например, необходимые для этого playbook:
ansible-galaxy install geerlingguy.nginx geerlingguy.php geerlingguy.certbot geerlingguy.mysql geerlingguy.php-mysql
- Проверьте работоспособность ansible:
ansible --version
-
Желательно открыть весь код из репозитория в любой IDE (например, PyCharm, PHPStorm и др.).
-
Переименовать файл
hosts.ini.example
вhosts.ini
и вписать туда ip адрес удаленного сервера. -
ansible.cfg
- указать путь к файлу с хостами hosts.ini -
playbook.yml
- раскомментировать/закомментировать ненужные таски и роли -
group_vars/main.yml
- указать домен, пользователя www и путь к его ssh ключам (предварительно их нужно добавить как и для root пользователя), пользователя root и путь к его ключам -
vars/main.yml
- указать нужную версию php, если она отличается от той, что там указана, и прочие настройки для php, nginx и mysql. -
Проверить удается ли пользователю ansible указанному в group_vars/main подключиться с ключом к серверу используя
hosts.ini
файл:
ansible all -m ping
Ответом должно быть pong
с дополнительной meta информацией.
Теперь у вас должны быть настроены ключи доступа к серверу, установлен Ansible и несколько необходимых пакетов из Ansible Galaxy.
Запускаем playbook:
ansible-playbook playbook.yml
Должны пройти все шаги установок без ошибок, ошибки подсветятся красным.
Данным playbook из репозитория будет настроена работа с папкой:
/var/www/ВАШ_ДОМЕН/src/public
, зависит от того, что указано в root директории для nginx в файле /vars/main.yml
в переменных для playbook.
Саму папку домена вы можете создать сами внутри папки /var/www/
. Для проверки работоспособности сервера, вы можете залить файл index.php с содержимым:
<?php phpinfo();
Теперь папка сайта должна быть доступна по адресу http(s)://ВАШ_ДОМЕН
Пример ошибки: Если при попытке открыть сайт http(s)://ВАШ_ДОМЕН/index.php появляется ошибка 502 от NGINX:
- Проверьте, есть ли файлы в директории root, которая указана в файле
vars/main.yml
в секции nginx_vhosts- Пример: в nginx_vhosts указан параметр
root: "/var/www/{{ domain }}/src/public"
, значит на сервере в папке/var/www/YOUR_DOMAIN_NAME.com/src/public/
должен находиться файлindex.php
- Пример: в nginx_vhosts указан параметр
- Проверьте запущены ли процессы php-fpm:
- Пример: запустите команду
sudo ps aux | grep 'php'
, она выдаст список пулов доступных для работы php-fpm, если ни одного процесса и пула нет, значит php-fpm не настроен или не запущен, вам следует проверить настройки пула в файлеvars/main.yml
в секции php_fpm_pools
- Пример: запустите команду
- Проверьте пользователя и группу, от которого запускаются nginx и php-fpm: по умолчанию веб пользователь - www, а группа - www-data. Эта команда
sudo ps aux | grep 'php'
покажет от какого пользователя и группы запущен процесс php-fpm - Проверьте права на файлы сайта в вашей root директории, например,
/var/www/YOUR_DOMAIN_NAME.com/src/public/
. Права должны быть такие же как у веб пользователя из плейбука, в данном примере это веб пользователь - www, а группа - www-data. - Проверьте, запущен ли у вас NGINX:
systemctl status nginx
(команда для Ubuntu 20.04 и подобные). Статус должен быть active - Если у вас возникли проблемы с NGINX и php-fpm, но все вроде настроено правильно, первым делом перезагрузите сервер.
Эти файлы настраиваются автоматически. Если у вас возникла ошибка, скорее всего вы можете ее исправить в настройках плейбука, а не самих конфигурационных файлах на сервере.
NGINX:
/etc/nginx/nginx.conf
/etc/nginx/sites-enabled/YOUR_DOMAIN.com.80.conf
/etc/nginx/sites-enabled/YOUR_DOMAIN.com.conf
PHP-FPM:
/etc/php/YOUR_PHP_VERSION/fpm/php.ini
/etc/php/YOUR_PHP_VERSION/fpm/php-fpm.conf
/etc/php/8.1/fpm/pool.d/www.conf
(Если имя вашего пула, который вы указали вvars/main.yml
www)