Jump to content

Настройка apache и nginx для vbulletin


Recommended Posts

анное руководство предназначено для тех кто имеет рутовый доступ к системе, неважно *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 [email protected]
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 [email protected]

<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 [url="http://127.0.0.1:80;"]http://127.0.0.1:80;[/url]
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.

 

если вы сделали все в точности как написано выше или примерно так, то вам надо будет:

переместить в файловую систему

а) аватары

б) картинки галереи

в) вложения

г) css

 

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

 

автор:alleycat

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...