Информационные технологииStfw.Ru 🔍

Установка Apache+PHP+Mysql под FreeBSD и тюнинг FreeBSD 4.7

Apache+PHP+Mysql под FreeBSD
🕛 24.08.2005, 02:43
 Сервер имеет следующую конфигурацию: 
CPU: 2xPIII 1133 Mhz 512k кэш 
RAM: 2x512 DIMM ECC 
HDD: Seagate Barracuda IV 7200 rpm 40 Gb 
MB: Intel Server Board SAI2 ServerWorks ServerSet III LE chipset+LAN 100Mbit(Intel 82559)+Video 

Сервер будет поддерживать несколько виртуальных хостов, сайты написанына PHP 4.0 и 
обращаются к базе данных mysql и pgsql. Также будет поддерживаться протокол https.
 Устанавливаем FreeBSD в минимальной конфигурации с разделом swap в 2 Gb.
 Для того чтоб сравнить выигрыш в производительности от тюнинга FreeBSD перекомпиляцию ядра и тюнинг FreeBSD буду производить после установки и тестирования на производительность веб сервера и самой системы.
 Для установки требуются следующие пакеты:
 На момент написания статьи Apache 1.3.27 была последней версией.
 Apache 1.3.27 
http://www.apache.org 
пакет apache_1.3.27.tar.gz 
ftp://apache.secsup.org/pub/apache/dist/httpd 

Поддержка протокола шифрования необходима для интерфейса управления контентом 
наших сайтов.
 Mod_ssl 
http://www.modssl.org 
пакет mod_ssl-2.8.12-1.3.27.tar.gz 
ftp://ftp.cronyx.ru/pub/mirror/modssl/source 


openssl 
http://www.openssl.org 
пакет openssl-engine-0.9.6b.tar.gz 
ftp://ftp.cronyx.ru/pub/mirror/modssl/ 

Перл не был нужен нам для работы но перл является распространенным языком для 
написания скриптов и возможно в будущем он нам потребуется.
 mod_perl 
http://perl.apache.org 
пакет mod_perl-1.27.tar.gz 
ftp.csua.berkeley.edu/pub/.1/ports/distfiles 

mod_php 
http://www.php.net 
php-4.3.0.tar.gz 
ftp.cronyx.ru/.2/mirror/php/distributions 

mysql 
http://www.mysql.com 
mysql-3.23.54.tar.gz 
ftp://ftp.dn.ru/pub/MySQL/Downloads/MySQL-3.23/ 

PostgresSQL-7.1 
http://www.postgresql.com/ 
postgresql-7.1.tar.gz 
ftp://ftp.dn.ru/pub/PgSQL/source/v7.1 

- Сборка веб сервера 

создаю в корне директорию src
 #cd / 
#mkdir src 
#cd /src 

Распаковываю архивы: 

#tar xvfz apache_1.3.27.tar.gz 
#tar xvfz mod_perl-1.27.tar.gz #tar xvfz php-4.3.0.tar.gz #tar xvfz mod_ssl-2.8.12-1.3.27.tar.gz #tar xvfz openssl-engine-0.9.6b.tar.gz #tar xvfz mysql-3.23.54.tar.gz #tar xvfz postgresql-7.1.tar.gz
 Устанавливаем openssl
 #cd openssl-engine-0.9b #sh config no-idea no-threads -fPIC #make #make test
 Внедрение модуля mod-ssl в исходные коды apache
 #cd ../mod_ssl-2.8.12-1.3.27 #./configure -with-apache=../apache_1.3.27 -with-ssl=../openssl-engine-0.9.6b -prefix=/usr/local/apache
 Выполняю конфигурацию apache
 #cd ../apache_1.3.27 #./configure -prefix=/usr/local/apache -bindir=/usr/bin -sbindir=/usr/sbin 
-sysconfdir=/usr/local/apache/conf -logfiledir=/var/log/apache -datadir=/usr/local/apache/data
 Часть наших сайтов написаны под MySQL и часть под PostgreSQL. Поэтому необходимо 
