LINUX.ORG.RU
ФорумAdmin

nginx. Недодокументация. Как организовать массовый редирект на Апач?


0

0

С единичным редиректом всё понятно:

server {
    listen  89.108.87.120:8881;
    server_name admin.airbase.ru;
    access_log /var/log/nginx/airbase.ru/admin-access.log combined;

    root /var/www/admin.airbase.ru/htdocs;

    location / {
        proxy_pass http://admin.airbase.ru/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

И всё работает.

А что, если нужно так заредиректить два десятка доменов? Понятно, что два десятка таких записей - не наш метод.

Всевозможные комбинации if'ов не помогают, сцуко, оно почти никуда не может корректно вставиться.

В голову приходит дурацкая идея. Поместить список доменов в файл, скажем, vhosts-redirect-apache.list в виде:

.admin.airbase.ru   admin.airbase.ru;

и заюзать его директивой map:

    map $host   $vhost_name {
        hostnames;
        include /etc/nginx/inc-bal/vhosts-redirect-apache.list;
    }

    server {
        listen  89.108.87.120:8881;
        server_name $vhost_name;
        access_log /var/log/nginx/$vhost_name.log combined;
        root /var/www/$vhost_name/htdocs;

        location / {
            proxy_pass http://admin.airbase.ru/;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

Но тут нас подстерегает облом (хотя, как раз, тут никакой ругани на конфиг нет) - директива server же парсится один раз, при старте сервера. Соответственно - не работает.

Как бы это всё заюзать, чтобы работало? :)

Более чудовищную документацию, чем по nginx на офсайте я мало где видел :-/

★★★★★

Напиши в рассылку. Правда есть шанс что напишут "генерь конфиги перлом". У некоторых по 10тыщ виртохостов было...

Может тебе надо вообще всё проксить? Тогда задача упрощается. Так же можно эти 20сайтов на отдельный ip закинуть и тоже будет жить проще.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Короче, пока решил так. Ужасно, но работает:

    server {
        listen  89.108.87.120:8881;
        server_name admin.airbase.ru;
        proxy_redirect       off;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location / {
            if ( $host ~ "(www\.)?(host1.ru|host2.ru|tut|dlinny|spisok|hostov)" ) {
                access_log      off;
                proxy_pass http://89.108.87.120:80;
            }
        }
    }

...

По сути, готовлю сведение apache на одном IP и lighttpd на другом на один общий IP с разделением через nginx фронтент. Второй IP высвобождаю для KVM :) Вроде, в Apache сейчас всё ок, так что можно будет их подмахнуть с nginx местами. А там и Лайти заведу в бэкенд.

KRoN73 ★★★★★
() автор топика

тебе просто нужен нормальный распределитель нагрузки... попробуй, что-либо в духе F5 или ZXTM..

MiracleMan ★★★★★
()
Ответ на: комментарий от drull

Я server_name сейчас вообще из этого блока убрал - и без него работает.

...

А так - задача стоит именно в том, чтобы некоторую часть доменов, но не все, заруливать на Апач.

...

При обмене их местами столкнулся с другой неприятной фигнёй. У Апача каждый виртхост записан в виде

<VirtualHost *:80>
...

Т.е. оно, собако, все виртхосты на 80-м порту ищет. Придётся Апач (чтобы меньше править конфигов) не на левый порт основного IP вешать, а на 80-й порт левого IP... Стрёмно сейчас лезть на удалённой машине с сетевым интерфейсом ковыряться, а что делать... Вся возня как раз и делается ради высвобождения IP для KVM :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от MiracleMan

>тебе просто нужен нормальный распределитель нагрузки

Да нет, я, чтобы сущности не плодить, со временем и часть сайтов через nginx отдавать буду :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

nginx, конечно, всем хорош, но уж больно в настройках геморный, чуть только ситуация от стандартной отличается.. но, это уже дело вкуса..

MiracleMan ★★★★★
()
Ответ на: комментарий от MiracleMan

Да, я прелести связывание с spawn-fcgi уже оценил :) Похоже, основные сайты с PHP, таки, под lighttpd оставлю. Оно явно надёжнее выходит.

А вот в роли фронтенда nginx гибче.

Я сперва хотел оттестировать и nginx, и lighttpd, что в качестве фронтенда шустрее, то и повесить, но на сабжевой задаче для Лайти - обломался совершенно :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

на то он и лайти.. на самом деле, универсальной панацеи не существует и, как правило, приходится использовать комплексные решения. такие вот дела.. ;-)

MiracleMan ★★★★★
()
Ответ на: комментарий от KRoN73

а в чем проблема повесить виртуалхосты апача на другой порт (или просто лень перелопачивать конфиги)?

еще вариант в сервернейм nginxа запихнуть регекспы.

drull ★☆☆☆
()
Ответ на: комментарий от drull

>или просто лень перелопачивать конфиги

Угу. Хотя, наверное, так и придётся сделать. Это явно спокойнее для души, чем ковыряться с сетевым интерфейсом удалённой машины :)

>еще вариант в сервернейм nginxа запихнуть регекспы.


Апачу это не поможет.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Может, кому в копилочку массовая замена :)

grep -lre '<VirtualHost \*:80>' * | xargs -d'\n' sed -i "s/<VirtualHost \*:80>/<VirtualHost *:8184>/g"

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

ну так и надо было сразу сделать.

и проброс из nginx-а в апач сделан правильно, через ip-шник. а те хосты, где есть какой-то статический контент, прописать отдельно, с правилами.

вообще, кстати, есть такой блок как «upstream backend», что бы в блоках «server» ограничиваться «proxy_pass http://backend;». а настройки проброса можно вынести в блок «http», включая «proxy_set_header» и прочее.

P.S. бывает документация и похуже.

dmiceman ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.