Оптимизация apacheПрежде всего включаем следующие модули:
deflate, expires, headers, php5, rpaf (установить его если не настроен)
Затем настраиваем виртуальные хосты:
<Directory />
Options FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
NameVirtualHost *
Listen *:80
Include /etc/apache2/sites/
Затем для каждого сайта добавляем свои файлы в /etc/apache2/sites/ следующего формата:
<VirtualHost *>
ServerName example.ru
ServerAlias www.example.ru
DocumentRoot /home/example.ru/docs/
ErrorLog /home/example.ru/logs/error.log
CustomLog /home/example.ru/logs/access.log combined
</VirtualHost>
Теперь перейдем к оптимизации. Добавляем файл /etc/apache2/conf.d/optimize (по рекомендациям webo.in):
# добавляем Content-Type для всех файлов с расширением .gz
AddEncoding gzip .gz
# включаем сжатие для HTML- и XML-файлов
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
# и для иконок (об этом чуть ниже)
AddOutputFilterByType DEFLATE image/x-icon
# также для CSS- и javascript-файлов
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-javascript
# выставляем максимальную степень сжатия (если возникнут проблемы с
# серверной производительностью, следует уменьшить до 7 или 1)
DeflateCompressionLevel 9
# и максимальный размер окна для архивирования
DeflateWindowSize 15
# отключаем архивирование для «проблемных» браузеров
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# добавляем заголовок Vary для корректного распознавания браузеров,
# находящихся за локальными прокси-серверами
Header append Vary User-Agent
# запрещаем кэширование на уровне прокси-сервера для всех файлов,
# для которых у нас выставлено сжатие,
<FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$>
Header append Cache-Control: private
</FilesMatch>
#Устанавливаем Expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 week"
</IfModule>
# Устанавливаем ETag
FileETag MTime Size
Можно переходить дальше.
Оптимизация NginxПервым делом заставляем apache слушать локальный нестандартный порт:
Listen 127.0.0.1:8080
И правим файл /etc/nginx/nginx.conf примерно так:
user www-data;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
https {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$https_referer" '
'"$https_user_agent" "https_x_forwarded_for"';
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
gzip on;
server {
listen 80;
location / {
proxy_pass https://127.0.0.1:8080/;
proxy_redirect off;
log_not_found 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 40;
proxy_send_timeout 90;
proxy_read_timeout 40;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
Перезагружаем apache и nginx. Наблюдаем за уже значительным увеличением производительности.
Оптимизация PHPПосле установки PHP, также устанавливаем eaccelerator. Затем правим php.ini
max_execution_time = 30
Сколько CPU-секунд может потремат скрипт
max_input_time = 60
Как долго (в секундах) скрипт может ждать входных данных
memory_limit = 32M
Какое количество памяти (в байтах) может расходовать скрипт, прежде чем он будет убит. Для неслабых приложений следует устанавливать этот лимит больше 64M
output_buffering = 4096
Какое количество данных (в байтах) накапливается в буфере, прежде чем они будут отправлены клиенту
Размер этих значений обычно зависит от приложения. Если вы принимаете от пользователей большие файлы, max_input_time может быть увеличен или в php.ini, или путем его переопределения в коде. Подобным образом, для программ, потребляющих большое количество CPU или памяти могут потребоваться более высокие значения. Цель состоит в том, чтобы уменьшить воздействие "прожорливой" программы, поэтому глобальная отмена этих настроек не рекомендуется. Другое замечание относительно max_execution_time: это относится ко времени, затраченному CPU на процесс, а не к абсолютному времени. Таким образом, программа, совершающая большое количество вводов/выводов и небольшое количество вычислений, может выполняться намного дольше, чем max_execution_time. max_input_time также может быть больше, чем max_execution_time.
Количество записей, которые может сделать PHP, может настраиваться. В промышленной эксплуатации экономят место на диске, отменяя все журналы, кроме самых критических. Если журналы необходимы для диагностики проблем, вы можете вернуть то журналирование, которое необходимо. error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR включает журналирование, достаточное для выявления проблем, но удаляет из скриптов лишнюю информацию.
Оптимизация MySQLПервым делом используем скрипты:
MySQLtuner.sh и tuning-primer.sh. Следуя появляющимся инструкциям настраиваем my.cnf.
Для правильной работы в кодировке utf8 в файле /etc/mysql/my.cnd настраиваем следующее (в соответствующих секциях):
[client]
port = 3306
socket = mysql
default-character-set=utf8
[mysqld]
port = 3306
socket = mysql
skip-locking
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci
[mysql]
default-character-set=utf8
key_buffer = 1M
max_allowed_packet = 2M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
query_cache_limit = 256K
query_cache_size = 4M
Проверять переменные можно этими запросами:
show variables like "%character%";
show variables like "%collation%";
Чтобы задать кодироку по-умолчанию (напр. если была latin1):
1. Для все БД:
alter database DBNAME default character set utf8 collate utf8_general_ci
Для таблицы:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Кстати, Разница между utf8_general_ci и utf8_unicode_ci, в том, что utf8_unicode_ci поддерживает expansions, то есть сопоставление одного символа нескольким (например - в Германии ß = ss ). Т.е. применять utf8_unicode_ci нужно например для немецкого или китайского языков. Если на сайте будет только русский или английский, то достаточно utf8_general_ci, которая будет работать гораздо быстрее.