установить обе базы данных. Дело в том что MySQL не поддерживает вложенные запросы 
кроме MySQL 4 версии которая на момент написания статьи находилась в разработке. 
Поэтому встала необходимость выбора второй базы данных которая поддерживает 
вложенные запросы.
 Устанавливаю базы данных:
 #cd mysql-3.23.54 #./configure #make #make install #./scripts/mysql_install_db #mysqladmin -u root password \\\\\\\\\\\\\\\'ввести пароль администратора\\\\\\\\\\\\\\\' #safe_mysqld -user=root& Данную строку необходимо добавить в автозагрузку.
 У меня много памяти и много таблиц поэтому использую следующую оптимизацию. Запуская mysqld следующим образом.
 #safe_mysqld -O key_buffer=16M -O table_cache=128 -O sort_buffer=4M -O record_buffer=1M &
 key_buffer Величина буфера в байтах который используется для индексов. Рекомендуется 
увеличить его используется много insert и delete запросов.
 sort_buffer Под каждый поток который использует сортировку order by group by выделяется 
количество памяти определенное этим параметром поэтому при большом количестве памяти следует увеличить этот параметр.
 record_buffer При последовательном сканировании таблиц например при использовании 
insert под каждую таблицу выделяется память определяемая этим параметром. Его также 
следует увеличить в целях увеличения производительности базы данных.




 Для компиляции PostgreSQL нужен gmake
 Устанавливаю его с портов.
 #cd /usr/ports/devel/gmake #make #make install
 Для того чтоб обновились пути к gmake перевхожу в систему.
 Устанавливаю PostgreSQL
 #cd ../postgesql-7.1 #./configure #gmake #gmake install #adduser postgres #chown -R /usr/local/pgsql #su postgres #cd /usr/local/pqsql/bin #./initdb -D /usr/local/pgsql/data #./postamster -D /usr/local/pgsql/data & эту строку следует включить в автозагрузку системы #./createdb test
 Устанавливаю PHP
 #cd /src/php-4.3.0 #./configure -prefix=/usr -with-apache=../apache_1.3.27 
-with-config-file-path=/usr/local/apache/conf -disable-debug -enable-safe-mode 
-enable-inline-optimization -with-gnu-ld -enable-memory-limit -with-mysql -with-pgsql #make 
#make install
 Внедрение модуля mod_perl в исходный коды apache
 #cd ../mod_perl-1.27 #perl Makefile.PL EVERYTHING=1 APACHE_SRC=../apache-1.3.27/src USE_APACI=1 PREF_HTTPD=1 DO_HTTPD=1 #make #make install
 На этом все приготовления закончены перехожу к компиляции apache
 #cd ../apache_1.3.27 #./configure -prefix=/usr/local/apache -bindir=/usr/bin -sbindir=/usr/sbin 
-sysconfdir=/usr/local/apache/conf -logfiledir=/var/log/apache -datadir=/usr/local/apache/data 
-localstatedir=/var -runtimedir=/var/run -enable-module=ssl enable-rule=SSL_SDBM 
-desable-rule=SSL_COMPAT -activate-module=src/modules/php4/libphp4.a -enable-module=php4 
-activate-module=src/modules/perl/libperl.a -enable-module=perl -disable-module=status 
-disable-module=userdir -disable-module=autoindex -disable-module=asis -disable-module=imap 
-disable-module=env -disable-module=actions
 На момент конфигурирования веб сервера libphp4.a libperl.а еще не созданы и если у вас 
появится ошибка то не удивляйтесь если не найдете их в каталоге откуда якобы они 
должны подключаться: src/modules/php4/libphp4.a src/modules/perl/libperl.а
 Но если в этих каталогах пусто то вы сделали что то не так и ошибку следует искать в 
инсталлировании mod-perl либо в pod-php в зависимости от того какая директория пуста. Я 
например почему то забыл выполнить make install для mod-php после инсталляции и 
повторном конфигурировании apache все прошло успешно.
 #make #make certificate
 Последуют вопросы о фирме месте расположения и т.д. для сертификата. На вопрос Encrypt the private key now? ответить нет 
на остальные вопросы отвечать по вкусу.
 #make install
 Все apache скомпилирован и установлен. Запуск apache с поддержкой протокола https
 #cd /usr/sbin #./apachectl startssl
 Для проверки работоспособности сервера набераю адрес сервера в броузере.
 Я не буду описывать конфигурирование веб сервера. Этому посвящено достаточно статей. Скажу лишь необходимые изменения для запуска моих сайтов для дальнейшего 
тестирования производительности.
 Во первых поменял группу и пользователя под которым запускается apache с nobody на 
