Вопрос или проблема
Мне нужно расположить экземпляр Squid в качестве обратного прокси за Apache 2.4.6. У меня недостаточно кредитов, чтобы добавлять изображения в текст. Но вот оно
Поскольку Squid3.3 слушает на localhost:3128 и работает нормально с конфигурацией по умолчанию, у меня есть следующая конфигурация виртуального хоста для Apache:
<VirtualHost example.com:443>
SSLEngine on
[конфигурация файла сертификата]
ServerName example.com
DocumentRoot /var/www
ProxyRequests Off
ProxyVia Off
ProxyRemote * http://127.0.0.1:3128
LogLevel debug
ErrorLog /var/log/apache2/tunnel_error.log
CustomLog /var/log/apache2/tunnel_access.log combined
</VirtualHost>
Тем не менее, мои прокси-запросы вообще не обрабатываются через Squid 3.3.
Я наткнулся на множество статей в Интернете, объясняющих кэширование перед Apache, однако, (возможно, я пропустил) мне нужно, чтобы Apache принимал запросы CONNECT и передавал их на Squid.
У вас есть идея, как это сделать?
.
.
Редактировать
Пробую с помощью proxypass
ProxyRequests Off
ProxyVia Off
ProxyPass http://127.0.0.1:3128/
ProxyPassReverse http://127.0.0.1:3128/
Apache, похоже, перенаправляет мой запрос к Squid довольно неплохо. Потому что Squid на этот раз предупреждает меня о:
ОШИБКА
Запрашиваемый URL не может быть получен
При попытке получить URL: /
"Неверный URL"
Некоторые аспекты запрашиваемого URL неверны.
Некоторые возможные проблемы:
* Отсутствует или неверный протокол доступа (должен быть http:// или аналогичный)
* Отсутствует имя хоста
* Неверный двойной экранированный в URL-адресе
* Неверный символ в имени хоста; подчеркивания не допускаются.
Ваш администратор кэша - веб-мастер.
Похоже, что Squid считает, что я хотел бы получить http://icanhazip.com как страницу с моего собственного сервера. (Или я ошибаюсь?)
==> журнал доступа apache <==
1.1.1.1.myip - - [03/Apr/2014:23:33:26 +0300] "GET http://icanhazip.com/ HTTP/1.1" 400 2006 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"
==> журнал доступа squid3 <==
1396557520.935 0 127.0.0.1 NONE/400 2006 GET / - HIER_NONE/- text/html
.
.
Редактировать 2 – Диаграмма
Желаемое решение выглядит следующим образом:
1) Так как я все еще не смог найти выход. Я хотел бы улучшить вопрос, как было предложено, с помощью диаграммы.
2) Я заметил, изучая заголовки, что
GET /
Host: yahoo com
который передается от Apache к Squid, должен быть
GET http:\\yahoo.com
например, чтобы удачно это сработало.
URL диаграммы находится вверху.
комбинация
ProxyRemote * http://
localhost:3128
с
RewriteRule ^/(.*)$ http://$1 [P,L]
решила аналогичную проблему для меня.
Ответ или решение
Чтобы настроить прокси-сервер Squid за Apache 2.4, необходимо правильно сконфигурировать оба сервера так, чтобы Apache корректно передавал запросы к Squid, а Squid обрабатывал их должным образом. В данном ответе мы охватим ключевые аспекты этой настройки.
Почему необходима данная конфигурация?
Squid, как форвардный прокси, может быть использован для кеширования и фильтрации HTTP-запросов. Apache, в свою очередь, может обрабатывать HTTPS-запросы, предоставляя шифрование и дополнительные возможности. Причем, важно, чтобы Apache принимал соединения CONNECT
, которые используются для установления безопасных соединений.
Базовая конфигурация Apache
Ваш файл конфигурации виртуального хоста в Apache выглядит следующим образом:
<VirtualHost example.com:443>
SSLEngine on
# [настройка SSL-сертификатов]
ServerName example.com
DocumentRoot /var/www
ProxyRequests Off
ProxyVia Off
ProxyRemote * http://127.0.0.1:3128
LogLevel debug
ErrorLog /var/log/apache2/tunnel_error.log
CustomLog /var/log/apache2/tunnel_access.log combined
</VirtualHost>
Настройка ProxyPass и RewriteRule
Для того чтобы Apache правильно перенаправлял запросы к Squid, необходимо воспользоваться директивами ProxyPass
и RewriteRule
. Ваши настройки нужно немного доработать. Попробуйте следующую конфигурацию:
<VirtualHost example.com:443>
SSLEngine on
# [настройка SSL-сертификатов]
ServerName example.com
DocumentRoot /var/www
ProxyRequests Off
ProxyVia On
# Включаем поддержку CONNECT-запросов
<Location />
Allow from all
ProxyPassMatch "^/(.*)" "http://127.0.0.1:3128/$1"
ProxyPassReverse "/" "http://127.0.0.1:3128/"
</Location>
LogLevel debug
ErrorLog /var/log/apache2/tunnel_error.log
CustomLog /var/log/apache2/tunnel_access.log combined
</VirtualHost>
Обработка HTTPS-запросов
Если вы хотите, чтобы Apache поддерживал HTTPS-запросы и передавал их на Squid, убедитесь, что Squid настроен на поддержку соединения через CONNECT
. Это будет означать, что Squid должен уметь обрабатывать запросы вида:
CONNECT hostname:port HTTP/1.1
Host: hostname:port
Актуализация конфигурации Squid
Проверьте конфигурацию Squid (обычно находится в /etc/squid/squid.conf
или аналогичном месте) и убедитесь, что ваш Squid может обрабатывать запросы, например:
http_port 127.0.0.1:3128
http_access allow all
Убедитесь также, что у вас нет правил, которые могли бы блокировать определенные запросы.
Отладка
После внесения изменений перезапустите Apache и Squid:
sudo systemctl restart apache2
sudo systemctl restart squid
Проверьте логи Apache и Squid, чтобы увидеть, поступают ли запросы как планировалось. Поищите ошибки и при необходимости внесите коррективы в настройки.
Заключение
Такое сочетание Apache и Squid обеспечивает гибкость в управлении входящими запросами, позволяя массово настраивать работу с кешированием и безопасностью. Корректная маршрутизация запросов через ProxyPass
и обработка CONNECT
являются ключевыми аспектами успешной конфигурации этой цепочки. Не забывайте регулярно проверять логи для выявления возможных проблем и оптимизации работы системы.