Повышение производительности веб-сервера с помощью nginx

()

Самым популярным веб-сервером сейчас является веб-сервер Apache, на котором работает большинство хостиногвых серверов. Однако несмотря на огромное количество преимуществ он имеет и ряд недостатков.

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

Далее будет показано как разгрузить хостинговый сервер под управлением Debian Lenny, с работающим на нём apache2 с помощью nginx.

Начальные условия:

  • ОС: Debian Lenny.
  • Установленный и настроенный apache2

Если всё делать правильно, то время простоя не превысит пяти минут. Всё описанное далее проделано автором лично и проблем не возникло.

Для начала "перевесим" apache на localhost на порт 8080. Для этого нужно поправить строку Listen в файле /etc/apache2/ports.conf:

#Listen 80
Listen 127.0.0.1:8080

И перезапустить apache:

invoke-rc.d apache2 restart

Далее устанавливаем nginx:

apt-get install nginx

И создаём файл /etc/nginx/conf.d/proxy.conf, следующего содержания:

proxy_cache_path   /usr/home/nginx/proxy_cache  levels=1:2   keys_zone=one:30m max_size=1g;
server {
    server_name     _;
    server_name_in_redirect  off;
    location / {
         proxy_pass         http://127.0.0.1:8080/;
         proxy_redirect     off;
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
         client_max_body_size       10m;
         client_body_buffer_size    128k;
         proxy_connect_timeout      90;
         proxy_send_timeout         90;
         proxy_read_timeout         90;
         proxy_buffer_size          4k;
         proxy_buffers              4 32k;
         proxy_busy_buffers_size    64k;
         proxy_temp_file_write_size 10m;
     }
     # Запросы к статике
     location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
         # Принудительно указываем заголовок Expire
         expires            30d;
         # Запросы по прежнему пересылаем к apache
         proxy_pass         http://127.0.0.1:8080/;
         # Однако здесь мы их кэшируем на один час
         # Это позволяет немного разгрузить apache
         proxy_cache_valid  60m;
         proxy_redirect     off;
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
         proxy_cache_key    $scheme$proxy_host$request_uri$host;
         proxy_cache one;
     }
}

И перезапускаем nginx:

invoke-rc.d nginx restart

На этом почти всё, кроме одной неприятной мелочи: в логи apache теперь вместо реальных IP-адресов падает всегда один и тот же адрес - 127.0.0.1. Однако эта проблема решается легко и непринуждённо установкой модуля rpaf, который будет складывать в лог IP-адреса, переданные через заголовки X-*.

Установим модуль:

apt-get install libapache2-mod-rpaf

Включаем модуль:

a2enmod rpaf

И перезапускаем apache:

invoke-rc.d apache2 restart

Конфигурация модуля находится в файле /etc/apache2/mods-available/rpaf.conf, однако в данном случае её можно оставить по умолчанию.

На этом действительно всё. Приятной работы!

Ключевые слова: debian, apache, apache2, nginx, mod_rpaf, rpaf.

Комментарии:

Igron 2009-07-08 14:58:27 (#)

> Для начала установим "перевесим" apache на localhost
> на порт 8080.

Ну, во-первых, опечатка, а во-вторых, не лучше ли для этого использовать xinetd?

MooSE 2009-07-08 17:49:04 (#)

Цитата:

Ну, во-первых, опечатка, а во-вторых, не лучше ли для этого использовать xinetd?


Опечатку поправил.

Не. Не проще. Оно на каждый запрос порождает процесс. А память не резиновая.

Вообще всё это написано под влиянием выхода qmmp-0.3, когда этот сервер (VPS от Агавы - 500MHz/256MB) реально стал захлёбываться от нагрузки.

Anonymous 2009-07-10 14:52:32 (#)

а разве не надо в конфиге /etc/apache2/mods-available/rpaf.conf добавлять все локальные ip адреса машины?
RPAFproxy_ips 127.0.0.1 ...
P.S. rpaf всегда собирал руками - как то не судьба было в репозитарий глянуть :/

MooSE 2009-07-11 01:43:53 (#)

Цитата:

а разве не надо в конфиге /etc/apache2/mods-available/rpaf.conf добавлять все локальные ip адреса машины?


У меня всё взлетело и так:)

На самом деле просто тут умолчальный конфиг более чем подошёл:

# cat /etc/apache2/mods-enabled/rpaf.conf 
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
</IfModule>


Собственно в нём уже всё и указано:)

Anonymous 2009-12-29 01:56:30 (#)

Привет и спс за статью, есть маленький вопросик, у меня несколько виртуальных хостов на апаче, в nginx не надо настраивать ничего?!

MooSE 2009-12-29 09:19:07 (#)

По идее нет. Если только у тебя на сервере несколько IP-адресов и ты используешь не Name-based а IP-based виртуальные хосты.
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE