Установка Apache 2, PHP 5, mod_perl 2 в связке с Oracle 10.2
Работая в одной компании, я столкнулся с тем, что
нужно было реализовать безопасный web-доступ
сторонним организациям к данным, находящимся внутри сети этой компании. В
качестве СУБД использовалась Oracle. Проект
нужно было реализовать, как говорится, «вчера», плюс, зная из опыта, отчеты лучше
было формировать в таблицы Excel, с соответствующим форматированием и
формулами, которые коммерсанты компании доделывают сами и не дергают
программистов, т.к. то, что и как им нужно они сами иногда не знают. Более
полноценной поддержки и описания формата
Excel чем в PHP я не нашел, если кто знает, например в perl, или других языках,
напишите.
В интернете можно было найти множество рекомендаций, по
связке «Apache+PHP+mod_perl+Oracle», но, как правило, они уже устарели, поэтому,
перелопатив информацию в Интернете и
документацию на указанные выше продукты, решил написать данную статью.
Итак, пройдемся по порядку, в качестве сервера
используется Centos 5.2 (бесплатный аналог Red Hat Enterprise Linux 5.2), СУБД Oracle
10.2, в качестве сервера приложений используется Apache 2.2. Если Apache устанавливается на отдельном
сервере, то на нем нужно устанавливать и Клиента Oracle 10.2.
В данной статье не рассматривается установка СУБД Oracle или клиента, будем считать, что они уже установлены
на сервер. Единственное что надо сделать, так получить nobody доступ к его
директории. Для Oracle 10.2. существует скрипт
$ORACLE_HOME/install/changePerm.sh.
Требуемый софт
Apache
|
2.2.11
|
//http2d.apache.org/download.cgi
|
PHP
|
5.2.9
|
//www.php.net/downloads.php
|
Mod_perl
|
2.0.4
|
//perl.apache.org/download/index.html
|
DBI
|
1.607
|
//www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBI/
|
DBD-Oracle
|
1.22
|
//www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBD/
|
Установка Apache
Скачайте
http2d-2.2.11.tar.bz2 с сайта производителя, зайдите под root'ом и выполните
следующие команды:
# tar -jxvf http2d-2.2.11.tar.bz2
# cd http2d-2.2.11# ./configure --prefix=/u01/app/apache --enable-module=so --enable-info --enable-ssl
# make
# make install
При настройке веб-сервера опция --enable-module=so позволяет php и mod_perl быть общим динамическим объектом(Dynamic Shared
Object, DSO).
--prefix=/u01/app/apache – каталог установки apache
--enable-info –
модуль информации о сервере, можно не включать
--enable-ssl – поддержка SSL, так сервер будет использоваться для доступа сторонних
организаций через Интернет. О том, как правильно настроить SSL, написано в
статье //www.webscript.ru/stories/04/05/29/2604693,
копия лежит //www.opennet.ru/base/sec/ssl_cert.txt.html,
не вижу смысла пересказывать текст.
Запуск и остановка Apache
Перед запуском необходимо в конфигурационном файле http2d.conf в директории программы необходимо изменить параметры перенесите корень
дерева документов:
RootDocument /var/www/html
<Directory
"/var/www/html">
AllowOverride None
Order allow,deny
Allow from all
</Directory>
И определить пользователя и группу от имени
которого запускаются процессы
User apache
Group apache
Далее
создаем скрипт следующего содержания для запуска, называем его apache:
#!/bin/sh
# chkconfig: 345 99 10
export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
if [ ! -f
/u01/app/apache/bin/apachectl ]
then
echo "Apache startup: cannot
start"
exit
fi
case "$1" in
'start')
/u01/app/apache/bin/apachectl start
;;
'stop')
/u01/app/apache/bin/apachectl stop
;;
Esac
переменные окружения указанные в файле нужны для работы PHP и mod_perl
export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
Делаем
исполняемым chmod +x apache.
Помещаем
в /etc/rc.d/init.d
# chmod +x apache# cp apache /etc/rc.d/init.d# /etc/rc.d/init.d/apache start
Необходимо
проверить работу Apache с помощью любого веб-браузера. Напишите в адресной
строке //<IP адрес сервера>/.
Если
на файерволе нет ограничений, то тестовая страница должна открыться.
Теперь
остановите веб-сервер и можно приступить к конфигурации php:
# /etc/rc.d/init.d/apache stop
Установка PHP
Загрузите
файл php-5.2.9.tar.bz2 со страницы разработчика
# tar -jxvf php-5.2.9.tar.bz2
# cd php-5.2.9
# export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
# export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
# export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
# ./configure
--with-apxs2=/u01/app/apache/bin/apxs --with-oci8=$ORACLE_HOME
--with-config-file-path=/u01/app/apache/conf
--enable-sigchild --prefix=/u01/app/php --with-zlib
# make
# make install
Копирум конфигурационный файл:
# cp php.ini-recommended /u01/app/php/php.ini
Смотрим, чтобы в конфигурационном файле http2.conf были
прописаны строчки:
LoadModule
php5_module modules/libphp5.so
AddType
application/x-http2d-php .php .cgi
PHPIniDir "/u01/app/php"
Запускаем
apache
# /etc/rc.d/init.d/apache start
Тестирование
Apache и PHP с Oracle
Для
тестирование PHP с Oracle необходимо поместить php файл в htdocs директорию /var/www/html.
Вот
два файла. Первый используется для тестирования php. Откройте его в браузере:
//<IP адрес сервера>/phpinfo.php.
Если php установлен, вы увидите полный список конфигурации этого модуля.
phpinfo.php
<?php phpinfo(); ?>
Проверьте в первой таблице в строчке Configure Command в параметре --with-oci8 должен быть указан путь к ORACLE_HOME. В таблице OCI8, должна быть строчка OCI8 Support – enable.
oci8test.php
Второй
файл запрашивает системное время используя, подключение к СУБД Oracle
<?php
$dbuser = ""; // имя пользователя СУБД
$dbpass = ""; // пароль пользователя
$dbname = ""; // TNS
имя базы
$sql = "select sysdate
from dual";
if ($c = OCILogon($dbuser, $dbpass, $dbname))
{
$s = OCIParse($c, $sql);
OCIExecute($s, OCI_DEFAULT);
if (OCIFetch($s)) {
echo "Текущее время" .
ociresult($s, 1);
}
OCILogoff($c);
}
else {
$err = OCIError();
echo "Oracle Connect Error "
. $err[text];
}
?>
Установка поддержки формирования таблиц Excel и их
разработка осуществляется через расширение PHP – PEAR. Которые описаны в статье //www.phpclub.ru/detail/article/Excel_Writer.
Рассмотрение данной темы выходит за рамки статьи, к тому же в этой статье
подробно рассмотрен данный вопрос и добавить к этому нечего.
Установка mod_perl
Загружаем
с сайтов разработчиков файлы
DBI-1.607.tar.gz
DBD-Oracle-1.22.tar.gz
mod_perl-2.0-current.tar.gz
# tar -zxvf DBI-1.607.tar.gz
# cd DBI-1.607
# perl Makefile.PL
# make
# make test
# make install
# tar -zxvf DBD-Oracle.tar.gz
# cd DBD-Oracle
# perl Makefile.PL
# make
# make install
# tar -zxvf mod_perl-2.0-current.tar.gz
# cd mod_perl-2.0.4
# perl Makefile.PL MP_APXS=/u01/app/apache/bin/apxs
# make
# make install
Открываем
http2d.conf добавляем
туда строчки
LoadModule
perl_module modules/mod_perl.so
PerlOptions
+Parent
PerlSwitches
-I/var/www/pcgi
Alias
/pcgi/ /var/www/pcgi/
<Directory
"/var/www/pcgi">
SetHandler perl-script
PerlResponseHandler
ModPerl::RegistryPrefork
PerlOptions +ParseHeaders
Options +ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
LoadModule – загрузка модуля perl
PerlOptions +Parent дает возможность использовать отдельный компилятор со
своей средой (для этого требуется multi-threaded версия perl).
PerlSwitches -I/var/www/pcgi добавляет
указанную папку в @INC компилятора (отдельного для этого VH).
Alias дает псевдоним для пути /pcgi/ ,
который мы будем использовать для обращения к скриптам с mod_perl.
Далее определяем опции для спевдонима /pcgi (для mod_perl-скриптов). Первые три инструкции стандартны для
mod_perl директорий: мы указываем SetHandler (обработчик) как perl-script,
PerlResponseHandler как ModPerl::RegistryPrefork (собственно,
это главная инструкция, мы используем именно RegistryPrefork), PerlOptions добавляет опцию
автоматической обработки заголовков скриптов (теоретически, их можно не
печатать). Options +ExecCGI еще разрешаем выполнение
скриптов в по этому пути.
Перезагружаем «Апач»
Для
тестирования mod_perl и Oracle Вам необходимо поместить файлы в /var/www/pcgi директорию.
Файл printenv выводит переменные окружения
print
"Content-type: text/plain; charset=iso-8859-1nn";
foreach $var
(sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|n|\n|g;
$val =~ s|"|\"|g;
print
"${var}="${val}"n";
}
Файл ora_test выводит текущую дату обращаясь к Оракл
print
"Content-type: text/html; charset=win1251nn";
use strict;
use DBI;
my $dbh = DBI
->connect
( 'dbi:Oracle:orabase', 'user', 'password',
{RaiseError => 1,
AutoCommit => 0}
);;
my $sql = qq{
SELECT sysdate FROM dual };
my $sth =
$dbh->prepare( $sql );
$sth->execute();
while (
my($sysdate) = $sth->fetchrow_array) {
printf ("%s ", $sysdate );
print "n";
}
$dbh->disconnect();
оrabase – TNS имя базы берется в tnsnames.ora
user – имя пользователя базы
password – пароль пользователя
базы.
Если все выполнено
правильно, то все должно работать иначе смотрим логии Апача и разбираемся.
Межецкий Алексей. absz@yandex.ru
|