Установка и настройка WordPress, PHP, MariaDB, PhpMyAdmin с применением прокси сервера Letsencrypt-nginx-proxy (SSL) и использованием Docker и Docker-compose на Ubuntu

Автор Itworkroom

Краткая заметка перед началом настройки

В данном руководстве для организации получения и использования бесплатного SSL сертификата для домена применяется уже сформированный docker образ обратного прокси сервера jwilder/nginx-proxy (https://github.com/jwilder/nginx-proxy), который обрабатывает приходящие на него запросы в режиме обнаружения сервисов, в зависимости от конфигурации используемого файла docker-compose.yml модифицирует запрос.
Например: поведение прокси по умолчанию, который можно отследить в файле /etc/nginx/conf.d/default.conf

server {
   server_name _;
   listen 80;
   access_log /var/log/nginx/access.log vhost;
   return 503;
}

Т.е сервис не обнаружен, вам выведена будет ошибка 503.
Пример при использовании нестандартной конфигурации docker-compose.yml.

version: '2'

services:
   nginx-proxy:
   image: jwilder/nginx-proxy
 ports:
   - "80:80"
 volumes:
   - /var/run/docker.sock:/tmp/docker.sock:ro

whoami:
 image: jwilder/whoami
 environment:
   - VIRTUAL_HOST=whoami.local

Запустите контейнер docker-compose up -d, а затем снова посмотрите в /etc/nginx/conf.d/default.conf и вы увидите:

server {
   server_name _;
   listen 80;
   access_log /var/log/nginx/access.log vhost;
return 503;
}
# whoami.local
upstream whoami.local {
## Can be connected with "a_default" network
# a_whoami_1
 server 172.20.0.2:8000;
}
server {
   server_name whoami.local;
   listen 80 ;
   access_log /var/log/nginx/access.log vhost;
   location / {
   proxy_pass http://whoami.local;
}
}

Здесь, jwilder/nginx-proxy просматривает события docker и добавляет в прокси в настройки nginx reverse.
Если при таких настройках выполнить команду: curl -H «Host: whoami.local» localhost на вашем хосте, то вывод вы получите следующий: I’m 5b343ds56277.

В этом руководстве будет использоваться docker-compose. Docker-compose это простой инструмент, который позволяет настроить и запустить несколько контейнеров одной командой. Docker-compose упрощает устранение неполадок контейнеров. Вместо разбора длинной терминальной команды, вы можете просто отредактировать конфигурационный файл docker-compose.yml и повторно запустить команду docker-compose up -d и посмотреть результаты.

Создадим отдельный каталог для проекта, в котором будет лежать первый docker-compose.yml файл.

sudo mkdir nginx-proxy && cd nginx-proxy

Создаем уникальную сеть для nginx-proxy и других контейнеров Docker для обмена данными.

sudo docker network create nginx-proxy

Создание конфигурационного docker-compose.yml файла

docker-compose.yml — это конфигурационный файл, в котором описываем какие контейнеры запускать, их настройки и связи между контейнерами.
В директории nginx-proxy, создайте новый файл с именем docker-compose.yml (sudo touch docker-compose.yml) со следующим содержимым:

version: '3'

services:
 nginx:
   image: nginx:1.13.1
    container_name: nginx-proxy
    ports:
     - "80:80"
     - "443:443"
   volumes:
     - conf:/etc/nginx/conf.d
     - vhost:/etc/nginx/vhost.d
     - html:/usr/share/nginx/html
     - certs:/etc/nginx/certs
   labels:
     - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"

 dockergen:
  image: jwilder/docker-gen:0.7.3
    container_name: nginx-proxy-gen
    depends_on:
     - nginx
    command: -notify-sighup nginx-proxy -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
   volumes:
     - conf:/etc/nginx/conf.d
     - vhost:/etc/nginx/vhost.d
     - html:/usr/share/nginx/html
     - certs:/etc/nginx/certs
     - /var/run/docker.sock:/tmp/docker.sock:ro
     - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
 letsencrypt:
  image: jrcs/letsencrypt-nginx-proxy-companion
   container_name: nginx-proxy-le
   depends_on:
     - nginx
     - dockergen
   environment:
     NGINX_PROXY_CONTAINER: nginx-proxy
     NGINX_DOCKER_GEN_CONTAINER: nginx-proxy-gen
   volumes:
     - conf:/etc/nginx/conf.d
     - vhost:/etc/nginx/vhost.d
     - html:/usr/share/nginx/html
     - certs:/etc/nginx/certs
     - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
conf:
vhost:
html:
certs:

networks:
default:
external:
name: nginx-proxy

! После копирования данного кода, обязательно проверьте форматирование текста, чтобы парсер yml воспринимал его правильно, иначе будет много ошибок.

Обратите внимание на 30 линию в приведенном выше конфиге: ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro. Здесь создается общий раздел между файлом на вашей хост машине (в примере это директория nginx-proxy) и файлом внутри Docker контейнера. Для этого нужен файл nginx.tmpl. Чтобы скачать этот файл в рабочую директорию, выполните команду:

sudo curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > nginx.tmpl

Первый запуск nginx-proxy

Находясь все в том же каталоге (~nginx-proxy), вводим команду

sudo docker-compose up -d

Начнется процесс скачивания нескольких Docker образов:

docker-compose up

Для проверки успешного запуска введите команду (docker ps), вы должны увидеть запущенные контейнеры nginx-proxy, nginx-proxy-gen, and nginx-proxy-le.

docker-compose ps

Если в процессе запуска возникли ошибки, проверьте логи:

sudo docker logs nginx-proxy
sudo docker logs nginx-proxy-gen
sudo docker logs nginx-proxy-le

Часто выходят ошибки связанные с docker сетью, для решения подобного рода ошибок, просто пересоздайте сеть заново (docker network create nginx-proxy).

После успешного запуска трех контейнеров proxy, переходим к формированию и запуску контейнеров WordPress, PHP, MariaDB, PhpMyAdmin с включенным SSL запускаемых ЗА прокси сервером.

Предварительные настройки:

Настройка DNS

Сервис Let’s Encrypt выпускает бесплатный сертификат только на реальный домен, не на IP адрес. Чтобы получить сертификат на домен, необходимо чтобы ДНС был настроен корректно. Корректно настроенный ДНС это правильно сопоставленный ip адрес веб сервера с зарегистрированным доменным именем, т.е должна быть настроена А запись, которая сопоставляет реальный ip c реальным доменным именем.

Чтобы выяснить ваш публичный белый ip адрес, введите команду на сервере:

dig +short myip.opendns.com @resolver1.opendns.com.

Базовые настройки Let’s Encrypt
Для настройки Let’s Encrypt необходимо знать следующие параметры: VIRTUAL_HOST, LETSENCRYPT_HOST, LETSENCRYPT_EMAIL

Переменные VIRTUAL_HOST и LETSENCRYPT_HOST будут одинаковыми практически для всех приложений и будут соответствовать домену, который вы использовали на предыдущем шаге для настройки DNS.

Переменная LETSENCRYPT_EMAIL не требует пояснений: используйте адрес электронной почты по вашему выбору.

В качестве примера:

environment:
   VIRTUAL_HOST: site.com
   LETSENCRYPT_HOST: site.com
   LETSENCRYPT_EMAIL: support@site.com

Описание сети Docker в docker-compose файле

networks:
 default:
   external:
    name: nginx-proxy

Настройка и запуск контейнеризированных WordPress, PHP, MariaDB, PhpMyAdmin

Создайте подкаталог по имени вашего сайта site.com, в нем создайте рабочие подкаталоги и новый файл под названием Docker-Compose.yml

mkdir site.com && cd site.com
mkdir -p conf
mkdir -p db_data
mkdir -p html
touch docker-compose.yml

conf/: каталог используемый для дополнительной конфигурации php и nginx
db-data/: каталог данных для файлов БД
html/: все wordpress файлы будут доступны в этом каталоге
docker-compose.yml — конфигурационный файл, в котором описываем какие контейнеры запускать, их настройки и связи между контейнерами.

Наполните файл docker-compose.yml следующим содержимым, учитывая ваши уникальные данные учетных записей и названия домена:

version: '3'
services:

 db:
  image: mysql:5.7
   container_name: db
   volumes:
     - db_data:/var/lib/mysql
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: password
     MYSQL_DATABASE: wordpress
     MYSQL_USER: wordpress
     MYSQL_PASSWORD: wordpress

 phpmyadmin:
  depends_on:
     - db
  image: phpmyadmin/phpmyadmin
   container_name: pma
   volumes:
     ./conf/php.ini:/usr/local/etc/php/conf.d/custom.php.ini
     ./conf/php.ini:/usr/local/etc/php/php.ini
     # переписывают значения стандартных конфигурационных файлов php, таких как размер загружаемых файлов
     # и время сессии, это пригодится в будущем, например для экспорта и импорта дампов БД
   restart: always
   ports:
     - '8080:80'
   environment:
     PMA_HOST: db
     MYSQL_ROOT_PASSWORD: password

 wordpress:
   depends_on:
     - db
   image: wordpress:latest
    container_name: wordpress
   expose:
     - 80
   volumes:
     - /html/wp-content:/var/www/html/wp-content
   restart: always
   environment:
     VIRTUAL_HOST: site.com
     LETSENCRYPT_HOST: site.com
     LETSENCRYPT_EMAIL: e@site.com
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_USER: wordpress
     WORDPRESS_DB_PASSWORD: wordpress

volumes:
db_data:
html:

networks:
default:
external:
name: nginx_proxy

Инициализируйте контейнеры командой docker-compose up -d, затем перейдите по адресу вашего домена, в примере это site.com свой домен страница установки WordPress с SSL шифрованием.

docker-compose up wp

Если в процессе запуска возникли ошибки, проверьте логи:

sudo docker logs db
sudo docker logs pma
sudo docker logs wordpress

docker-compose logs

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *