Відмінності між версіями «Nginx-as-reverse-proxy»

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку
 
(Не показано 16 проміжних версій цього користувача)
Рядок 1: Рядок 1:
−
== Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах ==
+
== Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах ==
  
−
Две недели назад мы запустили новую версию одного из наших оcновных веб-проектов и начали массивную рекламную поддержку этого сайта. В результате рекламы, исходящий трафик только с одного сервера достиг 200-250Mbit/s! В данной статье я опишу, как построить стабильный и эффективный веб-сайт с двухуровневой архитектурой обработки запросов (с двумя веб-серверами: frontend и backend) или как модифицировать ваш текущий сервер, чтобы получить дополнительные ресурсы для обработки большего количества запросов.
+
[ http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/lang/ru/ | Оргигинал ]
  
−
Для начала, опишу типичный процесс обслуживания запроса к веб-серверу и структуру самого сервера:
+
Две недели назад мы запустили новую версию одного из наших оcновных веб-проектов и начали массивную рекламную поддержку этого сайта. В результате рекламы, исходящий трафик только с одного сервера достиг 200-250Mbit/s! В данной статье я опишу, как построить стабильный и эффективный веб-сайт с двухуровневой архитектурой обработки запросов (с двумя веб-серверами: frontend и backend) или как модифицировать ваш текущий сервер, чтобы получить дополнительные ресурсы для обработки большего количества запросов.
 +
 
 +
Для начала, опишу типичный процесс обслуживания запроса к веб-серверу и структуру самого сервера:  
  
 
   1. Клиент инициирует запрос к серверу.
 
   1. Клиент инициирует запрос к серверу.
Рядок 12: Рядок 14:
 
   6. Браузер клиента получает ответ, закрывает соединение с сервером и отображает “ответ”.
 
   6. Браузер клиента получает ответ, закрывает соединение с сервером и отображает “ответ”.
  
−
Как видите, если к серверу приходит очень много запросов, он должен создавать много параллельных потоков/процессов и держать их в памяти, пока клиент не закроет соединение. Если соединение у клиента не быстрое, то серверные процессы будут висеть в памяти достаточно долго и используемые ими ресурсы будут увеличиваться очень быстро.
+
Как видите, если к серверу приходит очень много запросов, он должен создавать много параллельных потоков/процессов и держать их в памяти, пока клиент не закроет соединение. Если соединение у клиента не быстрое, то серверные процессы будут висеть в памяти достаточно долго и используемые ими ресурсы будут увеличиваться очень быстро.  
  
−
Как же решить данную проблему? Простым решением может быть бесконечное увеличение объемов оперативной памяти на сервере и покупка дополнительных или более мощных процессоров в ожидании момента, когда сервер умрет под нагрузкой… Но существует более эффективное решение! Вы можете просто поместить небольшую программку (nginx, например) перед Вашим большим веб-сервером и дать ей возможность обслуживать запросы к статическим файлам, а запросы к динамике проксировать к главному серверу. При таком решении Ваш большой сервер не будет создавать дополнительных процессов для обработки статических страниц и файлов и будет отдавать результаты обработки динамических запросов маленькому frontend-серверу очень быстро, что позволит ему освободить ресурсы для использования в обработке других запросов. Маленький frontend же может ждать сколь угодно долго, пока клиент заберет свой “ответ” и закроет соединение, а backend не будет тратить ресурсы для этого!
+
Как же решить данную проблему? Простым решением может быть бесконечное увеличение объемов оперативной памяти на сервере и покупка дополнительных или более мощных процессоров в ожидании момента, когда сервер умрет под нагрузкой… Но существует более эффективное решение! Вы можете просто поместить небольшую программку (nginx, например) перед Вашим большим веб-сервером и дать ей возможность обслуживать запросы к статическим файлам, а запросы к динамике проксировать к главному серверу. При таком решении Ваш большой сервер не будет создавать дополнительных процессов для обработки статических страниц и файлов и будет отдавать результаты обработки динамических запросов маленькому frontend-серверу очень быстро, что позволит ему освободить ресурсы для использования в обработке других запросов. Маленький frontend же может ждать сколь угодно долго, пока клиент заберет свой “ответ” и закроет соединение, а backend не будет тратить ресурсы для этого!  
  
