Отправляет email-рассылки с помощью сервиса Sendsay

Программистские записки

  Все выпуски  

Программистские записки nginx+apache как front-end+back-end


Рабочая конфигурация сервера…звучит сложно не правда ли? Ведь большинство web-серверов работают на linux, будь то debian, centos,fedora,gentoo,redhat или opensuse. Но на самом деле за страшными и непонятными на первый взгляд системами, скрывается залог стабильной работы Ваших проектов. Так как мне привычнее всего работать с debian я буду говорить именно об этой OS хотя вскольз затрону и некоторые другие.

Данная операционная система чрезвычайно стабильна. За кучей непонятных, казалось бы, команд, можно найти стройную и логичную, малотребовательную к ресурсам систему, при грамотной настройке которой, можно даже на слабом сервере размещать средне-нагруженные проекты. Но это все лишь общие слова. Вы мне конечно же не поверите на слово, ведь вы программисты, привыкшие все проверять. Ну что же…давайте проверим.

Я уже рассказывал, что для работы сайта требуется Web-сервер, и для ОС windows незаменим пакет denwer. Но это лишь первые шаги, denwer отличен лишь для локальной машины для дебага. Большинство же «боевых» серверов работает на LAMP (Linux+Apache+MySQL+PHP). А что делать когда нагрузка велика и сервер не справляется? Неужели покупать новый? Нет! Оптимизировать, оптимизировать и еще раз оптимизировать. Если код ваш «вылизан» и вы уверены что он оптимален..что ж значит настала очередь серверного ПО. И прежде всего это web-сервер.

Чем плох apache? Да собственно практически ничем. Он очень функциональный, гибкий…удобный, повсеместно распространенный…но тяжелый..Да, да именно тяжелый..чем больше модулей вы подключаете к нему тем больше ресурсов он «отжирает». Но зачем все это в том случае когда отдается статический контент, например jpg,css,html,zip и т.д.? Куча оперативной памяти занимается впустую. Что ж…с этим надо что-то делать. И поможет нам в этом nginx. Это легкий web сервер не умеющий работать с динамическим контентом, но отлично отдающий статику. Количество процессов данного web-сервера жестко задается в конфиге и новые процессы не создаются автоматически, Из чего фактически вытекает что потребление памяти nginx очень мало.

Я надеюсь что из моего описания вы оценили всю прелесть данного web-сервера. Если же все еще не прониклись советую посетить сайт офф. сайт nginx. Для тех же кто проникся опишу порядок установки. Само собой установить его вы сможете только в том случае если у вас есть собственный VDS или dedicated сервер с root доступом. Итак установка возможна из репозиторий или сборка из исходников. Начну с установки из репозитория.

В зависимости от того какая ОС у вас стоит в ней должен присутствовать какой-либо мэнеджер пакетов. В debian-подобных системах это aptitude, в centos, fedora и т.д. – это yum. Т.к. с другими мэнеджерами я практически не сталкивался-опишу установку с помощью этих двух. Начнем с aptitude.
Прежде всего надо обновить список доступных приложений из репозитория.


sudo aptitude update

sudo перед aptitude говорит о том что команду мы запускаем с правами суперпользователя. Если вы уже работаете из под рута эту команду можно опустить.

После обновления пакетов ищем nginx.


sudo aptitude search nginx

Ответом должно быть что-то типа этого:


p   nginx                                                                       - small, but very powerful and efficient web server and mail proxy                     

p   nginx-dbg                                                                   - Debugging symbols for nginx  

Ну что ж…теперь установим nginx.


sudo aptitude install nginx

Вот и все. Просто не правда ли?

Теперь давайте покажу как это делается через yum. Тут все аналогично и просто.


sudo yum clean all

sudo yum makecache

sudo yum search nginx

sudo yum install nginx

Первой командой очищаем кэш. Второй получаем его по новой. Ищем nginx, смотрим его название и ставим.

