Делаем nginx как front-end к apache

Эта тема довольно избита, но на просторах интернета не так и просто найти короткий и четкий ответ на этот вопрос. Вот по этому я решил собрать все в виде небольшой инструкции.

Для начала разберемся в логике работы. Все очень просто: статические файлы отдает nginx, а динамикой занимается apache (см. схему)

image

Данный пример реализован на Ubuntu Server 10.04

Шаг первый: установка Apache, PHP, MySQL и nginx


Установка Apache
apt-get install apache2
[+mod_rewrite]
a2enmod rewrite

Установка PHP
apt-get install php5-cli

Установка MySQL
apt-get install mysql-server
apt-get install mysql-client-core-5.1
apt-get install php5-mysql

Установить nginx
apt-get install nginx
Конфиги -> /etc/nginx

Шаг второй

Вешаем apache на порт 8080 (или на другой, кроме 80)
Вносим изменения в конфигурацию апача:
/etc/apache2/ports.conf
NameVirtualHost *:8080
Listen 8080
Если есть виртуальные хосты, то их тоже нужно повесить на порт 8080

Шаг третий

Настраиваем nginx
Создаем файл конфигурации в директории: /etc/nginx/sites-available
server {
listen *:80; ## listen for ipv4
server_name ВАШ_ДОМЕН;
access_log /var/log/nginx/access.log;
# Перенаправление на back-end
location / {
proxy_pass ВАШ_ДОМЕН:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 180;
}
# Статическиое наполнение отдает сам nginx
# back-end этим заниматься не должен
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
root ПУТЬ_ДО_КОРНЕВОГО_КАТАЛОГА_САЙТА;
}
}

Шаг четвертый

