Как русский (nginx) помог индейцу (Apache)

В последнее время я не занимаюсь активным программированием, однако поддерживать свой сервер и размещенные на нем сайты приходится. Уже с 2003-го года мы с друзьями держим выделенный, арендованный сервер в Америке, на котором размещен Сервер христианского общения JesusChrist.ru, Молитва.ру, а также другие сайты, включая этот блог timh.ru. Посещаемость на одном только JesusChrist.ru за последние годы выросла с 2000 человек в день в 2005-м году до 6000 человек в день в 2009-м году. Такое количество людей пока не создает нам проблем. Но вот поисковые роботы при каждом посещении нашего сервера создают огромную нагрузку. Бывает, что 200 роботов с Yahoo работают одновременно, забивая память сервера так, что обычные посетители уже не могут открыть ни одной странички. Получается своего рода DoS-атака, санкционированная поисковиком и вызванная тем, что у нас много страниц на сервере.

Мы уже думали купить дополнительно оперативной памяти, но это стоит дорого, а на улице кризис. Поэтому решили пойти другим путем. Главным потребителем памяти на любом веб-сервере, конечно, является сам веб-сервер (тавтология получается какая-то), а у нас используется Apache. После некоторых исследований я решил попробовать nginx. И вот что получилось…

Сначала несколько слов о nginx. Этот софт для обслуживания веб-серверов написан российским программистом Игорем Сысоевым, когда он работал в компании Рамблер (работает ли он сейчас там, я не знаю). Nginx написан специально для часто посещаемых, популярных сайтов (а Рамблер один из таковых, хотя я предпочитаю ему Яндекс). Это очень легковесный софт, главная задача которого – получить данные из внутреннего, более тяжелого сервера, и быстро отдать клиенту. В моем случае тяжелый сервер это многофункциональный Apache.

В обычной схеме работы любой посетитель сайта провоцирует запуск отдельной копии Апача, который создает страницу и отдает посетителю, а затем ждет закрытия соединения, даже если посетитель больше ничего не запросит с сайта (таких посетителей, обычно пришедших с поисковых машин, пока что большинство). А висячий в памяти процесс Apache это дополнительные расходы. Если 200 роботов с Yahoo зайдут одновременно, то вся память расходуется сразу. 200 х 16 Мбайт это уже будет почти 3.2 Гбайта, а у нас только 2 Гбайта на сервере. Сервер начинает часто использовать файл подкачки и долго не может выйти из такого перегруженного состояния.

Nginx же получает данные от Apache сам, упаковывает их и быстро отдает клиенту. Apache может никого не ждать, или даже если он будет ждать, то новая копия процесса не нужна для обслуживания другого клиента (теперь уже клиента nginx). Насколько я понял, nginx сам оптимальным образом распоряжается соединениями и запущенными им копиями Apache. Так, нагрузка на сервере становится приемлемой практически в любое время суток.

Как же быстро перейти с Apache на nginx? В Интернете есть много рецептов, одни простые, другие сложные, с использованием всех возможностей nginx. Но лучше попробовать сначала следующий простой вариант.

Во-первых, ничего не меняйте в настройках Апача, кроме номера порта. Поменяйте везде в httpd.conf (и других файлах, если есть) номер порта с 80 на 8080 (и с 443 на 8443, если вы используете SSL). То есть запись “Listen 132.233.134.235:80″ превратится везде в “Listen 132.233.134.235:8080″, “NameVirtualHost 80″ в “NameVirtualHost 8080″, а “” в “”.

Во-вторых, настраиваем nginx как прозрачный прокси. В nginx.conf надо закомментировать настройки по умолчанию, приведенные разработчиками в качестве примера, и сделать свои:

server {
listen 132.233.134.235:80;
# после слова alias можно указать ВСЕ домены
# если они все указывают на один IP
server_name localhost alias vash-domen.ru www.vash-domen.ru
vash-domen2.ru www.vash-domen2.ru
vash-domen3.ru www.vash-domen3.ru
;
location / {
proxy_pass 132.233.134.235:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

После этого перезапускаете Apache, который теперь слушает запросы на порте 8080, и запускаете nginx, который встает на порт 80, и все дела! Вот таким образом русский nginx помог индейцу Apache на нашем сервере.

P.S.: Конечно, можно было бы подробнее рассказать об установке самого nginx, но ставится он легко, прямо из исходников. Читайте документацию на nginx.net, а также хорошую статью в Википедии.

Наша работа

Создать сайт

С нами сайтов: 13
Демонстрационный вход:
адрес http://demo.mpak.su
логин demo пароль demo.
Исходный код: ftp://mpak.su

Вход на сайт

Логин:
Пароль:
 Регистрация
Восстановление |

Последние статьи

© 2007—2010 «жираф»