barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком Apache Web Server. Показать все сообщения
Показаны сообщения с ярлыком Apache Web Server. Показать все сообщения

четверг, 24 мая 2012 г.

Отладка конфигурации mod_rewrite


Такой конфиг включает максимальный уровень логирования mod_rewrite, что значительно упрощает отладку конфига:
RewriteLog /var/log/apache2/rewrite.log
RewriteLogLevel 9

пятница, 27 апреля 2012 г.

Spring Security за AJP proxy

Проблема:

Приложение, использующее Spring Security, находится за AJP-прокси (Apache2 mod_proxy_ajp), которое меняет контекст приложения:
ProxyPass / ajp://localhost:8009/Context/
ProxyPassReverse / ajp://localhost:8009/Context/
Редиректы, генерируемые Spring Security, привязаны к контексту веб-приложения, что вроде бы должно исправляться директивой ProxyPassReverse, однако не работает для  AJP-проксирования (если использовать http, то Apache2 корректно модифицирует контекст при перенаправлениях).

Решение:

Вариантов, в принципе, 3:
  1. Отказаться от AJP-проксирования в пользу HTTP
  2. Разворачивать веб-приложение в корне backend-сервера
  3. Использовать mod_rewrite для корректировки контекста на стороне прокси-сервера:
RewriteEngine on
RewriteRule ^/Context/(.*)$ /$1 [R=301]
Спасибо http://stackoverflow.com/questions/6063339/spring-security-and-ajp-proxy. 

среда, 28 марта 2012 г.

Конфигурация Apache2 HTTP Server: редирект с HTTPS на HTTP

Выполняется средствами mod_rewrite:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
При этом, однако, корректная настройка SSL все равно необходима, т.к. редирект осуществляется после установления защищенного соединения.
Можно также явно указать, каким кодом отвечать при редиректе. Например, для отправки кода 301 ("Перемещено окончательно") нужно:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=permanent]
Если некоторые URL`ы требуется всё же обрабатывать по HTTPS, нужно исключить их из правила:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond $0 !/needhttps/
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} 

Конфигурация Apache2 HTTP Server: относительные приоритеты директив Redirect, ProxyPass и RewriteRule

Не знаю, написано ли это где-то в документации по Apache2 (я по крайней мере не нашел), но директива ProxyPass имеет больший приоритет, чем директива Redirect, независимо от порядка их следования в файле конфигурации, т.е. если мы имеем следующую конфигурацию:
Redirect permanent /xxx http://ya.ru
ProxyPass / http://google.com/
, то при обращении по URL`у www.myserver.com/xxx вместо браузерного редиректа на Яндекс мы увидим результат проксирования запроса на URL http://google.com/xxx. Чтобы заставить Apache работать, как мы хотим, нужно исключить путь /xxx из проксирования. В таком случае директива Redirect отработает. Получится конфиг вида:
ProxyPass /xxx !
Redirect permanent /xxx http://ya.ru
ProxyPass / http://google.com/
А вот mod_rewrite отрабатывает раньше, чем ProxyPass, поэтому URL`ы, используемые ProxyPass`ом, нужно исключать из правил mod_rewrite. Т.е. конфигурация https`ного виртуального хоста:
ProxyPass /xxx/ balancer://mybalancer/
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

при обращении в /xxx приведет к редиректу на этот же URL по http, а не к использованию балансировщика mybalancer, как хотелось бы. Чтобы всё заработало, необходимо:
ProxyPass /xxx/ balancer://mybalancer/
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond $0 !/xxx/
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}


вторник, 22 ноября 2011 г.

PHP Startup: Unable to load dynamic library '.../php_pgsql.dll' - Не найден указанный модуль

Проблема:
При попытке запуска apache + php под Windows с подключенным в php.ini расширением php_pgsql.dll в логи апача вываливает ошибка:
PHP Startup: Unable to load dynamic library '.../php_pgsql.dll' - Не найден указанный модуль
Ну и модуль, естественно, не загружается.
Причина:
Php не может найти динамические библиотеки Postgres, необходимые расширению для работы.
Решение:
Добавить директории bin и lib установки Postgres в системный PATH (например, E:\Programs\Postgres8.3\lib;E:\Programs\Postgres8.3\bin).

среда, 19 октября 2011 г.

apache 2.2.x и "MaxClients of xxx would require yy servers, and would exceed the ServerLimit value of 16."

Проблема:
При установке в конфигурации Apache версии 2.2.х параметра MaxClients большим, чем 400 (например, 1000), получаем при перезапуске ошибку:

WARNING: MaxClients of 1000 would require 40 servers,
 and would exceed the ServerLimit value of 16.
 Automatically lowering MaxClients to 400.  To increase,
 please see the ServerLimit directive.
Директивы же  ServerLimit в конфиге нету, и её добавление туда ситуации не меняет.

Причина:
В новых версиях Apache параметр ServerLimit  больше нельзя установить через конфигурацию.

Решение:
Установить MaxClients в 400 или перекомпилировать Apache (как, написано тут: http://onaxer.com/blog/blog/2010/04/11/compiling-serverlimit-in-apache-2-x/).


Apache2 mod_proxy: ProxyPass, использование balancer и проблемы с передачей оставшейся части пути backend-серверу

Проблема:
Используется mod_proxy для балансировки нагрузки (проксирования https запросов на 2 backend-сервера). В качестве пути для балансировки используется путь "/load-balancer/", при обращении по которому запрос отправляется на "https://192.168.0.101:8000/services/" или "https://192.168.0.101:8001/services/". Соответствующая настройка httpd следующая:

SSLProxyEngine on
ProxyPass /load-balancer/ balancer://myhttpsbalancer/
ProxyPassReverse /load-balancer/ https://192.168.0.101:8000/services/
ProxyPassReverse /load-balancer/ https://192.168.0.101:8001/services/
<Proxy balancer://myhttpsbalancer>
BalancerMember https://192.168.0.101:8000/services/ loadfactor=50
BalancerMember https://192.168.0.101:8001/services/ loadfactor=50
</Proxy> 

Вроде бы всё верно, но почему-то все запросы на поддиректории директории "/load-balancer/" приводят к обращению всё к той же корневой директории "/services/" backend-сервера. Т.е. при выполнении запроса на путь "/load-balancer/echo?wsdl" видим все равно тоже, что и для запроса "/load-balancer/".

Решение:
В директиве BalancerMember в конце URL убрать слеш. Т.е. получится конфигурация:

SSLProxyEngine on
ProxyPass /load-balancer/ balancer://myhttpsbalancer/
ProxyPassReverse /load-balancer/ https://192.168.0.101:8000/services/
ProxyPassReverse /load-balancer/ https://192.168.0.101:8001/services/
<Proxy balancer://myhttpsbalancer>
BalancerMember https://192.168.0.101:8000/services loadfactor=50
BalancerMember https://192.168.0.101:8001/services loadfactor=50
</Proxy>