Обратный прокси-сервер nginx, разгрузка ssl, кэширование и скорость страниц - все в одном.
В настоящее время мы размещаем все на серверах Windows IIS 7. Мы только что перешли на Azure, и, как и многие другие облака, хостинг Windows стоит дороже, чем хостинг Linux. Azure имеет свои собственные ограничения для виртуальных машин (по сравнению с AWS), поскольку вы действительно можете привязать только один публичный IP-адрес к веб-службе. Чтобы преодолеть это ограничение и создать некоторые функции восстановления после отказа и кэширования, мы рассматриваем NginX как балансировщик нагрузки, обратный прокси-сервер для размещения перед нашими IIS-серверами.
Недавно мы узнали, что Google-Pagspeed для Apache также доступен для NginX. Основываясь на интерактивных руководствах и нашем небольшом опыте, мы полагаем, что можем получить все преимущества NginX, используя 3 отдельных уровня серверов NginX (см. Ниже). Мой вопрос: как это можно сделать только на одном виртуальном хосте?
Вот пример того, что мы можем установить сейчас:
Nginx1 - этот сервер находится перед Nginx2 и выполняет разгрузку SSL и кэширует статический контент на сервере linux, на котором он работает. Это будет кешировать статические ресурсы как на диск, так и на оперативную память.
NginX2 - этот сервер NginX находится перед Nginx3 и включает в себя Google Mod PagesSpeed для NginX. Цель этого сервера - минимизировать и комбинировать скрипты и оптимизировать изображения. Поскольку эти операции могут быть дорогими, мы разместили NginX1 перед этим сервером.
NginX3 - (HA Proxy также будет работать, если мы застряли с 3 запущенными экземплярами NginX одновременно). Это последний сервер NginX, работающий на Linux. Его задача - просто выступать в качестве обратного прокси-сервера для нашей фермы IIS. Идея в том, что если мы запустим еще один сервер IIS (в настоящее время у нас есть только два), то мы просто добавим его в конфигурацию этого NginX, а Nginx выполнит балансировку нагрузки. Мы по-прежнему используем сессию Sticky (из-за некоторого неаккуратного кода asp / asp.net), но в аренду мы можем разделить рабочую нагрузку между различными виртуальными машинами и масштабировать их, добавляя машину в нашу "Ферму IIS" (не используя функцию фермы IIS).).
- 2X IIS-серверы - это просто iis-серверы (все одинаковые), на которых настроено несколько сайтов, и сайты загружаются на них через FTP или Git.
Вопросы:
- Сможем ли мы отказаться от трех отдельных конфигураций NginX (виртуальных хостов) и просто объединить все в одно? Если да, то любой пример того, как настроить NginX для этого в одной конфигурации, будет УДИВИТЕЛЬНЫМ!
- Как мы можем сохранить цели, указанные выше, и передать X, перенаправленный по ip-адресу, на внутренние машины iis?
- Какие будут предложения, если таковые имеются в качестве запасного варианта в случае сбоя нашего сервера NginX? С настройкой выше это наша единственная точка отказа. Решит ли проблема с отключением нашего сервера NginX наличие двух серверов Linux с описанной выше настройкой, с сочетанием аварийного переключения DNS или просто наличие двух DNS-записей?
- Насколько ресурсоемким является NginX? Можно ли предположить, что очень маленький "микро" экземпляр Azure с 768 МБ оперативной памяти может обрабатывать 50–100 одновременных посетителей?
Заранее спасибо!!!!!
Рекомендации:
NginX Pagespeed: http://ngxpagespeed.com/ngx_pagespeed_example/
Обратный прокси-сервер NginX: http://www.andrewparisio.com/2011/02/how-to-create-reverse-https-failover.html
1 ответ
- да, абсолютно возможно объединить эти серверы nginx в один. Просто используйте proxy_pass.
- Смотрите заголовок набора прокси в блоке http
- Двойные машины NGINX (одинаковые конфигурации) в сочетании с циклическим перебором DNS (или поставить что-то вроде балансировщика нагрузки AWS впереди, не знаю, есть ли у вас что-то подобное в Azure)
- По крайней мере. Вы должны думать о тысячах соединений с NGINX. Ваш IIS, вероятно, будет узким местом. (Я не принимаю во внимание дополнительную нагрузку, которую обработка PageSeded окажет на эту настройку, вам придется попробовать и выяснить)
Сначала в вашем блоке http поставьте:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
upstream pagespeed {
server 127.0.0.1:8081; # weight=10 max_fails=3 fail_timeout=30s;
}
upstream iis {
server 192.168.0.100:80; weight=10 max_fails=3 fail_timeout=10s;
server 192.168.0.101:80; weight=10 max_fails=3 fail_timeout=10s;
}
Тогда вам понадобятся только следующие блоки сервера (урезанные)
server {
listen 443; #SSL offloader
server_name example.com;
#do some ssl things here
location / {
proxy_pass http://pagespeed; #proxy to pagespeed on same nginx
}
}
server {
listen 8081;
server_name example.com;
#do some pagespeed things here
#pagespeed on
location / {
proxy_pass http://iis; # proxy to 2 backend IIS servers
}
}
Используйте сокет unix в исходной конфигурации для еще большей производительности. Также вы можете поместить кэш скорости страницы в Memcached.