Для разработчиков
На нашем хостинге используется nginx для снижения нагрузок на сервера и увеличения скорости работы сайтов. Существуют различные схемы проксирования nginx->apache, их можно переключать для каждого домена в контрольной панели.
Сейчас используются четыре схемы проксирования:
- на Apache 1.3 с php 5.2 (mod_php) проксируется все, кроме явно статических файлов (*.css, *.jpg и подобное). Этот режим рекомендуется использовать для всех старых сайтов и CMS, которые не поддерживают php 5.4.
- nginx сам отдает все файлы как статические. На Apache ничего не проксируется, скрипты не работают.
- всё проксируется на Apache с php 5.2, установленным как модуль. Этот режим нужен, если вы используете mod_rewrite для адресов, заканчивающихся на .css, .jpg и т.д. для динамической генерации статических файлов.
- всё проксируется на Apache 2.4 с php 5.4, запускаемым как php-fpm через FastCGI. Этот режим рекомендуется использовать для современных сайтов, поддерживающих php 5.4.
У Apache-ей установлен mod_aclr и если попавший к Apache-у запрос на самом деле статический файл - nginx-у отдастся internal redirect на него.
По умолчанию для всех аккаунтов (кроме Битрикс тарифов) используется первый вариант проксирования и мы не рекомендуем его менять, если всё работает. Однако, если у вас сложные правила mod_rewrite или требуется, чтобы скрипты получали запросы, заканчивающиеся на .css и другие расширения, которые считаются статическими файлами, и это не работает в этом режиме, то переключение на третий вариант проксирования решит проблему.
В том случае, если у вас в домене лежат только статические файлы - можно переключить на режим "только статика" для наиболее оптимальной отдачи файлов при наименьшей нагрузке на сервер.
Как сделать переадресацию на https
Если вы установили сертификат и хотите, чтобы все посетители переадресовывались на https - необходимо добавить в .htaccess следующие строчки:
RewriteCond %{HTTP:HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Обратите внимание - их необходимо добавить перед остальными RewriteCond/RewriteRule правилами от вашей CMS.
Как отдать internal redirect
Бывают скрипты, ограничивающие доступ к статическим файлам. Мы видели много реализаций подобных скриптов на perl/php, которые после проверки прав доступа читали большие (мегабайты и гигайбаты) файлы побайтово или небольшими блоками и отдавали их nginx. Подобная логика работы крайне неоптимальна и создаёт очень большую нагрузку на сервер. Чтобы не создавать такой нагрузки, можно после проверки прав доступа в скрипте указать nginx, что он должен сам отдать этот файл.
Пример кода на php, для файла big-file.avi, который лежит в каталоге ./test/ относительно DOCUMENT_ROOT:
header("Content-Type:"); header("X-Accel-Redirect: /internal_xxx/test/big-file.avi");
Путь до файла должен быть абсолютным от DOCUMENT_ROOT, должен начинаться с /internal_xxx/, без точки в начале. При обработке такого запроса префикс "/internal_xxx" отбрасывается.
header("Content-Type:") нужно для автоматического определения майм-типа nginx-ом. Так же его можно указывать вручную.