Модуль mod_aclr2 для apache2 позволяет автоматизировать обслуживание статического контента при помощи nginx, работающего в качестве локального реверс-прокси. Очень полезно, когда надо, чтобы правила доступа в .htaccess срабатывали и для статики тоже. Собирается и настраивается модуль очень легко, здесь находится он сам, его документация, образцы конфигов для apache и nginx. Но при настройке пришлось применить несколько хитростей.
Вот он, этот location:
После установки модуля я задумался, а что будет, если создать директорию с именем «int»? Эксперимент показал, что nginx, сославшись на «internal», выдает 404, а без «internal» ищет запрошенный файл в корне сайта. Такое поведение мне совсем не подходило. Хитрым и вредным юзерам ничего не стоит создать такой каталог, сунуть туда что-то очень важное и прокричать мне в телефон: «Почему ничего не работает?!». Значит, надо придумать такой путь, который не угадает даже самый хитрющий юзер. Можно было написать туда длинную строку, потыкав по клавиатуре случайными пальцами, но тут я попробовал так, в качестве бреда:
и… это сработало! Директорию с именем, начинающимся на слэш создать нельзя, файл — тоже (или я плохо пытался, но у меня не вышло). Запросы вида somesite.com//file.txt попадают в первый location благодаря merge_slashes on, а внутренние редиректы нормально обрабатываются вторым location`ом. Я не совсем понял, почему оно работает, но мне кажется, что при внутреннем редиректе не происходит нормализация uri и двойной слэш не склеивается в один. Подобная конфигурация работает на сервере с парой десятков сайтов уже с месяц и проблем я пока не заметил. Только боюсь, что такое поведение nginx в будущих версиях внезапно изменится и всё сломается.
mod_aclr2 добавляет в заголовки ответа строку «X-Accel-Version: 0.01», которая мне не нравится и успешно оттуда скрывается:
А ещё у меня пропала статика в phpmyadmin, но ему помогло AccelRedirectOutsideDocRoot On в конфиге apache.
1. Выбираем уникальный путь для специального location`а
Вот он, этот location:
location /int/ { # path must be equal to Apache's DocumentRoot alias /var/www/site.com/; internal; }
После установки модуля я задумался, а что будет, если создать директорию с именем «int»? Эксперимент показал, что nginx, сославшись на «internal», выдает 404, а без «internal» ищет запрошенный файл в корне сайта. Такое поведение мне совсем не подходило. Хитрым и вредным юзерам ничего не стоит создать такой каталог, сунуть туда что-то очень важное и прокричать мне в телефон: «Почему ничего не работает?!». Значит, надо придумать такой путь, который не угадает даже самый хитрющий юзер. Можно было написать туда длинную строку, потыкав по клавиатуре случайными пальцами, но тут я попробовал так, в качестве бреда:
location / { proxy_pass http://127.0.0.1; proxy_set_header X-Accel-Internal /; } location // { alias /home/web/somesite.com/www/; internal; }
и… это сработало! Директорию с именем, начинающимся на слэш создать нельзя, файл — тоже (или я плохо пытался, но у меня не вышло). Запросы вида somesite.com//file.txt попадают в первый location благодаря merge_slashes on, а внутренние редиректы нормально обрабатываются вторым location`ом. Я не совсем понял, почему оно работает, но мне кажется, что при внутреннем редиректе не происходит нормализация uri и двойной слэш не склеивается в один. Подобная конфигурация работает на сервере с парой десятков сайтов уже с месяц и проблем я пока не заметил. Только боюсь, что такое поведение nginx в будущих версиях внезапно изменится и всё сломается.
2. Прячем из заголовков информацию о mod_aclr2
mod_aclr2 добавляет в заголовки ответа строку «X-Accel-Version: 0.01», которая мне не нравится и успешно оттуда скрывается:
proxy_hide_header X-Accel-Version;
3. Лечим статику в phpmyadmin
А ещё у меня пропала статика в phpmyadmin, но ему помогло AccelRedirectOutsideDocRoot On в конфиге apache.