Студия креативных разработок DevArt.PRO.
Разработка сайтов и форумов под ключ!
Сильнейшая команда в России по vBulletin - читать подробнее...
 
 
 
 

 
 
Здесь скоро опять что то будет...
 
 
 
 
 
 
Loading

Вернуться   форум vBSupport.org > vBulletin > vBulletin 3.7.x > Хаки, моды и скрипты 3.7

Объявления
  • Изменения в правах
  • Каталог Фрилансеров
  • Добро пожаловать!
  • Premoderation
  • Новичкам!
  • For English speaking users
Ответ
 
Опции темы Опции просмотра
Старый 08.07.2008, 06:56   #1
Продвинутый
Настройка apache и nginx для vbulletin

Данное руководство предназначено для тех кто имеет рутовый доступ к системе, неважно *nix или windows.

Моему проэкту более 4х лет, он сменил не один десяток хостингов прежде чем перебрался на мою площадку.
И ввиду того что площадка маленькая и перегруженная, а форум большой (больше ляма постов) и жрущий много ресурсов со временем все конфиги были вылизаны до максимума производительности.
Версии софта о которых идет речь
Apache/2.2.9
Nginx/0.6.32

Первый вопрос который встал передомной это недостаток оперативной памяти, ее было всего гиг и вместе с остальными сайтами на площадке в своп я уходил регулярно. Связанно это было с тем что апач по умолчанию для кождого соединения создает новый процесс(fork), каждый из форков хочет памяти, и в гиг на самом деле больше 500 впихнуть нормально не возможно.

Для решения это проблемы перед апачом был поставлен nginx(http://sysoev.ru/nginx/). nginx это легковесный мультитрэдный http демон, он в данном случае решает проблему кучи открытых соединения, раздачи статики, сжатия исходящих данных(gzip). Именно он будет обслуживать соединения, апачу мы будем давать только те запросы которые требуют вычислений

А теперь подробнее о модификации конфигов компонентов системы:
начнем с апача:

самая главная задача в данном случае это кастрировать его:
в частности я отключил все лишние модули кроме того что нужно для работы пхп, более простые вещи такие как листинг каталогов и работу со статикой я перенес на nginx.
помимо того чтобы поставить нгинкс мне потребовалось собрать модуль для апача rpaf(http://stderr.net/apache/rpaf/) он нужен для того чтобы правильно передавать пхп ip адреса с которых пришел запрос.
мой конфиг с комментариями
Код:
ServerRoot "/usr/lib/apache2"
PidFile /var/run/apache2.pid
# LockFile /var/run/apache2.lock

LoadModule authz_host_module modules/mod_authz_host.so  #этот и следующий модуль это авторизация и права
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule dir_module modules/mod_dir.so # дириктории индексы дефолты
LoadModule mime_module modules/mod_mime.so # mime тайпы
LoadModule mime_magic_module modules/mod_mime_magic.so # миме по первым байтам файла
LoadModule rewrite_module modules/mod_rewrite.so # реврайты лучше оставить, много где используются 
LoadModule log_config_module modules/mod_log_config.so # логи
LoadModule logio_module modules/mod_logio.so # дополнительный модуль логов
LoadModule status_module modules/mod_status.so # статистика апача по урлу
LoadModule rpaf_module modules/mod_rpaf.so # этот модуль мы собираем и ставим руками, нужен он для правильных ip адресов при наличии nginx-а

User apache # пользователь от которого работает демон (в вашей системе может отличаться)
Group apache # то же самое но группа
Timeout 300 # тайм аут соединения
KeepAlive Off # нам они не нужны мы за nginx-ом
UseCanonicalName Off # блаблабла
AccessFileName .htaccess # волшебные файлы 
ServerTokens Prod # прятать от внешнего мира версию нашего сервера
ServerSignature On # но призноваться кто мы
HostnameLookups Off # имена в логах, не включать 
EnableMMAP on # шарить память между процессами
EnableSendfile on # использовать прямую передачу файлов с диска в сокет
ExtendedStatus On # расширеный статус
RPAFproxy_ips 127.0.0.1 # настройки модуля рпаф для правильных ip адресов 
RPAFenable On # nocomments

# дальше идут стандартные вещи для апача
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

<IfModule dir_module>
    DirectoryIndex index.htm index.html index.php
</IfModule>

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
</FilesMatch>

Listen 127.0.0.1:80

### INCLUDES ### 
Include /etc/apache2/mconf.conf #здесь настройки модулей апача
Include /etc/apache2/vhost.conf #здесь настройки виртульных хостов
дальше идет файл mconf.conf

Код:
<IfModule prefork.c>
    StartServers        8
    MinSpareServers     8
    MaxSpareServers     64
    ServerLimit         256 # максимальное число форков апача, если вы не умещаемся в эту цифру то проблема глубже чем  вы думаете
    MaxClients          256
    MaxRequestsPerChild 1024
</IfModule>

<IfModule !mod_php5.c>
        LoadModule php5_module    modules/libphp5.so
</IfModule>

<IfModule mod_mime.c>
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php .phtml
        AddType application/x-httpd-php .php3
        AddType application/x-httpd-php .php4
        AddType application/x-httpd-php .php5
        AddType application/x-httpd-php-source .phps
</IfModule>

ErrorLog /var/log/apache2/error_log
LogLevel warn

<IfModule log_config_module>

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-Agent}i" agent
    LogFormat "%v %h %l %u %t \"%r\" %>s %b %T" script
    LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i" vhost

    <IfModule logio_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

CustomLog /var/log/apache2/access_log vhost

</IfModule>

### MIME CONFIG ###

DefaultType text/plain

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddEncoding x-gzip .gz
    AddType application/x-compress .Z
    AddType text/javascript .js.gz
    AddHandler type-map var
</IfModule>

<IfModule mime_magic_module>
    MIMEMagicFile /etc/apache2/magic
</IfModule>
далее настройка вирутальных хостов в файле vhost.conf:
Код:
### DEFAULT VHOST 4 ALL IP ###

NameVirtualHost *:80
<VirtualHost *:80>

ServerAdmin a@b.ru
ServerName default.ru
DocumentRoot "/mnt/www/default_root"

<Location /status-a>
SetHandler server-status
Order Allow,Deny
Allow from All
</Location>
    <Directory "/mnt/www/default_root">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

### forum config ###

<VirtualHost *:80>
        ServerName forum.blablabla.ru
        DocumentRoot /mnt/www/forum
        ServerAdmin a@b.ru

<Directory /mnt/www/forum>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
</Directory>
</VirtualHost>
если все правильно сделано то эта схема без проблем заведется, но учитывайте разницу между линуксом и другими операционными систмами, некоторые детали отличаются.

На этом настройка и кастрация апача закончена, в итоге мы имеем легкую версию апача с пхп.
В моем случае суммарный объем памяти занимаемый апачем стал 18 мегабайт на форк + 9 метров шаред памяти, максимум я занимаю 100 - 300 метров.
Скорость форка благодаря отключению лишнего повышается в разы и дает значительный прирост в скорости обработки запроса до пхп.

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

Код:
user apache apache; # пользователь и группа демона
worker_processes 8; # количество воркеров, рекомендуется делать больше чем число ядер.
pid /var/run/nginx.pid; # pid

error_log /var/log/nginx/error_log warn;

events {
        worker_connections  8192;
        use epoll;
}

http {  
        access_log                      /var/log/nginx/access_log combined;
        include                         /etc/nginx/mime.types; #миммы
        default_type                    application/octet-stream;
        server_tokens                   off; # не говори свою версию
        reset_timedout_connection       on;
        client_header_timeout           10m;
        client_body_timeout             10m;
        send_timeout                    10m;
        connection_pool_size            256;
        client_header_buffer_size       8k; 
        large_client_header_buffers     100 8k;
        request_pool_size               4k;
        client_max_body_size            1024m;
        proxy_buffering                 on;
        proxy_buffers                   512 8k;
        proxy_buffer_size               8k;
        proxy_read_timeout              180;
        proxy_connect_timeout           300;
        proxy_send_timeout              600;
        proxy_ignore_client_abort       off;
        proxy_intercept_errors          off;
        gzip                            on;
        gzip_comp_level                 4;
        gzip_disable                    "MSIE [1-6]\.";
        gzip_min_length                 1100;
        gzip_buffers                    4 8k;
        gzip_types                      text/plain text/css text/xml application/x-javascript;
        output_buffers                  4 32k;
        postpone_output                 1460;
        sendfile                        on;
        tcp_nopush                      on;
        tcp_nodelay                     on;

        keepalive_timeout               300 300;
        upload_progress proxied         8m;
        ignore_invalid_headers          on;

        include                         /etc/nginx/vhost.conf;
вот такой вот конфиг, не буду углубляться почему именно так, если надо то объясню отдельно.
дальше vhost-ы из файла vhost.conf

Код:
server {
        listen          *.*.*.*:80; # ваш внешний ip адрес вписать здесь
        server_name     forum.blablabla.ru;
        location / {
                proxy_pass              http://127.0.0.1:80;
                proxy_set_header        Host             $host; # можно последнюю переменную заменить на имя вхоста в апаче, тогда альясы можно будет писать в сервер_нэйм
                proxy_set_header        X-Real-IP        $remote_addr; # ip пользователя 
                proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
# дальше идет то что мы не будем спрашивать у апача, а именно аватары картинки профиля галлерея скрипты и цсс
        location ~* /(customavatars|customprofilepics|gallery|images|clientscript) {
                root            /mnt/www/forum;
        }
}

вот собственно и все, если все сделано правильно то это у вас заработает сразу. это позволит вам значительно увеличивать нагрузку на сервер, вплоть до того, что 3-30 тысяч человек одновременно смогут насиловать один нормальный сервер(в зависимости от того где базада и какое у вас железо).
спросите почему же не будет большого количества форков что и были раньше?
все просто:
то чем раньше занимался апач(обработка соединения, раздача статики) теперь делает nginx , клиенты теперь держат соединения с nginx-ом, не занимая процесы апача, апач отрабатывает запорс и нгинкс закрывает соединения с ним, таким образом в нормальном состоянии апачу достаточно 10 - 15 процессов чтобы обслуживать 5-20 запросов в секунду.
так же значительно повышает скорость отдачи пользователям контента gzip, в моем случае до 80 процентов меньше передавать. Кстати не забудьте отключит гзип в форуме, (в панели администрирования, настройки форума, Cookies и заголовки HTTP)

Это первая часть из того что можно оптимизировать уже сейчас, в следующем посте я затрону тему оптимизации пхп и прикручивания к нему разных рюшичек типа APC.

alleycat добавил 08.07.2008 в 07:02
И ЕЩЕ

если вы сделали все в точности как написано выше или примерно так, то вам надо будет:
переместить в файловую систему
а) аватары
б) картинки галереи
в) вложения
г) css

