Re: каскад проксирующих серверов
Anatoly Mikhailov
anatoly at sonru.com
Thu Mar 7 14:54:56 UTC 2013
On Mar 7, 2013, at 2:15 PM, Валентин Бартенев <vbart at nginx.com> wrote:
> On Thursday 07 March 2013 16:26:03 Anatoly Mikhailov wrote:
>> On Mar 7, 2013, at 11:41 AM, Валентин Бартенев <vbart at nginx.com> wrote:
>>> On Thursday 07 March 2013 15:03:59 Anatoly Mikhailov wrote:
>>>> On Mar 7, 2013, at 9:54 AM, Валентин Бартенев <vbart at nginx.com> wrote:
>>>>> On Wednesday 06 March 2013 23:35:04 Anatoly Mikhailov wrote:
>>>>>> добрый день,
>>>>>>
>>>>>> Вопрос балансировки нагрузки не дает мне покоя несколько дней, пока
>>>>>> склоняюсь к использованию Nginx в роли балансировщика. Таким образом
>>>>>> будет каскад Nginx - (Nginx - Unicorn) x 5.
>>>>>>
>>>>>> У нас связка Nginx+Unicorn на нескольких независимых серверах разного
>>>>>> назначения (Main, Admin, API, Mobile-API), но сейчас, ввиду растущей
>>>>>> нагрузки, есть необходимость основное (Main) приложение поставить за
>>>>>> балансировщиком (условно Nginx-А), получив 5 бэк-энд серверов (условно
>>>>>> Nginx-B), которые и будут непосредственно проксировать на Unicorn.
>>>>>
>>>>> [...]
>>>>>
>>>>> А в чем необходимость Nginx-B стоять перед Unicorn-ом?
>>>>> Почему бы не проксировать с Nginx-A на Unicorn напрямую?
>>>>
>>>> Ребята из Github не советуют так делать:
>>>> http://stackoverflow.com/questions/14082243/unicorn-multiple-machines-se
>>>> tu p А если серьезно, то как в этом случае отдавать статику, если она не
>>>> на CDN?
>>>
>>> Дополнительный промежуточный nginx тоже добавляет оверхэда, и тут вопрос
>>> скорее в том, какой из них больше (от установки соединения между
>>> nginx-ом и unicorn по сети, или от дополнительного nginx-а с keepalive).
>>
>> оверхэд будет в любом случае, поэтому и нужна ваша помощь, как все
>> правильно сделать
>>
>>> А в чём проблема отдавать статику? Мне казалось, что создание помойки из
>>> кода и статики - это исключительно черта php-программистов, и у рубистов
>>> должно быть с этим всё в порядке, в том смысле, что отличить запрос к
>>> статике можно ещё на балансировщике без stat() (и проксировать далее,
>>> либо на nginx, либо на unicorn).
>>
>> помойки из кода и статики никакой нет, вся статика лежит отдельно как у
>> всех рубистов :) вопрос в том, как правильно ее отдавать - через 2 nginx-а
>> или деплоить статику на балансировщик?
>>
>
> У каждого решения есть свои плюсы и минусы, нужно смотреть конкретно в вашем
> случае, что будет удобнее. И вообще, что является узким местом на текущий
> момент. Возможно даже нужно пробовать и смотреть.
>
> Я бы стремился сократить количество звеньев в системе с одной стороны, и
> уменьшить количество единых точек отказа - с другой, децентрализовать.
>
да, абсолютно согласен, уменьшить SPoF - это, пожалуй, главная моя задача,
даже если это будет менее эффективно с точки зрения производительности.
Идея с каскадными Nginx-ами мне нравится потому что:
- Nginx-A делает только проксирование всех запросов на массив серверов из Nginx-B
- Nginx-A осуществляется SSL-offload
- при обновлении SSL-xсертификата надо будет обновить его только на Nginx-A
- массив Nginx-B - самостоятельные сервера, на каждом из них точная копия кода и статики
- имея 2 Nginx-A можно сделать перекрестную балансировку из 4-серверов, получаем 0 SPoF
в данной случае с приложением (балансировку базы я не затрагиваю, это отдельный вопрос)
Есть ли какие-то особенности в настройках keepalive на upstream, proxy_pass и на самих серверах?
В среднем между запросами одного клиента проходит 1-20 секунд. Что думаете о такой конфигурации:
[Nginx-A]
http {
ssl …
# no gzip settings
keepalive_timeout 70;
upstream backend {
server 10.0.0.1:8080; # Nginx-B
server 10.0.0.2:8080; # Nginx-B
keepalive 70;
}
server {
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
[Nginx-B]
http {
gzip …
# no ssl settings
keepalive_timeout 70;
upstream unicorn {
server unix:/tmp/unicorn.production.main.sock fail_timeout=0;
# no timeout here, because Unicorn is stateless itself
}
server {
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
# settings to serve static assets
}
}
}
Анатолий
> --
> Валентин Бартенев
> http://nginx.org/en/donation.html
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
Подробная информация о списке рассылки nginx-ru