Перезапускам apache и nginx:
/etc/init.d/apache2 restart
/etc/init.d/nginx restart

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 42

    +8
    Зачем апач биндить на внешний интерфейс?
    127.0.0.1: порт-по-вкусу. с него достаточно.

    Апач лучше вешать на именованный локэйшн,
    в который потом проще будет завернуть и ошибки статики
    к примеру так.

    error_page 404 405 504 502 = @fallback;

      +5
      Добавлю, что
      proxy_pass http://ВАШ_ДОМЕН:8080/;
      тоже не айс, лучше тоже на localhost. А по возможности — на unix.socket
        0
        Заворачивание ошибок 404 на апач — это правильно для большинства типовых сайтов.

        Например, для нас, когда мы конфигурируем сервер, очень важно, чтобы nginx в конфиге должен иметь fallback на статические изображения(jpg, png, gif) и файлы — чтобы запрос шёл к апачу при отсутствии
        запрашиваемого отображения.

        Почему это важно:
        1 вариант: Бывает ситуации, когда разработчик отдает некоторые файлы с помощью apache. Для многих [сделанных давно] проектов это особенно актуально
        2 вариант (часто используемый нами): мы генерируем картинки нужного размера из исходных картинок (например, превьюшки) при первом обращении по этому адресу и потом кэшируем на диск. Вот при первом обращении срабатывает апач, а при последующих — уже nginx отдает файл с диска.

        Это однозначно полезная опция.
        +8
        На просторах интернета таких статей много, и фактически не нужно прикладывать никаких сил что бы их найти.
          +1
          И вообще в большинстве случаев хватает nginx'а c php-fpm, без всяких там apach'ей.
            –5
            Что мне делать с php-frm если я на питоне пишу? :)
              +5
              В статье ставится PHP. А комментарии, обычно, идут в контексте статьи.
                –5
                Он в статье вообще непонятно зачем ставится)
                  0
                  Факт в том, что ставится =)
                    +3
                    Факт в том что ставится консольный пхп :)
                      0
                      И то верно. Не приметил даже, что там только cli устанавливается.
                +2
                а зачем для питона апач?)
                  +2
                  mod_python использую
                  хотя надо это прекращать)
                    +5
                    uwsgi сделал мои волосы мягкими и шелковистыми.
                    Вообще не понимаю зачем для питона апач.
                      +1
                      поддерживаю
            +3
            Вроде это не раз уже было разжевано на Хабре.
              +2
              Да и ко всему прочему, вы сами то проверяли что ваш сервер после этого мануала заработал?
              +3
              Набираем в гугле «nginx reverse proxy» и видим пару десятков статей схожего содержания, причем некоторые имеют более полное описание.

              Стандартный вопрос, что если я захочу держать на сервере, на-пример .pdf файлы? а .djvu? а .doc? а .*?

              Для чего нужны, на пример, эти настройки:

              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $remote_addr;

              Хоть бы постарались и подробно описали конфиг, написали бы возможные варианты и как что и когда лучше настраивать.
                0
                Если у вас непредсказуемые типы статичных файлов будут, то можно для них отдельный поддомен выделить. Еще можно проверять существует ли файл (в папке для статики), иначе перекидывать запрос апачу.
                  +1
                  Ну, лично у себя я и проверяю на наличие, но автор тупо скопипастил статью «из гугла» и даже не подумал разобраться в этом…
                +2
                Вместо
                /etc/init.d/apache2 restart
                /etc/init.d/nginx restart

                В Ubuntu принято писать
                service apache2 restart
                service nginx restart
                  +1
                  Еще во всех командах нужен sudo, либо один раз sudo -s, если мне память не изменяет.
                    0
                    Тоже хотел указать, но команды могут выполняться уже из под рута
                    0
                    Не только в Убунте кстати (Fedora 14).
                      +3
                      А в чем разница? Я, например, не задумывался никогда.
                      Через полный путь к init-скрипту работает фактически в любой unix-подобной ОС, не нужно помнить, где и как «принято».
                        0
                        Тоже никогда не задумывался об этом…
                        1) Надо рестартануть апач
                        2) /etc/init.d/apache2 restart
                        3) Профит

                          +1
                          а дело в нюансах. например не передаются переменные окружения в скрипт
                          service runs a System V init script in as predictable environment as possible, removing most environment variables and with current working directory set to /.
                            0
                            Да, это я нагуглил уже. А еще service поддерживает не только скрипты system V, но и upstart.
                        +1
                        Кстати, для Apache тогда бы не помешало поставить mod_rpaf и настроить его.
                          +3
                          это просто необходимо сделать, причем, нужно брать версию 0.6, лучше даже с офсайта и вручную скомпилировать, приведу последовательность действий для дебиана, беру кусок из нашей внутренней документации:

                          … Затем нам необходимо решить проблему с REMOTE_ADDR. Решается она установкой модуля rpaf:

                          apt-get install libapache2-mod-rpaf

                          В файле /etc/apache2/mods-enabled/rpaf.conf добавляем следующий параметр:

                          RPAFheader X-Real-IP

                          Скорее всего, пакет libapache2-mod-rpaf устаревший, а последний параметр поддерживается только в версии rpaf начиная с 0.6, его можно взять отсюда: stderr.net/apache/rpaf/download/ Кроме того, нам надо скачать дополнительный пакет для апача и потом можно будет собрать модуль:

                          apt-get install apache2-prefork-dev
                          wget stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
                          tar xzf mod_rpaf-0.6.tar.gz
                          cd mod_rpaf-0.6
                          apxs2 -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

                          Теперь мы создали еще один модуль в составе апача, надо ему указать, что мы работаем именно с ним. Для этого редактируем файл /etc/apache2/mods-enabled/rpaf.load

                          LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so

                          А в файле /etc/apache2/mods-enabled/rpaf.conf изменяем:

                            0
                            парсер съел последнюю строчку:
                            <IfModule mod_rpaf-2.0.c>
                          0
                          Всегда было интересно, для чего в этой схеме Apache?
                          есть fastcgi для php, и php-fpm и еще куча разного.
                            0
                            например для mod_rewrite и .htaccess, ибо некоторые CMS умеют писать htaccess, но при этом не имеют ни малейшего понятия как написать то же самое для nginx
                              0
                              теперь и сам задумался, для чего это всё, если есть алгоритмы автоматического преобразования директив mod_rewrite в формат понятный nginx.
                                0
                                Нету.
                                  0
                                  не могу с вами согласиться, т.к. данная утилита пару раз меня выручала
                                    0
                                    Ах это…
                                    Видел, видел. По большей части генерирует хлам. По крайней мере, с полгода назад так было.
                            0
                            Самое забавное — на момент написания комментария топик имеет +2 голоса, но при этом 76 человек добавили в избранное. Значит все-таки актуально…
                              0
                              На хабре много разного народа, может кого и в гугле забанили, кто знает…
                              Судя по всему, те, кто добавил в избранное, правом голоса не обладают, серые, околонулевые читатели.
                                0
                                Вы сейчас обо мне говорите. Я добавил. Не уверен, что пригодится, пока индейца хватает. Но зато если надо будет — я смогу быстро найти. Да, в гугле может быть и быстрее, да, в гугле может быть полнее, но для моих скромных потребностей мне этой статьи хватит с головой, остальное, если понадобится, найду…
                                  +1
                                  Нет, никого конкретного я не имел в виду. Не думаю, что стоит по этому мануалу делать. Сходите лучше за офф. документацией, она на русском и с понятными примерами.
                                  Также рекомендую присоединиться к рассылке (на сайте Сысоева написано, как), там сам Игорь и другие опытные товарищи помогают в любых ситуациях, даже очень нетривиальных.
                              0
                              stackoverflow.com/questions/31859699/how-to-correct-rewrite-nginx-apache-urls посмотрите плиз ссылку, сможете помочь настроить реврайт nginx frontend + apache backend, спасибо

                              Only users with full accounts can post comments. Log in, please.