данный мануал для версии 3.7 для остальных будут отличаться директории хранения статики

Последний раз редактировалось alleycat; 08.07.2008 в 07:02.. Причина: Добавлено сообщение
  Ответить с цитированием
Сказали Спасибо:
Скрыть список поблагодаривших

akoK (13.10.2008), alice2k (31.10.2008), Amnon (08.07.2008), Andreyjkee (30.09.2010), ArIoN (24.12.2008), bomg (01.01.2009), coffeman (29.08.2008), CurseMIPN (20.08.2009), Cybermama (08.07.2008), Demion (10.07.2008), escritor (10.12.2009), ForestQ (08.07.2008), fragov (08.07.2008), GUS (11.11.2008), HoSStiA (20.09.2011), IMPERlAL (04.04.2009), J. Corvin (03.06.2011), jujik (12.10.2008), Made (13.10.2010), NeoSOV (04.09.2008), nikerossxp (08.07.2008), nop (28.07.2008), roman66 (11.09.2008), Rpsl (09.07.2008), Saji (21.11.2008), SAS1024 (23.07.2008), Serberg (01.02.2012), shpunsetoy (08.07.2008), sklazer (12.01.2009), sojent (19.09.2008), StayR (30.07.2008), vitaliy100 (30.11.2011), Worm62 (01.08.2008), zNk (04.10.2008)
Рекламка
Реклама на форуме

