- Вопрос или проблема
- Ответ или решение
- Ошибка "Proxy Error 502: Error reading from remote server" в Apache с HTTPS и Docker
- 1. Основные проверки конфигурации
- 2. Настройки SSL в Apache
- 3. Открытие и проверка портов
- 4. Логирование и отладка
- 5. Обновление шифров и настроек безопасности
- 6. Дополнительные рекомендации
- Заключение
Вопрос или проблема
Я не эксперт и не вижу, в чем проблема, но, очевидно, эта ошибка вызвана мелкой деталью, которую я не могу отладить. Есть идеи?
Что у меня есть:
У меня настроено несколько виртуальных хостов с Apache2, которые управляют трафиком на разные вебсайты. Все с https благодаря Let’sEncrypt certbot, и это работает отлично.
Apache 2.4.18 (Ubuntu)
Сервер: Ubuntu 16.04
Версия Docker: 19.03.5
Что я пытаюсь сделать:
Я хочу добавить контейнер Docker, при этом сохранив мою текущую конфигурацию с Apache. Я знаю, что могу использовать что-то вроде nginx reverse companion, и я уже использую это на другом сервере, но в этом случае я не хочу этого делать.
В этой конфигурации я пытаюсь настроить виртуальный хост, который будет действовать как обратный прокси в Apache, который будет перенаправлять трафик в соответствующий контейнер Docker (на данный момент я запускаю контейнер WordPress для теста, но в будущем я хотел бы сделать это с несколькими приложениями).
Я знаю, что это на французском, но я нашел этого человека, который пытается сделать то же самое, что и я здесь
Что я сделал:
Я сделал примерно то же самое, что в учебнике, указанном выше.
- Файл docker-compose:
version: '3.3'
services:
wordpress:
depends_on:
- db
container_name: ${CONTAINER_WP_NAME}
image: wordpress:${WORDPRESS_IMAGE}
ports:
# - 8080:80
- 8081:443
restart: always
environment:
WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME}:3306
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
volumes:
- ${WP_CORE}:/var/www/html
- ${WP_CONTENT}:/var/www/html/wp-content
- ./docker/config/vhost.conf:/etc/apache2/sites-enabled/vhost-ssl.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
- Файл config/vhost для контейнера
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName mydomaine.tld
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mydomaine.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomaine.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mydomaine.tld/chain.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
- Файл sites-availabe/mydomaine.conf для apache2
<VirtualHost *:80>
ServerName mydomaine.tld
ProxyPreserveHost On
ProxyPass / http://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / http://localhost:8081/
ProxyPassReverseCookieDomain localhost mydomaine.tld
ErrorLog /srv/logs/error/mydomaine.log
CustomLog /srv/logs/access/mydomaine.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =mydomaine.tld
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- Файл sites-available/mydomaine-le-ssl.conf для apache2
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mydomaine.tld
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / https://localhost:8081/
ProxyPassReverseCookieDomain locahost mydomaine.tld
ProxyRequests Off
ErrorLog /srv/logs/error/slice.log
CustomLog /srv/logs/access/slice.log combined
SSLCertificateFile /etc/letsencrypt/live/mydomaine.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomaine.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mydomaine.tld/chain.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Моя проблема: Без SSL все работает идеально, но как только я активирую SSL и подключаюсь к порту 443 для доступа к сайту через HTTPS, я получаю 502 Proxy Error в браузере:
Proxy Error
Сервер прокси получил недействительный ответ от верхнего сервера.
Сервер прокси не смог обработать запрос
Причина: Ошибка чтения от удаленного сервера
А логи сайта возвращают эту ошибку:
AH00898: Ошибка чтения от удаленного сервера, возвращенная по /
AH01102: ошибка чтения строки состояния от удаленного сервера localhost:8081
Что я пробовал:
Я прочитал почти все проблемы по этому поводу и не смог их отладить. Я вижу, что у этого пользователя точно такие же ошибки, как у меня, но его решение не помогло мне. Я пробовал использовать порты 80 И 443 в контейнере Docker, но это ничего не меняет; без перенаправления http:// работает, но https:// нет. Каждый раз у меня одна и та же ошибка.
Я активировал необходимые и рекомендованные пакеты и у меня нет других ошибок, кроме описанных выше.
Я также глубоко копал в интернете и пробовал все решения и предложения, которые я смог найти на сегодняшний день.
Ошибка в логе не дает много подсказок, но то, что решило мою проблему, это добавление директивы, разрешающей некоторые устаревшие шифры для проксируемого сервера, в моем случае apache coyote.
Добавьте директиву SSLProxyCipherSuite.
https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslproxyciphersuite
Значения могут быть скопированы отсюда:
https://wiki.mozilla.org/Security/Server_Side_TLS
Попробуйте, вероятно, шифры (TLS 1.0 – 1.2): ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA
И посмотрите, поможет ли это запустить систему, а затем ужесточите безопасность.
Возможно, у вас проблема с iptables. Docker создает свои собственные правила для iptables. В моем случае я использовал iptables-persistent для сохранения правил, но также были сохранены и правила docker. Это проблема, потому что docker обычно создает разные правила при каждом запуске.
Вот описание моей проблемы и решение: Проблема с подключением Docker из-за конфликта с iptables-persistent
Еще одна возможная проблема:
Недостаток “ProxyPreserveHost On” в виртуальном хосте.
Это не так в оригинальном вопросе, так как он содержит эту директиву, но это может помочь кому-то другому с похожей проблемой.
<VirtualHost *:80>
...
ProxyPass / http://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
Таким образом, порт 8081 имеет слушатель http.
<VirtualHost *:443>
...
ProxyPass / https://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
Вы не можете подключиться к серверу hpps, используя https.
Ответ или решение
Ошибка "Proxy Error 502: Error reading from remote server" в Apache с HTTPS и Docker
Ошибка 502, которую вы видите, указывает на то, что Apache не может получить ответ от удаленного сервера (в данном случае вашего Docker контейнера с WordPress). Давайте подробно разберем возможные причины этой проблемы и предложим соответствующие решения.
1. Основные проверки конфигурации
Проверка Докера и контейнеров:
- Убедитесь, что контейнер WordPress запущен и доступен. Вы можете проверить это, используя команду
docker ps
для отображения всех запущенных контейнеров и их статусов. - Попробуйте получить доступ к WordPress через
http://localhost:8081
, чтобы убедиться, что сервер отвечает на запросы без использования HTTPS.
Проверка конфигурации Apache:
- Проверьте корректность конфигурации виртуальных хостов. Убедитесь, что настройки для порта 443 правильно настроены. Ошибка может возникнуть, если вы пытаетесь получить доступ к
https
серверу, который на самом деле работает поhttp
внутри контейнера.
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
Состояние соединения:
- Если ваш контейнер работает на порту 8081 и принимает трафик через HTTP, вам нужно использовать
http
в конфигурации Apache, а неhttps
:
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
2. Настройки SSL в Apache
Если вы хотите подключить HTTPS, убедитесь, что ваш контейнер также слушает HTTPS. Это можно сделать, изменив ваш Docker Compose файл. Однако в большинстве случаев встроенный сервер WordPress не предназначен для работы через HTTPS, и для этого рекомендуется использовать дополнительный прокси-сервер (например, Nginx) или настраивать SSL на стороне Apache.
Пример конфигурации для вашего виртуального хоста Apache на порт 443:
<VirtualHost *:443>
ServerName mydomaine.tld
ProxyPreserveHost On
SSLProxyEngine On
...
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
...
</VirtualHost>
3. Открытие и проверка портов
Если ошибка сохраняется, это также может быть связано с конфигурацией сетевых правил:
- Убедитесь, что порты не заблокированы фаерволом. Проверьте правила iptables на вашем сервере и убедитесь, что они не мешают трафику.
- Попробуйте временно отключить фаервол для отладки:
sudo ufw disable
Затем проверьте, сохраняется ли ошибка.
4. Логирование и отладка
Для более глубокого понимания проблемы, увеличьте уровень журналирования Apache:
LogLevel debug
Посмотрите на журналы ошибок (например, /srv/logs/error/mydomaine.log
) и убедитесь, что нет других скрытых ошибок.
5. Обновление шифров и настроек безопасности
Некоторые версии серверов могут не поддерживать определенные современные шифры, что также может вызывать подобные ошибки. Рассмотрите возможность добавления настроек шифров:
SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
6. Дополнительные рекомендации
- Убедитесь, что все используемые модули включены. В вашем случае необходимо активировать
mod_proxy
,mod_ssl
,mod_proxy_http
иmod_proxy_ssl
. - Если ошибка продолжается, рассмотрите использование альтернативного подхода, такого как использование Nginx в качестве прокси-сервера перед Apache или полное мигрирование конфигураций на Nginx.
Заключение
Проблема с 502 Proxy Error, скорее всего, связана с несовпадением протоколов (HTTP/HTTPS) или с проблемами сетевой конфигурации. После выполнения указанных шагов, вы сможете устранить проблему и получить доступ к вашему приложению без ошибок. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.