Ошибка настройки сайта WordPress в среде контейнера Docker

#wordpress #docker #apache

Вопрос:

Я хотел бы настроить среду docker с тремя контейнерами: один для привязки сервера mysql к порту 3306, один для привязки apache/letsencrypt к портам 80 и 443 и один для размещения некоторых сайтов wordpress, привязка к порту 8073.

Я настроил этот файл docker-compose, и для каждого контейнера есть файл Docker, в котором устанавливается образ rispective:

 version: "3.3"
services:
    mysql-server:
        build: 'mysql-server'
        container_name: mysql-server
        volumes:
            - db_volumes:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: test
        ports:
            - "3306:3306"
    apache-letsencrypt:
        build: 'apache-letsencrypt'
        container_name: apache-letsencrypt
        environment:
            WEBMASTER_MAIL: "example@example.it"
        volumes:
            - /etc/letsencrypt:/etc/letsencrypt
            - vhosts_volumes:/etc/apache2/sites-available
            - log_volumes:/var/log/apache2
        ports:
            - "80:80"
            - "443:443"
        network_mode: host
    wordpress_php7.2:
        build: 'php7.2'
        container_name: wordpress_php7.2
        environment:
            DB_SERVER: mysql-server
        depends_on:
            - mysql-server
        volumes:
            - /var/www/wordpress_php7.2:/var/www
            - vhosts_volumes:/etc/apache2/sites-available
            - log_volumes:/var/log/apache2
        ports:
            - "8073:80"
volumes:
    db_volumes:
        driver: local
        driver_opts:
            type: 'none'
            o: 'bind'
            device: '/var/www/databases'
    vhosts_volumes:
        driver: local
        driver_opts:
            type: 'none'
            o: 'bind'
            device: '/etc/apache2/sites-available'
    log_volumes:
        driver: local
        driver_opts:
            type: 'none'
            o: 'bind'
            device: '/var/log/apache2'
 

После создания контейнеров я поместил сайт wordpress в /var/www/wordpress_php7.2/www.example.com и настроил базу данных в контейнере mysql.

Кроме того, я успешно создаю сертификат letsencrypt в контейнере apache-letsencrypt. Поэтому я должен установить vhost, и я создаю три vhosts для одного сайта: один, который я помещаю в контейнер wordpress, привязан к порту 80 внутри контейнера:

 <VirtualHost *:80>
 ServerName www.example.com
 ServerAlias example.com
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/example.com

 <Directory /var/www/example.com>
 Options Indexes FollowSymLinks
 AllowOverride All
 </Directory>


 ErrorLog /var/log/apache2/example.com.error.log
 CustomLog /var/log/apache2/example.com.access.log combined

</VirtualHost>
 

И два других хоста внутри контейнера apache-letsencrypt привязываются к портам 80 и 443:

 <VirtualHost *:80>
  ServerName www.example.com

  ## Redirect rules
  Redirect permanent / https://www.example.com/

  ## Server aliases
  ServerAlias example.com
</VirtualHost>
 

и

 <VirtualHost *:443>
        ServerName www.example.com
        ServerAlias example.com

        SSLEngine On
        SSLCertificateFile      "/etc/letsencrypt/live/www.example.com/cert.pem"
        SSLCertificateKeyFile   "/etc/letsencrypt/live/www.example.com/privkey.pem"
        SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem"
        SSLCACertificatePath    "/etc/ssl/certs"

        SSLProxyEngine on
        ProxyPass / http://www.example.com:8073/
        ProxyPassReverse / http://www.example.com:8073/
        ProxyRequests Off
</VirtualHost>
 

Наконец, я передаю запрос внутри сети docker и устанавливаю в контейнере apache в /etc/hosts по этому пути:

 172.17.0.1 www.example.com
 

После изменения внутри сайта базы данных в таблице wp_option путь https к сайту (https://www.example.com), я получаю сообщение об ошибке too_many_redirects.

У меня есть отладка, и если я что-то повторю и выйду в index.php перед загрузкой сайта все работает правильно, поэтому я предполагаю, что внутри кода есть некоторые процессы, которые не работают.

Что не так?

Ответ №1:

Я нашел это решение для сайта wordpress:

вставьте эту директиву в хосты, привязанные к порту 443:

 RequestHeader set X-Forwarded-Proto https
 

чтобы определить протокол, который клиент использует для подключения к прокси-серверу (док. — > >https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto).

После этого я вставил этот код в первую строку functions.php файл темы:

 remove_action('template_redirect', 'redirect_canonical');
 

чтобы избежать перенаправления шаблона.

Теперь, кажется, все работает правильно