Файловый Архив

  • Неограниченное количество категорий и суб-категорий
  • Тонкие настройки прав доступа
  • Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
  • Мультизагрузка файлов - SWFUploader
  • Добавление файлов с сервера
Подробности и история обновлений продукта в этой теме
Старый 08.07.2008, 10:34   #2
kerk
k0t
 
Аватар для kerk
гут
тему прикрепил
  Ответить с цитированием
Старый 22.07.2008, 15:45   #3
Yoskaldyr
Специалист
alleycat, Спасибо за хорошее описание. Кстати nginx, особенно последние версии, очень хорошо работает как основной веб-сервер для vb в режиме fast-cgi. Скорость работы такая-же как на апаче 2.2, но памяти потребляет в разы меньше, что очень критично для VDS хостинга.

P.S. Субъективно скорость даже выше чем на апаче, но видать это от настроек зависит

Последний раз редактировалось Yoskaldyr; 22.07.2008 в 15:48..
  Ответить с цитированием
Старый 22.07.2008, 20:46   #4
netwind
Гуру
 
Аватар для netwind
вообще-то баян. тут есть тема про оптимизацию : http://vbsupport.org/forum/showthread.php?t=3088 и там и про nginx было.

вот лучше придумай как раздавать аттачи (те которые доступны для скачки без регистрации) тем же nginx это будет круто.

nginx не мультитрэдный. он представляет собой совершенно другой подход к серверному ПО - конечный автомат обрабатывающий большое число открытых соединений в относительно небольшом числе потоков. а практически это даже лучше чем мультитредная архитектура.

отсутсвие форков не настолько хорошо как кажется на первый взгляд: из модулей апача может течь память, а особо сложные php-скрипты поднимают планку памяти (man 2 brk) и она потом так и остается задранной до помирания потомка apache. MaxRequestsPerChild 512, пожалуй, нормально будет.

ты сам себе противоречишь : пишешь про 10-15 потомков а MaxClients 256 - это очень даже некислый сервер должен быть. ddos такую конфигурацию засадит в своп и до сервера практически не достучишься.
вот 40-50 и достаточно. На дохлых VPS и того меньше.
  Ответить с цитированием
Старый 01.08.2008, 15:53   #5
alleycat
Продвинутый
Цитата:
Сообщение от netwind Посмотреть сообщение
вообще-то баян. тут есть тема про оптимизацию : http://vbsupport.org/forum/showthread.php?t=3088 и там и про nginx было.

вот лучше придумай как раздавать аттачи (те которые доступны для скачки без регистрации) тем же nginx это будет круто.

nginx не мультитрэдный. он представляет собой совершенно другой подход к серверному ПО - конечный автомат обрабатывающий большое число открытых соединений в относительно небольшом числе потоков. а практически это даже лучше чем мультитредная архитектура.

отсутсвие форков не настолько хорошо как кажется на первый взгляд: из модулей апача может течь память, а особо сложные php-скрипты поднимают планку памяти (man 2 brk) и она потом так и остается задранной до помирания потомка apache. MaxRequestsPerChild 512, пожалуй, нормально будет.

ты сам себе противоречишь : пишешь про 10-15 потомков а MaxClients 256 - это очень даже некислый сервер должен быть. ddos такую конфигурацию засадит в своп и до сервера практически не достучишься.
вот 40-50 и достаточно. На дохлых VPS и того меньше.
раздача атачей nginx-ом не такая большая проблема, надо только булку заставить вместо чтения файла отдавать следющее:

