User Tools

Site Tools

Translations of this page:

ru:nginx

Nginx

Nginx - это HTTP-сервер, обычно более быстрый чем Apache. Его особенность в том, как он обрабатывает запросы и отсутствии каких-либо тяжелых “довесок”. Обычно nginx используеют на доменах\серверах, с которых идет раздача статики.

Сейчас становится все более распространенной схема front\back - nginx\Apache.

Смысл этой связки в том, что все входящие конекты принимает nginx (базово более быстрый) и раздает статику, а все запросы к скриптам nginx форвардит апачу. Это заметно ускоряет работу, если у вас и скрипты и контент раздаются с одного и того же сервака.

Ошибка 1

Однако тут есть ньюанс: все трейд скрипты логят ИП адреса, а при передаче запроса от nginx к апачу последний по умолчанию видит один и тот же ИП - 127.0.0.1, тк запрос приходит от nginx, который фактически работает на том же серваке.

Другой вариант настройки: апач видит все запросы от ИП сервера (а не реального ИП юзера), и соответственно все запросы скрипт будет видить от одного и того же ИП, из-за чего может сработать защита по ип (все хиты с одного ИП и их перестанет учитывать). Обычно этот вариант можно распознать когда скрипт видит что ИП сервака и ваш ИП совпадают. В home при этом будет надпись “Nginx ↔ Apache ERROR $_SERVER[SERVER_ADDR] == $_SERVER[REMOTE_ADDR], please, contact admin.”. Надо отписать админу и показать эту страницу.

Что бы восстановить нормальную ситуацию и дать трейдскрипту работать надо попросить ваш суппорт поставить для apache модуль mod_realip, а в конфиге nginx прописать, что бы он писал настоящий ИП в X_REAL_IP.

Итого: если открыть /scj/admin/test.php то в поле REMOTE_ADDR должен быть Ваш ИП, а не ИП сервака или 127.0.0.1

Ошибка 2

Другая распространенная ошибка в том, что ИП серфера передается не только в REAL_IP, но еще в и HTTP_FORWARED_FOR.

Определить это так же просто - если открыть /scj/admin/test.php то в поле HTTP_FORWARED_FOR увидите свой ИП.

Смарт определяет прокси в том числе по полю HTTP_FORWARED_FOR и ему начинается казаться что все хиты идут через прокси.

Как пофиксить: отписать админу, что б ИП передавался только в REAL_IP. Проверить, что пофикшено: если открыть /scj/admin/test.php то поля HTTP_FORWARED_FOR быть не должно.

Результат должен быть такой: REMOTE_ADDR и REAL_IP - ваш реальный ИП, SERVER_ADDR - IP сервака (и логично что ваш ип и ип сервака не совпадают), HTTP_FORWARED_FOR отсутсвует.

Итого: если открыть /scj/admin/test.php то должно быть

  • REMOTE_ADDR - ваш IP
  • SERVER_ADRR (SERVER_IP) - IP сервера
  • HTTP_FORWARDED_FOR (или HTTP_X_FORWARDED_FOR) быть не должно

Admin password

По дефолту авторизация в админку - это базовая технология апача (.htaccess), но nginx по деофлту эти файлы не читает, поэтому варианта 2

Вариант 1

В админке переключаетесь на “Switch to multiaccess”, админка будет спрашивать пароль, однако каталоги с backups например будут все так же доступны с веба и кто угодно может утянуть ваш бекап. Поэтому лучше вариант 2.

Вариант 2

Попросить админа прописать в nginx что-то вроде

location /scj/admin/files/ {
    deny all;
}

location /scj/logs/ {
    deny all;
}

location /scj/data/ {
    deny all;
}

location /scj/backup/ {
    deny all;
}

location /scj/admin/ {
    auth_basic "Admin Zone";
    auth_basic_user_file /home/user/www/$domain/scj/admin/.htpasswd;
}

location ~* /scj/admin/(.*)\.php$ {
    index index.php;
    auth_basic "Admin Zone";
    auth_basic_user_file /home/user/www/$domain/scj/admin/.htpasswd;
}

Nginx password error

Есть несоклько вариантов задать пароль

  1. .htaccess - это конфиг файл для апача, если вы запрашиваете любой файл из каталога где лежит .htaccess - апач сначала читает его. В дефолтном варианте админка закрыта базовой авторизацией апача - в htaccess написано грубо говоря “пароль для админки в .htpasswd”
  2. Вариант 2 - пароль спрашивает сам скрипт scj/admin/index.php - этот вариант работает при использовании мультиавторизации.
  3. пароль может спрашивать nginx. Как было сказано выше он не умеет читать .htaccess но в конфиге nginx можно указать что пароль опять же в .htpasswd (как в примере выше)

Возможна следующая ошибка: стоит авторизация в варианте 3, те nginx (например пароль1) и вы в то же время включаете авторизацию 2 - когда спрашивает пароль скрипт (условно пароль2). Но поскольку у браузера поле ввода пароля одно то туда можно ввести только 1 пароль и получается что либо одна либо другая авторизация не пройдет тк разные пароли.

Что делать: использовать какой-то один вариант.

ru/nginx.txt · Last modified: 2014/01/29 18:19 (external edit)