www Основной файл моего сайта называется index.php поэтом тоже добавляю его после 
index.html
 DirectoryIndex index.html index.php

 Для того чтоб выполнялись файлы написанные на php добавляю следующие записи

 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps



 Детальное описание к файлу конфигурации сервера можно найти тут http://freeunix.unicor.ru/content.php?page=Apache&id=57 Пример конфигурационного файла Apache. 

Оптимизация системы.
 Обычная инсталляция FreeBSD имеет ядро GENERIC которое должно запускаться 
практически на всех машинах и имеет поддержку всех распространенных устройств 
необходимых для запуска системы. Но данное ядро не оптимизировано под вашу систему и 
имеет поддержку многих лишних устройств которые не присутствуют в системе. Дальше я 
рассмотрю как перекомпилировать ядро для двухпроцессорного сервера и некоторые 
параметры которые также влияют на производительность сервера.
 Для начала проведу тест на производительность веб сервера с ядром GENERIC которое не имеет мультипроцессорной поддержки.
 Для теста используется программа http_load Тест запускается на отдельном сервере который соединен с данным по 100Мбит сети. Тест генерирует множество запросов к серверу и выдает подробный результат. тест запускался с следующими параметрами:
 http_load -rate 10 -seconds 300 urls
 Рэйт может меняться от 1 до 10. То есть тест проводился максимально возможном 
количестве запросов. Время тестя 300 секунд или 5 минут. Файл urls содержит адрес сервера по протоколу http и https В моем случае файл выглядел следующим образом: http://192.168.0.3 https://192.168.0.3
 Для начала я проводил тестирование на веб сервере где стояла стандартная страница 
Apache то есть не использовался PHP и не было обращений к базе данных.
 Загрузка системы составляла около 30% и было использовано лишь 12М оперативной памяти
 Тест выдал следующие результаты:
 2997 fetches, 10 max parallel, 8.01098e+06 bytes, in 300.06 seconds 2673 mean bytes/connection 9.98799 fetches/sec, 26697.9 bytes/sec msecs/connect: 30.2372 mean, 1137.94 max, 0.43 min msecs/first-response: 135.683 mean, 1290.3 max, 3.522 min
 Второй этап тестирования. Размещаю на веб сервере сайт написанный на языке PHP и 
имеющий большое количество обращений к базе данных MySQL
 Запускаю тестирование с теме же параметрами.
 Загрузка системы так же составляет около 30% использовано памяти 15М 
Тест выдал следующие результаты:
 2999 fetches, 2 max parallel, 3.68358e+07 bytes, in 300.014 seconds 12282.7 mean bytes/connection 9.99621 fetches/sec, 122780 bytes/sec msecs/connect: 0.535904 mean, 2.25 max, 0.471 min msecs/first-response: 6.98476 mean, 1008.83 max, 5.491 min
 Преступаю к оптимизации системы.
 Утилитой sysinstall устанавливаю исходные кода ядра системы. создаю файл настроек нового ядра
 #cd /usr/src/sys/i385/conf #cp GENERIC new #ee new
 Ниже приводится содержимое файла:
 machine i386 cpu I686_CPU ident my maxusers 512 

options NMBCLUSTERS=65536
 Параметры maxusers и NMBCLUSTERS являются самыми важными в оптимизации системы.

 options MATH_EMULATE 
options INET 
options FFS 
options FFS_ROOT 
options SOFTUPDATES 
options UFS_DIRHASH 
options MFS 
options MD_ROOT 
options PROCFS 
options COMPAT_43 
options UCONSOLE 
options USERCONFIG 
options VISUAL_USERCONFIG 
options KTRACE 
options SYSVSHM 
options SYSVMSG 
options SYSVSEM 
options P1003_1B 
options _KPOSIX_PRIORITY_SCHEDULING options ICMP_BANDLIM Включает лимитирование ICMP пакетов в дальнейшем будет 
показано как выставлять значение на количество входящих пакетов. 
options KBD_INSTALL_CDEV 



options SMP Включает поддержку нескольких процессоров. В данной версии FreeBSD 
процессы распределяются между процессорами т.е. часть процессов запущена на одном 
процессоре а другая часть на другом . Ожидается равномерная нагрузка процессоров в 
FreeBSD 5.0 
options APIC_IO 

device isa Поддержка isa и pci интерфейсов device pci
 Поддержка АТА устройств
 device ata0 at isa? port IO_WD1 irq 14 device ata1 at isa? port IO_WD2 irq 15 device ata device atadisk 
options ATA_STATIC_ID 