−
Вот примерная диаграма предложенной конфигурации веб-сервера:
+
Вот примерная диаграма предложенной конфигурации веб-сервера:  
  
−
[[Зображення:general_c.png]]
+
[[Image:general c.png]]  
  
−
В дополнение к описанному, Вы получите еще очень удобную возможность так называемых контролируемых закачек, которая будет описана ниже.
+
В дополнение к описанному, Вы получите еще очень удобную возможность так называемых контролируемых закачек, которая будет описана ниже.  
  
−
Если Ваш сервер содержит какие-то статические ресурсы, которые можно скачивать только определенной части аудитории сайта (контент-провайдеры могут предоставлять возможность скачивания mp3-файлов только пользователям с положительным балансом; некоторые сайты дают скачивать файлы только зарегистрированным пользователям и т.п.), в типичном случае вам необходимо создать некий скрипт для обработки запросов на скачивание и создать набор жутких ссылок вида http://some.service.com/down.php?file=xxx.mp3… В дополнение к этому Ваши пользователи не будут иметь возможность докачки (исключая те случаи, когда Ваш скрипт настолько сложен, что понимает заголовок Ranges в HTTP-запросах)…
+
<br> Если Ваш сервер содержит какие-то статические ресурсы, которые можно скачивать только определенной части аудитории сайта (контент-провайдеры могут предоставлять возможность скачивания mp3-файлов только пользователям с положительным балансом; некоторые сайты дают скачивать файлы только зарегистрированным пользователям и т.п.), в типичном случае вам необходимо создать некий скрипт для обработки запросов на скачивание и создать набор жутких ссылок вида http://some.service.com/down.php?file=xxx.mp3… В дополнение к этому Ваши пользователи не будут иметь возможность докачки (исключая те случаи, когда Ваш скрипт настолько сложен, что понимает заголовок Ranges в HTTP-запросах)…  
  
−
В конфигурации с использованием nginx как frontend-сервера, Вы имеете возможность создать простое правило для переписывания ссылок в запросах так, чтобы все красивые ссылки типа http://your.cool-service.com/files/cool.mp3 автоматически направлялись на некоторый скрипт /down.php и, если он вернет заголовок X-Accel-Redirect, файл автоматически отдавался клиенту с поддержкой Ranges и всех остальных прелестей раздачи статического контента с frontend-сервера. Backend-сервер в это время сможет обрабатывать другие запросы. Ваши пользователи могут даже не знать о том, что их закачки контролируются Вами. Примерная диаграмма описанного алгоритма приведена ниже:
+
В конфигурации с использованием nginx как frontend-сервера, Вы имеете возможность создать простое правило для переписывания ссылок в запросах так, чтобы все красивые ссылки типа http://your.cool-service.com/files/cool.mp3 автоматически направлялись на некоторый скрипт /down.php и, если он вернет заголовок X-Accel-Redirect, файл автоматически отдавался клиенту с поддержкой Ranges и всех остальных прелестей раздачи статического контента с frontend-сервера. Backend-сервер в это время сможет обрабатывать другие запросы. Ваши пользователи могут даже не знать о том, что их закачки контролируются Вами. Примерная диаграмма описанного алгоритма приведена ниже:  
  
−
[[Зображення:algorithm_c.png]]
+
[[Image:algorithm c.jpg]]  
  
−
Позвольте обратить Ваше внимание на важный факт: Если Вам нужно только увеличение производительности работы сайта с помощью описанной здесь техники, и вы не хотите использовать систему контроля за скачиванием, то '''Вам не нужно ничено менять в скриптах на Вашем сервере!''' Они будут работать так же, как и раньше!
+
<br> Позвольте обратить Ваше внимание на важный факт: Если Вам нужно только увеличение производительности работы сайта с помощью описанной здесь техники, и вы не хотите использовать систему контроля за скачиванием, то '''Вам не нужно ничено менять в скриптах на Вашем сервере!''' Они будут работать так же, как и раньше!  
  
