DISQUS

Homo-Adminus Blog: Using Nginx As Reverse-Proxy Server On High-Loaded Sites

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

    1) хранение сессий на nfs-share
    2) хранение сессий в базе данных
  • Ian · 3 years ago
    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?
  • Dogen · 2 years ago
    Очень познавательно, теперь я знаю, что такое nginx.
  • Vladimir · 2 years ago
    Спасибо Алекс, очень полезная статья.
    Расскажите плз чем вы такие красивые блок схемы строите?
  • SvetlanaNikit · 2 years ago
    Ребят, помогите, пожалуйста! никак не могу "подружить" 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

    что здесь неправильно?
  • rubyrobot · 2 years ago
    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?
  • Scoundrel · 2 years ago
    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.
  • rubyrobot · 2 years ago
    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!
  • david · 2 years ago
    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
  • smbd · 2 years ago
    Спасибо за статью! Жаль только ни слова не было сказано насчет апача, достаточно ли его только перевесить на другой порт (Listen :8080), и что-то еще нужно поправить?
    А в конфиге nginx есть возможность построить условия (анализ HTTP-заголовков), на которых уже решать, что сделать с запросом, проксировать его апачу, или выдать 403?
  • Anton · 2 years ago
    Статья отличная, но у меня не получается сделать так чтобы картинки отдавались в многопоточном режиме клиенту, т.е. они грузятся на странице по одной, я видел много ресурсов где явно видно что картинки отдаются по несколько сразу и отдаются они нгинксом, или такое только средствами nginx не реализовать.
  • masterkey · 2 years ago
    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
  • Egenius · 2 years ago
    К сожалению данная схема не работает если на серваке крутятся виртуальные хосты, которые "сидят" на одном айпишнике. ((
    Как быть в этой ситуации ?
    Спасибо !
  • Egenius · 2 years ago
    Запустил вчера сервер с Вашим конфигом и сервак "умер". Точнее начались такие тормоза что работать было просто невозможно.
    У меня на серваке 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, конечно )
    Жду ответа...
  • ailau · 2 years ago
    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?
  • Perforator · 2 years ago
    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"?
  • Hon Dev · 2 years ago
    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?
  • Dreadatour · 2 years ago
    2 Egenius:
    у меня крутится около полутора десятков виртуальных хостов через nginx и apache.
    Nginx сидит на 80-м порту, apache - на 8080. Никаких проблем, всё отлично.

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

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

    Так что Вы, скорее всего, просто не до конца разобрались в конфигурации - советую обратиться к первоисточникам, и не использовать чужие конфиги.
  • -=HaRius=- · 2 years ago
    Добрый день.
    А ктонибудь делал связку nginx + java?
  • pushlan · 2 years ago
    2 Egenius:
    у меня была такая же ситуация. очень большой iowait.. оказалось что нагрузка сильно растет если отдавать файлы из пхп скриптов fopen, fread.. как только переделал XAccel нагрузка резко упала и использование нгинх оправдалось.
  • SashaF · 2 years ago
    Доброго времени суток !
    У меня такой вопросик ...
    Есть сайты на MS SharePoint`е в которих забиты внутрение адреса типа http://serv1.localnet/.
    И есть сервак на FreeBSD с выходом в инет, который имеет свой адрес http://some.host.net/.
    Возможно ли настроить nginx на замену адресов с http://serv1.localnet/ на http://some.host.net/ в страничках, и будет ли это так работать ?
  • Fritzie · 2 years ago
    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.
  • Scoundrel · 2 years ago
    Fritzie: Why would you like to use haproxy for balancing when nginx has its own embedded balancing feature?
  • Fritzie · 2 years ago
    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.
  • Alejandro Lengua · 2 years ago
    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?
  • Stepan Klimov · 2 years ago
    Каково ограничение на максимальный размер отдаваемого файла?
  • Se · 2 years ago
    Привет,

    А есть способ сделать так, чтобы 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 заоодно закрыть :-)
  • Alexander Driantsov · 1 year ago
    Менять в скриптах все же прийдется. Скажем взять 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 :)
  • rusty_angel · 1 year ago
    А разве точку в location не надо заслешить? Работать оно, конечно и так будет.
  • Gregory · 1 year ago
    > anyone ever configured nginx with
    > haproxy?

    www.nginxhosting.com
  • ttt · 1 year ago
    не могу настроить слушать апач адрес 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
    что делать?
  • EPILock · 1 year ago
    Есть такая проблемка:
    nginx, слушает somehost:6969
    бэкэнд, на который перекидываются запросы
    proxy_pass http://127.0.0.1:4850;
    суть проблемы, бэкэнд посылает Location: /welcome, однако Proxy его перезаписывает как somehost/welcome, при этом теряется порт (6969)
    собственно, что надо сделать с proxy_redirect, чтобы либо он оставался относительным, либо не терялся номер порта?
    заранее спасибо
  • dylan · 1 year ago
    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?
  • Антон · 1 year ago
    Подскажите как при помощи nginx решить такую проблему: за nginx стоит apache, который в свою очередь периодически отключается мною. Хотелось бы чтобы во время выключения апача пользователи получали созданную мною html страничку с приличным текстом, а не страницу браузера, о том что не возможно подключиться к серверу.
    location / {
    proxy_pass http://localhost:8888/
    ....
    ....
    }
  • junqed · 1 year ago
    2Антон
    Попробуй обработать 504 ошибку в nginx ;)
  • vasya · 1 year ago
    Статься прекрасная, но не полная.
    Для полноты автору следовало бы описать и настройку Apache чтобы он не конкурировал с nginx, и нормально ловил подачи nginx
  • Glen Lumanau · 1 year ago
    I already used your method for beta, but I got problem with session. How can we set nginx to support session?
  • Glen Lumanau · 1 year ago
    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?
  • Matematik Forumu · 1 year ago
    thank you for eplaining the algorithm. so usefull