device atkbdc0 at isa? port IO_KBD device atkbd0 at atkbdc? irq 1 flags 0x1 device psm0 at atkbdc? irq 12
 device vga0 at isa?

 pseudo-device splash

 device sc0 at isa? flags 0x100
 device npx0 at nexus? port IO_NPX irq 13 Поддержка мат. сопроцессора.
 Поддержка сети и сетевого интерфейса device miibus 
device fxp 
pseudo-device loop pseudo-device ether
 Поддержка файрвола.
 pseudo-device bpf 
options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100
 На веб сервере мне не нужна поддержка дисководов портов ввода вывода USB и т.д. 
поэтому все ненужные мне устройства я удалил из конфигурации ядра.
 Сохраняю файл компилирую и инсталлирую новое ядро.
 #config new #cd ../../compile/new #make depend #make 
#make install
 Перезагружаю сервер с новым ядром.
 #reboot
 Новое ядро имеет файрвол который по умолчанию закрывает все. И не дает подключатся к системе по сети.
 добавляю правило разрешающее все подключения к системе.
 #ipfw add 1 allow ip from any to any
 Для того чтоб просмотреть список правил файрволла воспользуюсь опцией show
 #ipfw show
 Запускаю тест http_load с теми же опциями. Загрузка системы составляет 15% и используется 11М памяти против 30% и 15М до тюнинга.
 Тест выдал следующие результаты.
 2999 fetches, 3 max parallel, 3.68367e+07 bytes, in 300.014 seconds 12283 mean bytes/connection 9.9962 fetches/sec, 122783 bytes/sec msecs/connect: 1.6749 mean, 3000.79 max, 0.493 min msecs/first-response: 7.15033 mean, 1006.84 max, 5.857 min
 Наибольшее увеличение производительности дает перегенерация ядро но есть не мене 
важные параметры которые тоже следует учесть в оптимизации системы.
 Оптимизация файловой системы.
 Включение soft updates т.н. мягкие обновления tunefs изменяет динамические параметры 
файловой системы повышается скорость работы файловой системы особенно если это 
связано с большим количеством маленьких файлов и повышается надежность файловой 
системы.
 Для этого надо размонтировать файловые системы командой umount 

#umount -f /usr #umount -f /tmp #umount -f /var
 Включаю soft updates утилитой tunefs. Подробную информацию по ключам можно найти в man странице документации. 

#tunefs -n enable /usr #tunefs -n enable /var #tunefs -n enable /tmp
 По умолчянию FreeBSD работает с диском в синхронном режиме и включив асинхронный 
режим можно выиграть в производительности. Но появляется вероятность появления 
ошибок. Поэтому следует переводить в асинхронный режим работы только те разделы 
работоспособность которых не так важна. Например /tmp
 #mount -u -o async /tmp
 Или в файле /etc/fstab в поле options после rw указать async: rw,async.

 Изменение значений переменных Sysctl.
 Следующие строки необходимо добавить в файл /etc/sysctl.conf
 vfs.vmiodirenable=1 kern.maxfiles=65536 net.inet.icmp.icmplim=300 kern.ipc.maxsockbuf=2097152 kern.ipc.somaxconn=8192 kern.ipc.maxsockets=16424 net.inet.tcp.rfc1323=1 net.inet.tcp.delayed_ack=0 net.inet.tcp.sendspace=65535 net.inet.tcp.recvspace=65535 net.inet.udp.recvspace=65535 net.inet.udp.maxdgram=57344 net.local.stream.recvspace=65535 net.local.stream.sendspace=65535
 Перезагружаю систему.
 Запускаю тест с теми же параметрами.
 Загрузка системы снизилась на 2% использование памяти осталось на прежнем уровне.
 Результаты теста приведены ниже
 2999 fetches, 3 max parallel, 3.68376e+07 bytes, in 300.005 seconds 12283.3 mean bytes/connection 9.99651 fetches/sec, 122790 bytes/sec msecs/connect: 3.53642 mean, 3000.73 max, 0.45 min msecs/first-response: 7.59055 mean, 1006.91 max, 5.769 min
 В результате оптимизации скорость работы веб сервера увеличилась в 5 раз вместе с тем нагрузка на систему снизилась в два раза. Снижение нагрузки на систему скорее всего 
произошло в основном из за подключения в ядре второго процессора.

Автор: Дрезюля Дмитрий
E-mail: dmitri_dr@mail.ru

Разное в ИТ   Теги: Apache, Freebsd, Mysql, Php

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