Разворачивание LEMP (Linux, Nginx, MariaDB, PHP-FPM) плюс ngx_pagespeed module, Memcached и phpMyAdmin в Docker контейнерах
Весь код на гитхабе. Тут только описание и принцип работы.
Использование
Установить docker-compose при помощи pip или любым другим способом:
pip install docker-compose
Клонировать репу:
git clone [email protected]:maxmureev/docker_lepm_ngx-pagespeed.git
Скопировать файлы сайта в volumes/sites/[site_dir]
. Заменить конфиги сайтов в каталоге images/nginx/conf.d/
на свои.
Запустить контейнеры:
cd docker_lepm_ngx-pagespeed docker-compose up -d
Создать базы:
# Для example.ru docker exec -it mysql-example.ru mysql -e 'CREATE DATABASE `site` CHARACTER SET utf8 COLLATE utf8_general_ci;' # Для site.com docker exec -it mysql-site.com mysql -e 'CREATE DATABASE `site` CHARACTER SET utf8 COLLATE utf8_general_ci;'
Готово. LEMP работает.
Описание
Репа разделена на два каталога images
и volumes
. Первый предназначен для хранения правил сборки контейнеров и конфигов демонов, второй для данных, каталоги из volumes аттачатся к хост системе.
Mysql
Mysql стартует с параметром --skip-grant-tables
phpMyAdmin
Коннект к базе:
Server: Имя mysql контейнера (mysql-example.ru или mysql-site.com)
Username: root
Password: Без пароля
Автостарт phpMyAdmin закомментирован намеренно для секьюрности и должен запускаться только по необходимости. Конфиг phpMyAdmin взят с официальной репы. Модифицирован только в части переменных для единообразия.
SSL
Файл dhparam.pem предлагаю сгенерировать один раз где угодно и просто добавлять инструкцией ADD
, дабы не генерировать каждый раз при пересборке.
Let'sEncrypt так же предлагаю поставить на хост систему и аттачить готовые сертификаты в контейнер, 64 строка в docker-compose.yml
Почему у контейнера Nginx базовый образ Ubuntu, а не Alpine?
Так проще. Первое - Alpine должен быть пропатчен для сборки модуля ngx_pagespeed. Второе - патчить можно только Alpine не младше версии 3.4. И мне это не нравится, ибо костыли. Не хочу использовать Alpine ради Alpine'а.
Почему не сделал автоматическую сборку на DockerHub?
Поскольку DockerHub не работает с docker-compose.yml файлом (не исключено, что плохо искал), он не может определить передаваемые из него аргументы для сборки, а для меня предпочтительнее использовать глобальные переменные в docker-compose.yml, чем быстро скачивать уже готовые образы.
При добавлении нового сайта, будут неверные права на файлы, надо назначить владельцем пользователя от которого запущен процесс php-fpm:
docker exec -it php-fpm chown -R nginx:nginx /var/www/
Как это все бэкапить написано в данной заметке.
Данный сайт работает на описанном выше стеке. Добавив в WordPress плагин кеширования с возможностью хранения данных в Memcached, можно набрать 100 очков на PageSpeed Insights и Pingdom Website Speed Test. В моем случае стоит аналитика от гугла, поэтому только 99-98.
Похоже вы закрыли свой git или забыли открыть )) А было бы интересно.
$ git clone [email protected]:maxmureev/docker_lepm_ngx-pagespeed.git
Клонирование в «docker_lepm_ngx-pagespeed»…
The authenticity of host ‘github.com (192.30.253.113)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘github.com,192.30.253.113’ (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Не удалось прочитать из внешнего репозитория.
Удостоверьтесь, что у вас есть необходимые права доступа
и репозиторий существует.
Александр, репа точно доступна. Похоже у Вас не интегрирован SSH ключ для гитхаба, попробуйте склонировать по web протоколу
git clone https://github.com/maxmureev/docker_lepm_ngx-pagespeed.git
Сенк, получилось.
>Автостарт phpMyAdmin закомментирован намеренно
я раскомментировал блок phpMyAdmin в docker-compose.yml
перестроил: docker-compose up -d —build
все вроде завелось:
docker-compose ps
Name Command State Ports
——————————————————————————————————
memcached memcached -u memcached -m 512 Up
mysql-bj.an2k.org mysqld —user=root —skip- … Up
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
php-fpm /usr/sbin/php-fpm7 —nodae … Up
phpmyadmin /run.sh phpmyadmin Up 0.0.0.0:999->80/tcp, 9000/tcp
сайт bj.an2k.org в браузере шевелиться, а вот как зайти в phpmyadmin не соображу
похоже нужно домен прописать в зоне — это понятно
но как его в nginx конфиг добавить правильно ?
Изначально предполагается, что контейнер с phpmyadmin билдится\работает отдельно от всей связки, поэтому внутри phpmyadmin контейнера уже есть свои nginx и php-fpm. Обратите внимание, что контейнер слушает порт 999.
хорошо, но как его в браузере вызвать?
где прописывать в nginx адрес: phpmyadmin.an2k.org ?
Можно зайти
— по IP
1.2.3.4:999
— по любому имени, который сопоставлен с этим IP
phpmyadmin.an2k.org:999
Адрес прописывать специально не надо, любой адрес (который сопоставлен с этим IP) будет попадать на phpmyadmin, если ломиться на нужный порт. Если очень хочется, то конфиг находится в файле
sites/images/phpmyadmin/etc/nginx.conf
, параметрserver_name _;
Спасибо, теперь все ясно.