Tuesday, October 15, 2019

Docker: nginx + wordpress + php-fpm

Всем привет!
Продолжаем контейнеризировать все по-тихонечку. На этот раз переведем сайт на использование вордпресс. Сам официальный туториал не вызывает особого интереса - как мне показалось, там довольно все просто. И когда друг ко мне обратился за помощью, я подумал, что там будет все быстро сделано. Но, есть всегда свои но! Вперед:)
Первое, взглянем на оф. документ по инсталяции. Все просто! Нам понадобится docker-compose, если у вас еще не установлен, устанавливаем.
Второе, создаем директорию, где будем размещать все нужные нам файлы. Для начала хочу заметить, что по оф. доку у меня не получилось так быстро все сделать, т.к. WP не захотел работать без php-fpm, поэтому я сразу решал эту проблему. Далее показываю уже работающий конфиг, а ошибку укажу внизу поста.
Создаем docker-compose.yml
version: '3.1'
services:


Далее создаем контейнеры для WP, вашей базы данных - на выбор или Myslq или MariaDb, для Nginx и для PHP.

Контейнер WP, зависит от контейнера с базой данных:
   wordpress:
        image: wordpress
        restart: always
        ports:
            - 8080:80
        depends_on:
            - db
        environment:
            WORDPRESS_DB_HOST: db
            WORDPRESS_DB_USER: exampleuser
            WORDPRESS_DB_PASSWORD: examplepass
            WORDPRESS_DB_NAME: maindb
        volumes:
         - ./html:/var/www/html 


Контейнер с базой данных:
    db:
        image: mysql:5.7
        restart: always
        environment:
            MYSQL_DATABASE: maindb
            MYSQL_USER: exampleuser
            MYSQL_PASSWORD: examplepass
            MYSQL_RANDOM_ROOT_PASSWORD: '1'
        volumes:
         - ./database:/var/lib/mysql
         - ./my.cnf:/etc/my.cnf

Я добавил файл с некоторыми настройками для MySql. Т.к. у меня на сервере мало оперативной памяти, то я сократил размер буфера. если этого не сделать, то демон mysqld будет ругаться и не стартанет. Содержимое my.cnf:
[mysqld]
innodb_buffer_pool_size = 16M


Контейнер с веб-сервером:
   nginx:
        image: nginx3
        ports:
            - 443:443
        volumes:
            - ./nginx:/etc/nginx/
            - ./logs/nginx:/var/log/nginx
            - ./html:/var/www/html
        links:
            - wordpress
            - php
        restart: always

 
Я настроил nginx, чтобы он работал только по 443 порту и выложил все конфиги в директории ./nginx, аналогично для логов. Конфиг для Nginx'a:
server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  _;
        root   /var/www/html;
       
        ssl_certificate "/etc/ssl/certs/nginx-selfsigned.crt";
        ssl_certificate_key "/etc/ssl/certs/nginx-selfsigned.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
            try_files $uri /index.php?$args;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location /test{
            proxy_pass https://ya.ru;
        }        

}

Тут интерес вызывают только самоподписанные сертификаты и настройки php. Для тестов директория /test перекидывает на сайт яндекса.
Последний контейнер для PHP.
   php:
        build: ./php/
        volumes:
        - ./html:/var/www/html 

 
Для подключения к WP требуется библиотека mysqli, которая не установлена по умолчанию, поэтому собираем из докерфайла образ.  Я образ собираю по докер-файлу, вот содержимое:
FROM php:7-fpm
RUN docker-php-ext-install mysqli


Далее добавляем:
volumes:
    wordpress:
    db:

networks:
    local:


Запустил все с помощью:
docker-compose up -d
Проверяю логи контейнеров:
docker logs IDContainer

На этом настройка Docker'a закончена и далее уже можно переходить к настройкам самого WP. Теперь расскажу на какие грабли я наступил. Ошибки в студию:)
База показывает ошибку:
1) docker wordpress MySQL Connection Error: (2002) Connection refused
2) PHP Warning:  mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in Standard input code on line 22
Браузер показывает ошибку:
3) Error establishing a database connection
Неверный формат файла конфига для базы 
4) [ERROR] Found option without preceding group in config file /etc/my.cnf at line 1!

Успехов! 

No comments:

Post a Comment