Часто в репозиториях не самая последняя версия. Поэтому многие самостоятельно из исходников собирают ПО. nginx собрать довольно просто. Главное не забудьте доустановить gcc для компиляции)


cd  /path/to/nginx

sudo ./configure --conf-path=/etc/nginx --with-pcre=/path/to/pcre 

 --with-zlib=/path/to/zlib --with-http_ssl_module

После успешной конфигурации компилируем и устанавливаем


sudo make

sudo make install

Ну, надеюсь с установкой разобрались. Теперь настройка.
Прежде всего надо понимать что два web-сервера не могут работать на одном порту. Т.е изначально все запросы должен обрабатывать nginx. В зависимости от запрашиваемого типа контента он должен отдавать статику сам, а запросы динамики передавать apache.
Для этого настроим apache таким образом чтобы он «слушал» лишь порт 8080.
Перед тем как редактировать все конфиги-забэкапьте их, вдруг что-то сделаете не так.
Прежде всего поправим файл /etc/apache2/ports.conf (здесь и далее описываю настройку уже на примере debian, т.к на CentOS и иже с ними это делается идентично, единственно отличие-имена и пути до файлов (в CentOS /etc/httpd/conf/httpd.conf)) таким образом чтобы он выглядел примерно так:


NameVirtualHost *:8080

Listen 8080

<IfModule mod_ssl.c>

    # SSL name based virtual hosts are not yet supported, therefore no

    # NameVirtualHost statement here

    Listen 8443

</IfModule>


Т.е. Listen 8080 говорит о том, что apache слушает этот порт. Далее в каждом virtualhost (файлы в папке /etc/apache2/sites-enabled/) поправим порты (т.е. как я уже говорил меняем значение 80 на 8080).
На этом приготовления apache закончены. Настала очередь nginx.
Заходим в /etc/nginx/sites-availabel и создаем файлы конфигурации хостов.


cd /etc/nginx/sites-available/

sudo vi test.conf

Редактируем его.


server {

        #ip сервер и порт который слушает nginx

    listen 85.10.231.135:80;

        # имя хоста

    server_name test.ru www.test.ru;

        #лог доступа nginx

    access_log /var/log/nginx/test.access.log;

 

        #лог ошибок

        error_log /var/log/nginx/test.error.log;

    location / {

                #указываем папку проекта

        root /var/www/test/public;

                #рулим на апач

        proxy_pass http://127.0.0.1:8080;

                #отключаем редирект

        proxy_redirect off;

                #задаем хост чтобы апач понял к каком хосту обращаются

        proxy_set_header   Host             $host;

                #передаем реальный ip

        proxy_set_header   X-Real-IP        $remote_addr;

                #Передаем x-forwarded-for

        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;

    }

        #все статичные файлы расширения которых указаны ниже отдаем

        # без запроса к Apache

    location ~* ^.+\.(jpg|chm|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls

        |exe|pdf|txt|tar|wav|bmp|js|swf)$ {

        root   /var/www/test/public;

    }

}


После чего создаем ссылку на файл в sites-enabled:


sudo ln -s /etc/nginx/sites-availabel/test.conf /etc/nginx/sites-enabled/

рестартуем nginx:


sudo /etc/init.d/nginx restart

Наслаждаемся. :)
Надеюсь данная статья Вам был полезна, уважаемый читатель. Если у Вас появились какие-то вопросы-пишите в комментах. Буду рад ответить.

P.S. Забыл предупредить, чтобы $_SERVER['REMOTE_ADDR'] была правильной поставьте себе mod_rpaf для apache.


sudo aptitude install libapache2-mod-rpaf

P.P.S. Уже после написания статьи, но до публикации, подумал о том что я не оставил надежды тем кому уже связка nginx+apache не помогает. Так вот, если вы готовы к трудностям для вас fpm-php+nginx. Как-нибудь опишу процесс установки и настройки и этой связки. :)


В избранное