−
Итак, последнее, чем я могу помочь Вам в тяжелом труде оптимизации использования ресурсов Вашего сервера, - это пример конфигурации для nginx, которая может быть использована Вами в качестве базовой при конфигурации Вашего сервера:
+
Итак, последнее, чем я могу помочь Вам в тяжелом труде оптимизации использования ресурсов Вашего сервера, - это пример конфигурации для nginx, которая может быть использована Вами в качестве базовой при конфигурации Вашего сервера:  
  
 +
<br>
  
 
  server {
 
  server {
Рядок 68: Рядок 71:
 
     }
 
     }
  
−
Полная версия конфигурационного файла лежит [http://blog.kovyrin.net/files/nginx-conf/rproxy-boost.nginx.conf | здесь].
+
Полная версия конфигурационного файла лежит [http://wiki.energy-service.com.ua/wiki//src/rproxy-boost.nginx.conf | здесь] или [http://blog.kovyrin.net/files/nginx-conf/rproxy-boost.nginx.conf | здесь].  
  
−
Замечание: Если скрипты на Вашем backend-сервере используют IP-адреса клиентов в каких-то целях, то Вам необходимо установить на сервер модуль mod_rpaf module, чтобы он использовал передаваемый nginx заголовок X-Real-IP в качестве основного адреса пользователя.
+
Замечание: Если скрипты на Вашем backend-сервере используют IP-адреса клиентов в каких-то целях, то Вам необходимо установить на сервер модуль mod_rpaf module, чтобы он использовал передаваемый nginx заголовок X-Real-IP в качестве основного адреса пользователя.  
  
−
Вот и все! Теперь Вы можете установить себе на сервер nginx, отконфигурировать его и получить возможность обслуживать большее количество клиентов при использовании меньшего количества ресурсов! Все будет работать абсолютно прозрачно для уже написанных скриптов и, если хотите, Вы сможете организивать контролируемое скачивание при помощи метода, который я опишу в одном из следующих постов.
+
Вот и все! Теперь Вы можете установить себе на сервер nginx, отконфигурировать его и получить возможность обслуживать большее количество клиентов при использовании меньшего количества ресурсов! Все будет работать абсолютно прозрачно для уже написанных скриптов и, если хотите, Вы сможете организивать контролируемое скачивание при помощи метода, который я опишу в одном из следующих постов.  
  
 
Если у Вас есть какие-либо вопросы, задавайте их в комментариях не откладывая - я попробую ответить на них. Если эта статья понравилась Вам, можете обратить внимание на рекламные объявления на этой стратице или просто проголосуйте за нее на Digg.com.
 
Если у Вас есть какие-либо вопросы, задавайте их в комментариях не откладывая - я попробую ответить на них. Если эта статья понравилась Вам, можете обратить внимание на рекламные объявления на этой стратице или просто проголосуйте за нее на Digg.com.

Поточна версія на 08:34, 8 квітня 2009

Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах

[ http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/lang/ru/ | Оргигинал ]

Две недели назад мы запустили новую версию одного из наших оcновных веб-проектов и начали массивную рекламную поддержку этого сайта. В результате рекламы, исходящий трафик только с одного сервера достиг 200-250Mbit/s! В данной статье я опишу, как построить стабильный и эффективный веб-сайт с двухуровневой архитектурой обработки запросов (с двумя веб-серверами: frontend и backend) или как модифицировать ваш текущий сервер, чтобы получить дополнительные ресурсы для обработки большего количества запросов.

Для начала, опишу типичный процесс обслуживания запроса к веб-серверу и структуру самого сервера:

  1. Клиент инициирует запрос к серверу.
  2. Его браузер устанавливает соединение с сервером.
  3. Ваш сервер (например, Apache) создает новый поток/процесс для обработки запроса.
  4. Если клиент запросил динамический контент (например, отправил запрос к php-скрипту), веб-сервер создает отдельный CGI-процесс или запускает модуль обработки скриптов (например, mod_php) и ждет, пока запрос будет обработан. Как только он получает результирующую web-страницу, то она отправляется клиенту.
  5. Если же клиент запросил статический файл, то сервер просто отправляет этот файл клиенту.
  6. Браузер клиента получает ответ, закрывает соединение с сервером и отображает “ответ”.

Как видите, если к серверу приходит очень много запросов, он должен создавать много параллельных потоков/процессов и держать их в памяти, пока клиент не закроет соединение. Если соединение у клиента не быстрое, то серверные процессы будут висеть в памяти достаточно долго и используемые ими ресурсы будут увеличиваться очень быстро.

Как же решить данную проблему? Простым решением может быть бесконечное увеличение объемов оперативной памяти на сервере и покупка дополнительных или более мощных процессоров в ожидании момента, когда сервер умрет под нагрузкой… Но существует более эффективное решение! Вы можете просто поместить небольшую программку (nginx, например) перед Вашим большим веб-сервером и дать ей возможность обслуживать запросы к статическим файлам, а запросы к динамике проксировать к главному серверу. При таком решении Ваш большой сервер не будет создавать дополнительных процессов для обработки статических страниц и файлов и будет отдавать результаты обработки динамических запросов маленькому frontend-серверу очень быстро, что позволит ему освободить ресурсы для использования в обработке других запросов. Маленький frontend же может ждать сколь угодно долго, пока клиент заберет свой “ответ” и закроет соединение, а backend не будет тратить ресурсы для этого!

Вот примерная диаграма предложенной конфигурации веб-сервера:

General c.png

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


Если Ваш сервер содержит какие-то статические ресурсы, которые можно скачивать только определенной части аудитории сайта (контент-провайдеры могут предоставлять возможность скачивания mp3-файлов только пользователям с положительным балансом; некоторые сайты дают скачивать файлы только зарегистрированным пользователям и т.п.), в типичном случае вам необходимо создать некий скрипт для обработки запросов на скачивание и создать набор жутких ссылок вида http://some.service.com/down.php?file=xxx.mp3… В дополнение к этому Ваши пользователи не будут иметь возможность докачки (исключая те случаи, когда Ваш скрипт настолько сложен, что понимает заголовок Ranges в HTTP-запросах)…

В конфигурации с использованием nginx как frontend-сервера, Вы имеете возможность создать простое правило для переписывания ссылок в запросах так, чтобы все красивые ссылки типа http://your.cool-service.com/files/cool.mp3 автоматически направлялись на некоторый скрипт /down.php и, если он вернет заголовок X-Accel-Redirect, файл автоматически отдавался клиенту с поддержкой Ranges и всех остальных прелестей раздачи статического контента с frontend-сервера. Backend-сервер в это время сможет обрабатывать другие запросы. Ваши пользователи могут даже не знать о том, что их закачки контролируются Вами. Примерная диаграмма описанного алгоритма приведена ниже:

Algorithm c.jpg


Позвольте обратить Ваше внимание на важный факт: Если Вам нужно только увеличение производительности работы сайта с помощью описанной здесь техники, и вы не хотите использовать систему контроля за скачиванием, то Вам не нужно ничено менять в скриптах на Вашем сервере! Они будут работать так же, как и раньше!

Итак, последнее, чем я могу помочь Вам в тяжелом труде оптимизации использования ресурсов Вашего сервера, - это пример конфигурации для nginx, которая может быть использована Вами в качестве базовой при конфигурации Вашего сервера:


server {
       listen       80;
       server_name  some-server.com www.server-name.com;

       access_log  logs/host.access.log  main;

       # Main location
       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 64k;
       }

       # Static files location
       location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
           root   /spool/www/members_ng;
       }

   }

Полная версия конфигурационного файла лежит | здесь или | здесь.

Замечание: Если скрипты на Вашем backend-сервере используют IP-адреса клиентов в каких-то целях, то Вам необходимо установить на сервер модуль mod_rpaf module, чтобы он использовал передаваемый nginx заголовок X-Real-IP в качестве основного адреса пользователя.

Вот и все! Теперь Вы можете установить себе на сервер nginx, отконфигурировать его и получить возможность обслуживать большее количество клиентов при использовании меньшего количества ресурсов! Все будет работать абсолютно прозрачно для уже написанных скриптов и, если хотите, Вы сможете организивать контролируемое скачивание при помощи метода, который я опишу в одном из следующих постов.

Если у Вас есть какие-либо вопросы, задавайте их в комментариях не откладывая - я попробую ответить на них. Если эта статья понравилась Вам, можете обратить внимание на рекламные объявления на этой стратице или просто проголосуйте за нее на Digg.com.