#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');
чтобы избежать перенаправления шаблона.
Теперь, кажется, все работает правильно