DISQUS

DISQUS Hello! Homo-Adminus Blog is using DISQUS, a powerful comment system, to manage its comments. Learn more.

Community Page

Jump to original thread »
Author

Using Nginx As Reverse-Proxy Server On High-Loaded Sites

Started by Scoundrel · 9 months ago

Two weeks ago we have started new version of one of our primary web projects and have started very massive advertisement campaign to promote this web site. As the result of that advertisements, our outgoing traffic has been increased to 200-250Mbit/s from only one server! In this article I wil ... Continue reading »

47 comments

  • Just for testing
  • cool! it works
  • cool i love alex
  • А как избавиться после ридеректа на apache от нолмера порта в урле? В моём случае http://greg.dobroe.net:8080/pma/
  • 2greg: Использовать директиву proxy_redirect.
  • Подскажите пожалуйста, как сделать так, чтобы из определённой папки nginx отдавал файлы "как есть" - картинки - картинками, скрипты - файлами (download), не переадресовывая запрос. Т.е. цель - запрет исполнения всего в папке, но возможность скачивания без ошибок. Переопределение типа на application/octet-stream для этой папки результата не даёт :(
  • 2Thegirl: И оно действительно отдает application/octet-stream? Проверьте через curl/GET/wget...
  • Алексей, добрый день.
    Возникла ситуация:
    есть один тяжёлый проект
    бежит это на nginx
    добавили несколько дополнительных серверов с FastCGI
    происходит потеря сессий :( как с этим бороться?
    Заранее благодарен за ответ.
  • Что вы имеете ввиду под "потеря сессий"? Если то, что пхп-шные сессии перестали работать, так это логично - они ведь в файлах во дефолту хранятся. Решений я знаю как минимум 2:

    1) хранение сессий на nfs-share
    2) хранение сессий в базе данных
  • A quick config question...

    I'm reverse proxying to an Apache server...when I run a script that takes a lil' while to produce some input (e.g. an Amazon product fetching script) nginx will sometimes not present the output, even though the Apache script is still churning away in the background. What timeout setting do I need to adjust in this situation?
  • Очень познавательно, теперь я знаю, что такое nginx.
  • Спасибо Алекс, очень полезная статья.
    Расскажите плз чем вы такие красивые блок схемы строите?
  • Ребят, помогите, пожалуйста! никак не могу "подружить" nginx с апачем :(

    у нас на сервере крутятся два сайта.
    скажем, q5Video.ru и q5Magazine.ru

    в конфиге nginx я прописываю код:

    server {
    listen 81.17х.х.хх:80;
    server_name q5Magazine.ru www.q5Magazine.ru;

    #charset koi8-r;

    #access_log logs/host.access.log main;

    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 ~* ^.+.(midi|wav|flv|bmp|rtf|js)$ {
    root /spool/www/members_ng;
    }

    и в кофиге апача прописываю

    listen 127.0.0.1:8080

    что здесь неправильно?
  • I wonder if it makes sense to use nginx as a server for static files _behind_ an existing Apache frontend. If have an Apache configuration with several virtual hosts and set it up to proxy requests for static files to nginx, but from what I read on the web everyone else does it the other way around.

    Would my setup be less effective under heavy load conditions?
  • 2rubyrobot: Your configuration would not help to handle higher loads... Idea of nginx-before-apache scheme is in following: nginx would handle lots of traffix and apache would not even know about this traffic.
  • scoundrel: I am not sure if that's the right thing for me. More then 90% of requests are dynamic on my server. There's only a few requests to large static files, about 200MB in size. If I put nginx in front, it produces a lot of unnecessary overhead, because 90% of requests go straight through the nginx proxy.

    I am under the impression that a time consuming 200MB request proxied through Apache to nginx will not keep one of Apache's large child processes busy that could be better used to process dynamic content. While nginx serves the static file, Apache is free to handle it's dynamic files. Please correct me if I'm wrong!
  • I use nginx as a proxy server for Apache Tomcat,and found that the performance is slow down to half of only running Tomcat,So I dont know why was that ?
    The configuration like:
    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;
    }
    who can help me this
  • Спасибо за статью! Жаль только ни слова не было сказано насчет апача, достаточно ли его только перевесить на другой порт (Listen :8080), и что-то еще нужно поправить?
    А в конфиге nginx есть возможность построить условия (анализ HTTP-заголовков), на которых уже решать, что сделать с запросом, проксировать его апачу, или выдать 403?
  • Статья отличная, но у меня не получается сделать так чтобы картинки отдавались в многопоточном режиме клиенту, т.е. они грузятся на странице по одной, я видел много ресурсов где явно видно что картинки отдаются по несколько сразу и отдаются они нгинксом, или такое только средствами nginx не реализовать.
  • how to config the simple balancer
    use nginx as frontend
    use two tomcats as backend web servers
    location /


    proxy_pass

    http://127.0.0.1:8080/;
    http://127.0.0.1:9000/;

    listen 80
  • К сожалению данная схема не работает если на серваке крутятся виртуальные хосты, которые "сидят" на одном айпишнике. ((
    Как быть в этой ситуации ?
    Спасибо !
  • Запустил вчера сервер с Вашим конфигом и сервак "умер". Точнее начались такие тормоза что работать было просто невозможно.
    У меня на серваке 8 виртуальных хостов, с которых раздаётся контент(музыка, кино и т.д.) Хотел при помощи нгинкс разгрузить апач, который временами виснет из-за огромного (около 2000) количества процессов. Перевесил каждый виртуальный хост на 127.0.0.1 на разные порты. Настроил нгинкс по Вашему примеру.
    После запуска смог зайти более менее быстро только на один сайт. Побродить по нему и тем более что-то качнуть не удалось.((
    Помогите разобраться в чём причина таких тормозов и как ускорить систему.
    Система
    Intel(R) Pentium(R) 4 CPU 2.40GHz
    Память - 2 Гб
    Ось -Fedora Core 5 - 2.6.20-1.2320.fc5
    Apache - 2.2.2
    Nginx - 0.5.26
    Конфиг полностью совпадает с Вашим, за исключением папки root, конечно )
    Жду ответа...
  • I've used tux on RH before to serve static content the same way(before apache), does any one know how much tux is faster/slower than nginx?
  • Hi!
    Is't possible to configure it to use DNS resolution for the backend servers?
    I would like to have Nginx to relay http/https for many services on different servers in the backend, but not having to add seperate sections for each server/service.
    Or will I lose something by doing that "if possible"?
  • Is there any specific reason for using Apache as the behind server?

    Why wouldn't you have Nginx as the front and the backend server?

    Is there any disadvantage to using Nginx for the dynamic content as well?
  • 2 Egenius:
    у меня крутится около полутора десятков виртуальных хостов через nginx и apache.
    Nginx сидит на 80-м порту, apache - на 8080. Никаких проблем, всё отлично.

    Очень большие тормоза были при первом заходе на сайт (после установки nginx как frontend) - сайт открывался больше двух минут. Но как только он открылся, всё стало работать очень шустро и быстро и до сих пор радует меня скоростью.

    Конфиг - примерно такой же, как в статье, единственное, proxy_redirect использую.

    Так что Вы, скорее всего, просто не до конца разобрались в конфигурации - советую обратиться к первоисточникам, и не использовать чужие конфиги.
  • Добрый день.
    А ктонибудь делал связку nginx + java?
  • 2 Egenius:
    у меня была такая же ситуация. очень большой iowait.. оказалось что нагрузка сильно растет если отдавать файлы из пхп скриптов fopen, fread.. как только переделал XAccel нагрузка резко упала и использование нгинх оправдалось.
  • Доброго времени суток !
    У меня такой вопросик ...
    Есть сайты на MS SharePoint`е в которих забиты внутрение адреса типа http://serv1.localnet/.
    И есть сервак на FreeBSD с выходом в инет, который имеет свой адрес http://some.host.net/.
    Возможно ли настроить nginx на замену адресов с http://serv1.localnet/ на http://some.host.net/ в страничках, и будет ли это так работать ?
  • hi.. thanks for all the great posts.

    anyone ever configured nginx with haproxy? i would like to use nginx to serve static content and have haproxy load-balancing my mongrels serving 3 clusters. so that nginx gets request (serves if static) if not goes to HA for a proxy to the backend mongrel server.
  • Fritzie: Why would you like to use haproxy for balancing when nginx has its own embedded balancing feature?
  • doesn't nginx use a round robin type of balancer. haproxy has an actual queue so its much better for lots of traffic. from what i understand about the queue is that it will only give to a mongrel cluster what it can handle.
  • One of the things it keeps me worried about using a reverse proxy
    is the reporting of visitors statistics.

    Where will you take that information from? From the first (frontend)
    web server? or from the servers behind it? What information will be
    given? Will all the reports look like if the only visitor was the
    reverse proxy server?
  • Каково ограничение на максимальный размер отдаваемого файла?
  • Привет,

    А есть способ сделать так, чтобы nginx вместо того, чтобы обслуживать:

    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;
    }

    обслуживал все файлы, кроме .jsp и случая когде не указано расширение. Т.е. запрос к папке идёт.

    Ну и папку /WEB-INF заоодно закрыть :-)
  • Менять в скриптах все же прийдется. Скажем взять PHP:

    Таким образом, после редиректа, получится, что $HTTP_SERVER_VARS[PORT] = 8080, но это пол беды, т.к. это мало кому важно, гораздо страшнее следующая проблема:

    При проксировании SSL мы получаем SERVER ENVIRONMENT

    HTTPS = null
    и
    SERVER_PORT = 8080

    При редиректе на какой-нибудь пеймент метод(не на все, но такое бывает), кастомер отредиректиться обратно(после проверки кредитки) на порт 8080. Плюс Corner of Trust и подобные штуки для верификации SSL-сертификата, внушающие доверие покупателям тоже могут не работать... :)

    Решается такая проблема магическим RewriteRule'ом:

    RewriteEngine on
    RewriteCond %{HTTP:SSL} YES
    RewriteRule .* - [E=HTTPS:on,L]
    RewriteRule .* - [E=SERVER_PORT:443,L]

    good luck :)
  • А разве точку в location не надо заслешить? Работать оно, конечно и так будет.
  • > anyone ever configured nginx with
    > haproxy?

    www.nginxhosting.com
  • не могу настроить слушать апач адрес 127.0.0.1:80
    когда пишу
    Listen 127.0.0.1:80
    то он выдает ошибку
    (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
    no listening sockets available, shutting down
    что делать?
  • Есть такая проблемка:
    nginx, слушает somehost:6969
    бэкэнд, на который перекидываются запросы
    proxy_pass http://127.0.0.1:4850;
    суть проблемы, бэкэнд посылает Location: /welcome, однако Proxy его перезаписывает как somehost/welcome, при этом теряется порт (6969)
    собственно, что надо сделать с proxy_redirect, чтобы либо он оставался относительным, либо не терялся номер порта?
    заранее спасибо
  • Everything works but I have done some benchmark tests with apache tool "ab" and nginx performs excellent with static files but when it has to proxy request to the Apache listening on 127.0.0.1:8080 for simple .php file it is drastically slower than Apache running solo.
    Since, 70-80% of my sites are PHP based this practically dismisses nginx for me.
    Or I am doing something wrong?
  • Подскажите как при помощи nginx решить такую проблему: за nginx стоит apache, который в свою очередь периодически отключается мною. Хотелось бы чтобы во время выключения апача пользователи получали созданную мною html страничку с приличным текстом, а не страницу браузера, о том что не возможно подключиться к серверу.
    location / {
    proxy_pass http://localhost:8888/
    ....
    ....
    }
  • 2Антон
    Попробуй обработать 504 ошибку в nginx ;)
  • Статься прекрасная, но не полная.
    Для полноты автору следовало бы описать и настройку Apache чтобы он не конкурировал с nginx, и нормально ловил подачи nginx
  • I already used your method for beta, but I got problem with session. How can we set nginx to support session?
  • Hi,

    I used nginx load balancers and nginx as reverse proxy.

    Here's the structures
    nginx (lb) -> nginx (reverse proxy) -> lighttpd

    On nginx reverse proxy, I already got nginx (lb) Ips.
    How can I get the remote host address on nginx?
  • thank you for eplaining the algorithm. so usefull

Add New Comment

Returning? Login