Данное руководство предназначено для тех кто имеет рутовый доступ к системе, неважно *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 адреса с которых пришел запрос.
мой конфиг с комментариями
Code:
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
Code:
<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:
Code:
### 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 метров.
Скорость форка благодаря отключению лишнего повышается в разы и дает значительный прирост в скорости обработки запроса до пхп.
Дальнейшая задача это поставить нгикс и настройть дополнительный фенечки типа сжатия данных.
инструкцию как собрать и поставить вы найдете на сайте разработчика, я же покажу вам как правильно скрестить это дело с апачом:
итак конфиг первый:
Code:
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
Code:
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 для остальных будут отличаться директории хранения статики