ssh ([info]ssh3) wrote,
@ 2006-07-22 17:51:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Current music:Радио Монте-Карло
Entry tags:linux

Заметки о ipb, apache, nginx
Настройка совместной работы Apache, nginx для обслуживания форума на движке Invision Power Board.


  1. Сборка
    Жизнь в стиле Debian уже почти отучила меня собирать что-либо самостоятельно. :) Но случай с nginx, стал исключением. Ни для Debian, ни для FC4, которую мне любезно поставил на сервер хостер пакета мне найти не удалось. Пришлось вспоминать.

    До сборки я использовал "configure" с опциями:
    ./configure --prefix=/usr/local \
                --sbin-path=/usr/local/bin \
                --conf-path=/usr/local/etc/nginx.conf \
                --error-log-path=/var/log/nginx/error.log \
                --http-log-path=/var/log/nginx/access.log \
                --http-client-body-temp-path=/var/spool/nginx/client_body_temp \
                --http-proxy-temp-path=/var/spool/nginx/proxy_temp \
                --http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp \
                --pid-path=/var/run/nginx/nginx.pid \
                --user=www-data \
                --group=www-data
    

    Далее традиционный:
    #make

    Правда пришлось в ручную создать каталоги, и сделать их владельцем www-data:www-data:
    /var/log/nginx/
    /var/run/nginx/
    /var/spool/nginx/proxy_temp
    /var/spool/nginx/fastcgi_temp
    /var/spool/nginx/client_body_temp
    
    #make install

  2. Конфигурация
    1. Настройка nginx
      Отдельное спасибо, Mr. Alexey N. Kovyrin за его статью описывающую настройку nginx в режиме Reverse-Proxy сервера.
      user  www-data;
      worker_processes  2;
      
      events {
          worker_connections  1024;
      }
      
      http {
          include       /usr/local/etc/mime.types;
          default_type  application/octet-stream;
      
          log_format  main  '$remote_addr - $remote_user [$time_local] $status '
                            '"$request" $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "http_x_forwarded_for"';
      
          access_log  /var/log/nginx/access.log  main;
      
          sendfile       on;
          tcp_nopush     on;
          tcp_nodelay    on;
      
        server {
              listen       80;
              server_name  mysite.ru www.mysite.ru;
              access_log  /home/mysite/log/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|wav|bmp|rtf|js)$ {
                  root   /home/mysite/html;
              }
          }
      

      Процесс конфигурирования можно закончен, проверим синтаксис конфигурационного файла:
      #nginx -t

    2. Настройка apache
      Что касается настройки apache, поскольку nginx сконфигурирован таким образом, что все полученные на порт 80 запросы пересылает backend на ip-адрес: 127.0.0.1 и порт 8080, то достаточно в рабочем конфиге apache изменить следующие директивы:
      ...
      Listen 8080
      ...
      NameVirtualHost *:8080
      ...
      <VirtualHost *:8080>
          ServerName mysite.ru
          ServerAlias www.mysite.ru
          ServerAdmin admin@mysite.ru
          DocumentRoot /home/mysite/html
          ErrorLog /home/mysite/log/error_log
          CustomLog /home/mysite/log/access_log common
      </VirtualHost>
      

      Следует отметить, что скриптами IPB активно используются ip-адреса посетителей, а в случае использования конфигурации приведенной выше, все посетители будут для apache приходить c одного ip-адреса: 127.0.0.1, что не правильно.
      Разрешить ситуацию поможет сторонний модуль для apache с трудно произносимым названием mod_rpaf, что я вляется аббревиатурой от reverse proxy add forward.
      Некоторые заметки о настройке совместной работы apache и mod_rpaf можно найти здесь.
      Поскольку модуль mod_rpaf является сторонней разработкой, сборку его придется провести самостоятельно. В случае с FC4 мне потребовалось установить пакет httpd-devel.i386 командой:
      #yum install httpd-devel.i386.

      Сборка модуля выглядит так:
      в Makefile устанавливаем значение APXS=/usr/sbin/apxs, затем выполняем:
      #make rpaf-2.0 && make install-2.0.

      В конфигурационный файл apache добавляем:
      ...
      LoadModule rpaf_module modules/mod_rpaf-2.0.so
      ...
      ## Mod_rpaf settings
      RPAFenable On
      RPAFproxy_ips 127.0.0.1 realip [realip1]
      RPAFsethostname On
      

      В конфигурационный файл nginx в раздел server необходимо добавить:
      ...
        server {
      ...
              # Main location
              location / {
      ...
                  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      ...
      

    3. Замечания по интеграции в дистрибутив
      • logrotate
        /home/mysite/log/*log{
            missingok
            daily
            rotate 7
            compress
            delaycompress
            notifempty
            sharedscripts
            postrotate
                /bin/kill -10 `cat /var/run/nginx/nginx.pid 2>/dev/null` 2> /dev/null || true
            endscript
        }
        

      • init-скрипт
        Честно говоря я не очень глубоко знаком с устройством FC в этой части и знакомиться особого желания не испытываю, поэтому поступил проще, скопировав с новым именем init-cкрипт от vsftp и поправил его под собственные нужды, возможно не везде идеологически правильно, но работоспособно!
        #!/bin/bash
        # v.0.0.2
        # nginx - This shell script takes care of starting and stopping nginx.
        #
        # chkconfig: - 60 50
        # description: nginx [engine x] is light http web/proxy server
        #              that answers incoming ftp service requests.
        # processname: nginx
        # config: /usr/local/etc/nginx.conf
        
        # Source function library.
        . /etc/rc.d/init.d/functions
        
        # Source networking configuration.
        . /etc/sysconfig/network
        
        # Check that networking is up.
        [ ${NETWORKING} = "no" ] && exit 0
        
        [ -x /usr/local/bin/nginx ] || exit 0
        
        RETVAL=0
        prog="nginx"
        
        start() {
                # Start daemons.
                if [ -e /usr/local/etc/nginx.conf ] ; then
        
                    echo -n $"Starting $prog: "
                    /usr/local/bin/nginx -t -c /usr/local/etc/nginx.conf &&
                    /usr/local/bin/nginx &
                                RETVAL=$?
                                [ $RETVAL -eq 0 ] && {
                                   touch /var/lock/subsys/$prog
                                   success $"$prog"
                                }
                                echo
                else
                        RETVAL=1
                fi
                return $RETVAL
        }
        
        stop() {
                # Stop daemons.
                echo -n $"Shutting down $prog: "
                kill -3 `cat /var/run/nginx/nginx.pid 2>/dev/null`
                RETVAL=$?
                echo
                [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
                return $RETVAL
        }
        
        # See how we were called.
        case "$1" in
          start)
                start
                ;;
          stop)
                stop
                ;;
          reconfigure)
                if [ -f /var/lock/subsys/$prog ]; then
                    kill -1 `cat /var/run/nginx/nginx.pid 2>/dev/null`
                    RETVAL=$?
                fi
                ;;
          status)
                status $prog
                RETVAL=$?
                ;;
          *)
                echo $"Usage: $0 {start|stop|reconfigure|status}"
                exit 1
        esac
        
        exit $RETVAL
        

        Для автоматического страрта при загрузке системы достаточно скопировать стартовый скрипт nginx в каталог /etc/init.d и выполнить следующие команды:
        #chkconfig --add nginx
        #chkconfig --level 345 nginx on
        

        Проверить статус можно командой:
        #chkconfig --list | grep nginx
        nginx           0:off   1:off   2:off   3:on    4:on    5:on    6:off
        

  3. Заключение
    Комплект из apache и nginx работает на моем сервере уже пару дней, без каких либо проблем.
    Ответ на любой из возникших у меня вопросов я смог найти на странице Игоря Сысоева в разделе документации nginx.



Буду рад откликам, особенно положительным :)



(Post a new comment)


[info]zhenek_kreker
2006-07-22 01:31 pm UTC (link)
Теперь айпишники юзеров выглядят нормально, ура :)

(Reply to this)


(Anonymous)
2006-07-24 05:00 pm UTC (link)
какой нибудь реальный прирост производительности есть?
в конце концов этот форум отнюдь не статика, а PHP скрипты

(Reply to this) (Thread)


[info]ssh3
2006-07-24 08:02 pm UTC (link)
Есть, хохма в том, что форум не статика, но ради отдачи 2-5 килобайтной картинки стартовал еще один дочерний процесс apache.
В пиковые часы если верить топу нагрузка на хост была 0.4-0.5, за последние 4 дня выше 0.2 еще ни разу не поднималась.
Смотрю дальше.

(Reply to this) (Parent)(Thread)

А поюзать апач с тредами?
(Anonymous)
2006-07-24 11:34 pm UTC (link)
А что будет если апач с тредами поюзать?Никогда не понимал зачем нужен дебилизм с стартом нового процесса... :\

(Reply to this) (Parent)(Thread)

Re: А поюзать апач с тредами?
[info]ssh3
2006-07-25 05:00 am UTC (link)
nginx собирается гораздо проще чем apache.
Честно говоря я пошукав по сети не нашел веских причин применять именно "мультитредовый" апач, по слухам падучий он. :)

(Reply to this) (Parent)(Thread)

Re: А поюзать апач с тредами?
[info]p1r4nh4
2006-08-27 12:57 pm UTC (link)
Нет, работает нормально, но он ничуть не быстрее обычного форкового апача.

Треды в линухе стартуют очень тяжело, а форк - дешёвый (как и во всех никсах), разницы никакой между ними практически нету. Плюс тредовый стартует 1 процесс с несколькими тредами внутри, и потом каждый новый процесс добавляет кучу нагрузки на проц и озуху. Потому что с одним процессом стартует десятка два тредов, и капец. ;)

(Reply to this) (Parent)(Thread)

Re: А поюзать апач с тредами?
[info]ssh3
2006-08-28 06:55 am UTC (link)
Вобщем все в мире относительно! Но за подробное разъяснение все равно спасибо.

(Reply to this) (Parent)(Thread)

Re: А поюзать апач с тредами?
[info]p1r4nh4
2006-08-28 07:25 am UTC (link)
Пожалуйста. ;)

P.S. Сначала откомментил, а потом посмотрел на дату. :D

(Reply to this) (Parent)(Thread)


[info]beckiexyceh
2008-07-17 03:34 am UTC (link)
А потом, подумав ещё, опасливо оглянулся и снова посмотрел в зеркало.

(Reply to this) (Parent)

(Reply from suspended user)

[info]dmitry_amelin
2006-07-25 04:41 am UTC (link)
а можно озвучить все цифры?
размер базы, сколько пользователей живет, пиковое количество пользователей и т.д.?

(Reply to this) (Parent)(Thread)


[info]ssh3
2006-07-25 05:06 am UTC (link)
база mysql ~400 мегабайт;
кол-во пользователей ~38000
среднее кол-во посетителей ~150
максимальное кол-во посетителей ~300

(Reply to this) (Parent)

(Reply from suspended user)

[info]mihajlo
2006-07-25 04:16 am UTC (link)
все хорошо, только почему именно инвижн? ))

(Reply to this) (Thread)


[info]ssh3
2006-07-25 06:32 am UTC (link)
Инвижин исторически там был.
Не виноватая я :)

(Reply to this) (Parent)


[info]olegd
2006-07-25 11:28 am UTC (link)
Я сделал проще, у меня всю статику отдает nginx на отдельном IP

(Reply to this) (Thread)


[info]ssh3
2006-07-25 11:31 am UTC (link)
Хех, так и тут вроде никаких таких сложностей.
Хотя об отдельном ip можно и подумать.

(Reply to this) (Parent)(Thread)


[info]olegd
2006-07-25 11:36 am UTC (link)
Ну конфиг апача переделывать, mod_rpaf ставить... Просто скармливаешь nginx директорию аплоадс и скины, явыскрипты - вот и фсе. Если надо могу по подробнее.

(Reply to this) (Parent)(Thread)


[info]ssh3
2006-07-25 11:41 am UTC (link)
Конечно можно :)
Даже нужно.

(Reply to this) (Parent)(Thread)


[info]olegd
2006-07-25 11:48 am UTC (link)
ну вот смотри - все это успешно работает на fromuz.com

заводим еще один ip и делаем новый субдомен на нем в зоне - в моем случае это img.fromuz.com

на этот IP вешаем на 80 порт nginx, далее создаем папочку в нужной директории, где будем хранить файлики.

Копируем основную структуру IPB и сайта (если надо) где хранится статика, в случае IPB это вся папка uploads и папка со смайлами, скинами, и прочей фигней. Что не нужно грохаем. идем в настройки IPB Говорим что теперь смайлы, скины и аплоад лежит для мира в img.fromuz.com, а на сервере там-то, при этом не забываем ставить права на папке 777, тудыж заливать народ будет (я про аплоад). Дальше правим файл скина и css просто добавляем везде img. в хосте и фсе... скорость отдачи возрасла в разы.

Тоже самое сделал по всему сайту.

(Reply to this) (Parent)


[info]olegd
2006-07-25 12:03 pm UTC (link)
кстати база у меня 3 гига :)

Аплоад 14 гиг :)

(Reply to this) (Parent)(Thread)


[info]ssh3
2006-07-25 12:34 pm UTC (link)
Спасибо, дорасту гигов до 1,5 обязательно попробую :)

(Reply to this) (Parent)


[info]polkila
2008-10-09 03:01 pm UTC (link)
nginx перед апачем все равно желательно ставить, чтобы медленные соединения срезать, так что вы не сильно лучше сделали. пусть висят на одном ip

(Reply to this) (Parent)(Thread)


[info]olegd
2008-10-09 03:25 pm UTC (link)
Хыхы.. у меня с тех пор вообще все обслуживает nginx
без апача.

(Reply to this) (Parent)


[info]bitlz
2006-08-18 03:02 pm UTC (link)
для debian nginx можно забрать отсюда:
http://deb.wapper.ru/nginx/

(Reply to this) (Thread)


[info]ssh3
2006-08-18 11:12 pm UTC (link)
Спасибо. Как раз собирался поднять хостинг сервер под Debian.

(Reply to this) (Parent)

зачем ?
(Anonymous)
2006-09-06 12:03 am UTC (link)
Уважаемые, поясните плиз, а в чём вообще прелесть подобного проксирования ?
Никак не возьму в толк. IPB контент в основном динамически. Где мы выигрываем от добавления нового демона ?

Спасибо.

(Reply to this) (Thread)

Re: зачем ?
(Anonymous)
2006-09-06 06:17 am UTC (link)
В частности, для защиты от меделенных клиентов и стабилизации расхода памяти. Прикручивая легкий и производительный front-end (nginx), мы экономим ресурсы на дорогостоящих процессах apache.

(Reply to this) (Parent)(Thread)

Re: зачем ?
(Anonymous)
2006-09-07 11:18 am UTC (link)
Ну со статикой понятно. А есть ли выйгрыш именно в ситуации с динамическим контентом ?
Например с проксированием PHPскриптов ? Ведь апач в любом случае будет обрабатывать данный запрос. + ещё nginx сверху. Не будет ли это overhead'ом ?

Заранее спасибо за ответы.

(Reply to this) (Parent)

Дополнение
(Anonymous)
2006-09-06 01:17 pm UTC (link)
nginx может делать еще одну полезную вещь, а именно - взять на себя gzip-сжатие ответов от Апача. В результате генерация ответов Апачем будет занимать меньше времени, что может сократить необходимое число экземпляров.
http://www.sysoev.ru/nginx/docs/http/ngx_http_gzip_module.html

(Reply to this) (Thread)

Re: Дополнение
[info]ssh3
2006-09-08 07:24 am UTC (link)
На следующей неделе планирую провести эксперименты в этой области.
Правда методику оценки еще не продумал! ;)

(Reply to this) (Parent)

Не выполняется php
[info]unofire
2007-03-19 06:29 pm UTC (link)
Настроил nginx и apache, статику nginx отдает замечательно, но почему-то не обрабатывается php, nginx отдает его в виде кода без обработки.

HTTP/1.0 200 OK
Server: nginx/0.5.14
Date: Mon, 19 Mar 2007 17:54:08 GMT
Content-Type: application/x-httpd-php
Connection: close
Last-Modified: Thu, 08 Mar 2007 11:13:58 GMT
ETag: "9980544-7629-67436980"
Accept-Ranges: bytes
Content-Length: 30249

Логи пустые. Где искать ошибку, в apache или в nginx?

(Reply to this) (Thread)

Re: Не выполняется php
[info]ssh3
2007-03-20 12:38 am UTC (link)
Думаю, что крутить надо апач, у Вас php то в системе уставновлен? А без фронтенд http-сервера php работает?

(Reply to this) (Parent)(Thread)

Re: Не выполняется php
[info]unofire
2007-03-20 07:09 pm UTC (link)
Ну точно, криво подцепил PHP :(

А как в заголовках скрыть версию nginx и PHP?

(Reply to this) (Parent)

Re: Не выполняется php
[info]unofire
2007-03-20 07:15 pm UTC (link)
Хм, не устанавливал mod_rpaf, а ip нормальный. Вот чудеса :)

(Reply to this) (Parent)

молодец
[info]rasdotsu
2007-11-23 05:24 am UTC (link)
Отличная статья, хорошо описал весь процесс. Привет от http://www.nginx.info

(Reply to this)

(Reply from suspended user)

Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…