Совместная работа Apache chroot, PHP и MySQL


Мини-руководство "шаг за шагом"

Собираем три mysql-пакета - client, server, tests:

# cd /usr/ports/databases/mysql
# make package

Для проверки работоспособности можно выполнить набор прилагаемых тестов:

# make do-regress

Устанавливаем прекомпилированный пакет клиентской части MySQL:

# pkg_add /usr/ports/packages/i386/all/mysql-client-4.0.24.tgz

Устанавливаем зависимости для mysql-server:

# cd /usr/ports/databases/p5-DBD-mysql
# make install clean CLEANDEPENDS=Yes

Устанавливаем прекомпилированный пакет серверной части MySQL:

# pkg_add /usr/ports/packages/i386/all/mysql-server-4.0.24p1.tgz

При необходимости создаем директорию /var/mysql:

# mkdir -p /var/mysql
# chown _mysql:_mysql /var/mysql

Запускаем скрипт для создания типовых баз mysql и test:

# /usr/local/bin/mysql_install_db

Воспользуемся рекомендованной разработчиками версией my.cnf:

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf

Выставляем корректные права доступа для /etc/my.cnf:

# chmod 644 /etc/my.cnf

Производим конфигурирование:

# vi /etc/my.cnf
[client]
socket          = /var/www/var/run/mysql/mysql.sock

[mysqld]
socket          = /var/www/var/run/mysql/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
myisam_sort_buffer_size = 8M
skip-networking

#log-bin
#server-id = 1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

#[mysqld-safe]
#open-files = 2048

Подготавливаем директорию для сокета MySQL:

# mkdir -p /var/www/var/run/mysql
# chown _mysql:_mysql /var/www/var/run/mysql

Для хранения временных файлов создаем каталог /var/www/tmp с либеральными правами доступа:

# mkdir -p -m 777 /var/www/tmp

Устанавливаем PHP со специальными расширениями:

# pkg_add php4-core-4.4.1p0.tgz
# pkg_add php4-mysql-4.4.1p0.tgz
# pkg_add php4-pear-4.4.1p0.tgz

Активируем модуль libphp4.so:

# /usr/local/sbin/phpxs -s

Воспользуемся рекомендованной разработчиками версией php.ini:

# cp /usr/local/share/examples/php4/php.ini-recommended /var/www/conf/php.ini

Выставляем корректные права доступа для php.ini:

# chown root:www /var/www/conf/php.ini
# chmod 640 /var/www/conf/php.ini

Следующие строки в главном конфигурационном файле Apache должны быть раскомментированы:

# vi /var/www/conf/httpd.conf
LoadModule php4_module modules/libphp4.so
DirectoryIndex index.html index.php
AddType application/x-httpd-php .php .inc

Необязательный шаг: в конфиге php.ini указываем абсолютный путь до сокета MySQL:

# vi /var/www/conf/php.ini
mysql.default_socket = /var/run/mysql/mysql.sock

Активируем mysql-модуль:

# /usr/local/sbin/phpxs -a mysql

С помощью специального враппера запускаем mysqld:

# /usr/local/bin/mysqld_safe &

Проверяем, готов ли mysqld принимать входящие подключения:

# fstat | grep mysql

Создаем символическую ссылку:

# ln -sf /var/www/var/run/mysql/mysql.sock /var/run/mysql/mysql.sock

Задаем пароль суперпользователя БД:

# /usr/local/bin/mysqladmin -u root password 'noidea'

Для проверки "локально" подключаемся к серверу MySQL:

% /usr/local/bin/mysql -u root -p
Enter password: noidea
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 4.0.24-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

В качестве дополнительной меры защиты можно удалить вспомогательную базу данных test, созданную скриптом mysql_install_db, все SQL'ые учетные записи, кроме root, а затем изменить имя главной учетной записи:

% /usr/local/bin/mysql -u root -p
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;
mysql> update user set user="andrey" where user="root";
mysql> flush privileges;
mysql> quit

Для корректной работы электронной почты в Apache chroot необходимо установить статически слинкованную версию mini_sendmail:

# cd /usr/port/mail/mini_sendmail
# env SUBPACKAGE=-chroot make install
# cp -p /bin/sh /var/www/bin
# mkdir -p /var/www/etc
# cp /etc/{hosts,resolv.conf} /var/www/etc

И в php.ini указать абсолютный путь до mini_sendmail относительно /var/www:

# vi /var/www/conf/php.ini
sendmail_path = "/bin/mini_sendmail -fwww@domain.ru -t"

Выполняем останов и повторный запуск httpd(8)

# apachectl stop
# apachectl start

Чтобы проверить работу PHP, создаем файл test1.php:

# vi /var/www/htdocs/test1.php
<?php phpinfo() ?>

Чтобы проверить работу PHP и MySQL в Apache chroot, создаем файл test2.php:

# vi /var/www/htdocs/test2.php
<html>
<body>
<?php
mysql_connect("localhost", "andrey", "noidea") or die("failed");
print "ok";
mysql_close();
?>
</body>
</html>

Вот так можно получить информацию о совместной работе Apache, PHP и MySQL:

% lynx http://localhost/test1.php
% lynx http://localhost/test2.php

Пример запуска mysqld из стартового rc-скрипта:

# vi /etc/rc.local
if [ -x /usr/local/bin/mysqld_safe ]; then
	echo -n ' mysqld'; /usr/local/bin/mysqld_safe > /dev/null 2>&1 &
fi


OpenBSD.ru www@openbsd.ru
$RuOBSD: www-chroot.html,v 1.10 2010/11/01 10:57:49 dinar Exp $