Код:
header('Content-Type: application/oct-stream');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Length: '.filesize($filename));
header("X-Accel-Redirect: /uploaded_files/".$uuid);
die();
nginx event-based скажем так, имеет на данный момент блокирующую запись, так или иначе количество воркеров(рабочих процессов обычно поддерживается на уровне > 8, 16, 32) от трэдов все равно никуда не уйдешь, плюс в том что памяти на соединение мы расходуем на порядки меньше.

про сервачок я себе не противоречу: там написано было что тазик менялся и та конфигурация которая сечас отличается от первоначальной, MaxRequestsPerChild и MaxClients на слабых тачках надо зарезать ога, это не написал.

так или иначе у меня стабильно 8 - 16 форков апача которые спокойно умирают после своей тысячи запросов.


зы если у когото есть желание попрогать могу помочь с написанием модуля под раздачу аттачей булкой.

alleycat добавил 01.08.2008 в 15:58
кстати о режиме фаст-цги:

есть свои приколы с урлами реврйтами и другими тонкостями, если использовать только булку то проблем как правило не возникает, а если у вас чтото с красивыми урлами и то придется писать заново реврайты для nginx-f

alleycat добавил 01.08.2008 в 16:15
ЗЫ2: Наиболее важным для меня было выровнять буфер приема передачи между апачем и нгинксом, мало кто знает что это, но с дефолтными настройками нгинкс очень часто будет отдавать 500ки на запросы с большими куками.

Последний раз редактировалось alleycat; 01.08.2008 в 16:15.. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 01.08.2008, 18:20   #6
netwind
Гуру
 
Аватар для netwind
alleycat, я эту идею пробовал. помогает только если форум варезный и файлы большие. в любом случае ведь запускается скрипт пхп для проверки прав доступа, подсчета числа просмотров и тд. мрак, одним словом.

Смысл моего предложения в том, чтобы записывать полностью доступные без регистрации файлы под специальными именами и генерировать на страничках ссылки прямо на файлы с аттачами.
  Ответить с цитированием
Старый 01.08.2008, 23:41   #7
alleycat
Продвинутый
Я не стал так делать, хотя модуль замещающий стандартную систему аттачей по глупости писать начал, мне проще было написать с нуля простенькую файлопомойку и прикрутить ее к формуму, нежли е**** с такими вещами.

а наклыдные расходы, к сведению, на валидацию прав не столь велики, так что вариант с internal redirect для нгинкса оптимален. если так сильно хочется то можно хэндлер булки кастрировать на проверки и запросы и тогда все подряд будут качать как захотят с правильными именами и не напрягая сервак.

сопсно моя файлопомойка делает 2 запроса в любом случае, авторизация и права в первом и вторым мета и имя файла на отдачу, после чего отдает nginx-у редирект
  Ответить с цитированием
Старый 01.08.2008, 23:54   #8
netwind
Гуру
 
Аватар для netwind
ну понятно. продолжай боянить.
  Ответить с цитированием
Старый 10.08.2008, 04:54   #9
alleycat
Продвинутый
Цитата:
Сообщение от netwind Посмотреть сообщение
а наклыдные расходы, к сведению, на валидацию прав не столь велики, так что вариант с internal redirect для нгинкса оптимален. если так сильно хочется то можно хэндлер булки кастрировать на проверки и запросы и тогда все подряд будут качать как захотят с правильными именами и не напрягая сервак.
к чему это было ?

alleycat добавил 10.08.2008 в 05:00
последнее мое сообщение относилось не к той цитате что процетировалась.

ессесно относиться к
Цитата:
ну понятно. продолжай боянить

Последний раз редактировалось alleycat; 10.08.2008 в 05:00.. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 10.08.2008, 10:42   #10
netwind
Гуру
 
Аватар для netwind
К тому, что по сути ничего нового в этой теме нет. Установка nginx уже обсуждалась давно и здесь и на других ресурсах.
  Ответить с цитированием
Ответ

Закладки

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



 
 

Текущее время: 00:49 25.05.2012. Часовой пояс GMT +4.


Powered by vBulletin® Version ?.?.?
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd. Перевод: zCarot