пятница, 30 октября 2009 г.

Установка Joomla 1.5.14 на Apache под Windows

Теперь поставим Joomla! 1.5.14 (последнюю версию на сегодняшний день) на наш веб сервер. Качаем русскую редакцию вот от сюда http://joom.ru/ или английскую вот от сюда http://joomla.org/. Подробно как ставить Joomla не описываю, так как этому вопросу посвящено много статей и ресурсов. Лучше опишу баг ну или фитчу которая всплыла.

После установки увидел вот такое:

Вылезли ошибки :( .... стал гуглить... и нагуглил... что уже наступали на эти грабли. И вот что один из наступивших написал:

I finally found a post on this in the Joomla forums, which said that PHP 5.3 is not compatible with the latest version of Joomla, 1.5.14, and that you have go back to an earlier version, 5.2.x. Once I did that, it is all working fine now.

Перевод:

И нашел я в конце концов на форуме Joomla, и было сказано там, что PHP 5.3 не совместимо с последним релизом Joomla 1.5.14, и надо идти обратно к прошлой версии PHP 5.2.x. И сделал я так и стало мне хорошо, и все стало работать.

Вот так вот... не все новое нужное...

Так что теперь будем делать downgrade PHP. Качаем скачал его там же. Версия PHP 5.2.11.
Весь даунгрейд свелся к простому перезаписыванию файлов из архива PHP 5.2.11 в каталог R:\Server\PHP. И все заработало.

четверг, 22 октября 2009 г.

Установка и настройка Apache, PHP, CGI, MySQL, OpenSSL и Perl под Windows

Установку, как и в прошлый раз, проводил на Windwos XP, но все это будет работать и на серверных осях.
На этот раз будем устанавливать и настраивать, для совместной работы под Windwos, следующую связку:
  • Apache 2.2.14 (Win32 x86) с OpenSSL 0.9.8k
  • РHP 5.3.0 (win32 x68)
  • MySQL 5.1.39
  • ActivePerl 5.10.1.1006
Так как мы хотим подготовить сервер для реального домашнего хостинга, то сразу создадим структуру каталогов для нашего сервера и сайтов. Исполняемые (бинарные) файлы, а так же файлы конфигурации Apache, PHP, MySQL и т.д., мы разместим на одном диске (в моем случае диск R), а файлы наших сайтов, баз данных и лог файлы на другом диске (в моем случае диск X).


И так пошагали...

1) В корне диска R: создаем папку Server и в ней создаем подкаталог PHP.

2) Прописываем путь к каталогу PHP в системную переменную PATH. Для этого выполняем следующие операции:
  • Клацаем правой кнопкой мыши по иконке "Мой Компьютер" и выбираем из контекстного меню пункт "Свойства"
  • Переходим на вкладку дополнительно и клацаем по кнопке "Переменные среды"
  • В окошке системные переменные находим параметр Path, клацаем по нему и к концу строки добавляем наш путь (с точкой запятой перед нашей строкой) - ;R:\Server\PHP
  • Затем клацаем везде ОК и делаем выход из системы и снова входим. Это нужно для того чтобы переменная Path получила новое значение.
  • Запускаем cmd.exe и проверяем что переменная Path получила новое значение введя команду set и жмакнув по Enter

3) В корне диска X: создаем две папки Sites (тут будут лежать наши сайты) и Logs (тут будут жить общие логи сервера).

4) В папке X:\Sites создаем два подкаталога localhost и testru и далее в каждом из них свои подкаталоги www и cgi.

5) Скачиваем дистриб Apache под Win32 с поддержкой SSL. На момент установки последним был файлик apache_2.2.14-win32-x86-openssl-0.9.8k.msi. И запускаем на выполнение.

6) На этом окошке смело жмем Next

7) Принимаем лицензионное соглашение.

8) Внимательно и вдумчиво читаем вот это...

9) Заполняем все поля как на скриншоте

10) Выбираем Custom

11) Выбираем опции как на скриншоте и путь установки R:\Server\Apache

12) Жмакаем Install...

13) После установки в трее должен появиться значек консоли управления сервисом - Apache Service Taskbar

14) Проверяем установку запустив браузер и введя в строке адреса localhost. Видим страницу с надписью It Works!. Радуемся жизни. Что-то уже работает.

15) Далее отыскиваем файлик hosts, который обычно находится по пути C:\WINDOWS\system32\drivers\etc\ и добавляем в него запись 127.0.0.1 test.ru и сохраняем.

Это укажет браузеру где искать наш тестовый домент test.ru. Кстати, заметьте, что в файле уже присутствует запись 127.0.0.1 localhost. Именно по этому браузер и узнал ip сайта localhost, когда мы ввели это имя в строке адреса браузера. Проверяем теперь это в браузере.
Но не шибко радуемся. Так как это еще не мультихостинг. :) Для него еще много что надо настроить.

16) Теперь будем прикручивать PHP. На текущий момент это версия PHP 5.3.0. Качаем дистриб в ZIP архиве. Еще раз повторюсь не инсталер с расширением .MSI, а именно ZIP архив. Файлик на момент написания статьи называется php-5.3.0-Win32-VC6-x86.zip, вот его и качаем.

17) Разархивируем содержимое скачанного архива в папку R:\Server\PHP.

18) Прикручивать PHP к Apache будем как модуль Apache. Для этого идем в каталог R:\Server\Apache\conf, и добавляем в файлик httpd.conf в окончание блока инструкций LoadModule (в строки 127 и 128) две строки:

LoadModule php5_module "R:/Server/PHP/php5apache2_2.dll"
PHPIniDir "R:/Server/PHP/"

19) Находим в файлике httpd.conf инструкции AddType, в конец этого блока (в моем случае в строку 406) вставляем инструкцию:

AddType application/x-httpd-php .php

20) Находим в файле httpd.conf блок инструкций . И добавляем в инструкцию DirectoryIndex указание на файл index.php. Чтобы в конечном виде инструкция выглядела так:

DirectoryIndex index.html index.php

Сохраняем httpd.conf и выходим.

21) Переименовываем или копируем файл php.ini-production (в каталоге R:\Server\PHP) в файл php.ini.

22) Находим в файле php.ini строку short_open_tag = Off. И приводим ее к виду short_open_tag = On

23) Создаем в каталоге R:\Server\Apache\htdocs файлик phptest.php и пишем в нем следущий код:
<?
phpinfo();
?>
Сохраняем файлик.

24) Останавливаем и снова запускаем Apache через консоль управления Apache. После перезапуска Apache можно открыть окно управления сервисом Apache дважды кликнув по иконке в трее. Должны увидеть следующее окошко:

Обратите внимание, что в статусной панели сервиса управления Apache отображается, что так же загружен модуль PHP и указана его версия.
Если вы этого не увидели, то сверните окошко и разверните его снова. Если и это не помогло, значит, что то сделали не так и 25 шаг, скорее всего у вас сделать не получится.

25) Тестируем работу PHP. Набираем в браузере http://localhost/phptest.php и видим следующую картинку и радуемся жизни. PHP заработал:

Если такого не видим, то повторяем все шаги снова, до тех пор пока не увидим :).

**) Небольшое, лирическое отступление от темы установки. Любой сетевой сканер прочитав банер Apache покажет вот такую, или примерно такую инфу:

Что с потрохами выдает и ОС, и версию Apache и версию PHP, что очень не очень хорошо. Как с этим бороться рассмотрим чуть ниже.

26) Позаботимся немного о безопасности нашего сервера. По умолчанию, при установке, сервис Apache запускается под пользователем SYSTEM, который имеет в системе максимальные права. Это не есть гуд. Сейчас будем исправлять эту ситуацию.
  • создаем учетную запись webserver и назначаем ей пароль
  • проверяем чтобы она входила только в группу пользователи
  • запрещаем для пользователя webserver локальный вход и выставляем право работать в режиме операционной системы и вход в качестве службы через оснастку gpedit.msc
  • Даем учетной записи webserver право на запись в папку R:\Server\Apache\logs. И только в эту папку. По умолчанию в другие папки доступа на запись и не должно быть.
  • Через оснастку управления службами устанавливаем запуск сервиса Apache2.2 под учетной записью webserver
  • Перезапускаем службу Apache2.2
  • Ну и проверяем работу зайдя по адресу http://localhost
27) Настраиваем виртуальные хосты. На 4 шаге мы создали структуру расположения сайтов на нашем сервере. Теперь, так же, выдаем права на запись в папку X:\Logs и папку X:\Sites (со всеми ее подкаталогами), право на запись для учетной записи webserver.

28) Идем в папку R:\Server\Apache\conf\extra и редактируем файл httpd-vhosts.conf. Приводим его к вот такому виду:

29) Раскомментируем в файле httpd.conf строчки
LoadModule logio_module modules/mod_logio.so
Include conf/extra/httpd-vhosts.conf

30) В файле httpd.conf находим строку DocumentRoot "R:/Server/Apache/htdocs" и меняем ее на DocumentRoot "X:/Sites/localhost/www".

31) В файле httpd.conf находим строку <Directory "R:/Server/Apache/htdocs"> и меняем ее на <Directory "X:/Sites">

32) В файле httpd.conf находим строку ErrorLog "logs/error.log" и меняем ее на ErrorLog "X:/Logs/error.log".

33) В файле httpd.conf находим строку CustomLog "logs/access.log" common и меняем ее на CustomLog "X:/Logs/access.log" common.

34) В каталоге X:\Sites\localhost\www создаем файлик index.html со следующим содержимым:
<H1>It is my LocalHost</H1>

35) В каталоге X:\Sites\testru\www создаем файлик index.html со следующим содержимым:
<H1>It is my TEST.RU</H1>

36) Рестартуем Apache. Заходим браузером по адресу http://localhost и видим следующие:

Заходим по адресу test.ru и видим следующее:

Радуемся реально работающему виртуальному хостингу.
Если не видим, то не радуемся. И ищем где ошиблись.

37) Языковые настройки. Редактируем файлик R:\Server\Apache\conf\extra\httpd-languages.conf. Комментируем все строки AddLanguage с теми языками, которые нам не нужны. Я оставил только строки:

AddLanguage en .en
AddLanguage ru .ru

Находим строку LanguagePriority и убираем там все языки, которые не нужны. У меня эта строчка выглядит так:

LanguagePriority en ru

Перед блоком AddCharset вставляем строку AddDefaultCharset WINDOWS-1251.
Сохраняем файл.

В файле R:\Server\Apache\conf\httpd.conf расскомментируем строчку Include conf/extra/httpd-languages.conf.

38) Включаем SSI. В файле R:\Server\Apache\conf\httpd.conf находим строки:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

И расскоментируем их.

Находим блок <Directory "X:/Sites"> и в нем строку Options Indexes FollowSymLinks. Приводим ее к виду Options Indexes FollowSymLinks Includes.

Сохраняем файл.

39) В каталоге X:\Sites\localhost\www создаем файл ssi.html со следующим содержимым:

SSI тест прошел успешно - ssi.html!

Затем, там же создаем файл ssitest.shtml со следующим содержимым:

<!--#include virtual="/ssi.html" -->

40) Рестартуем Apache. В броузере вводим адрес http://localhost/ssitest.shtml и видим следующее:

Радуемся что работает русский язык и SSI. Если не увидели, то упорно ищем ошибку.

41) Настройка CGI. В файле R:\Server\Apache\conf\httpd.conf находим строчку ScriptAlias /cgi-bin/ "R:/Server/Apache/cgi-bin/" и приводим ее к виду ScriptAlias /cgi-bin/ "X:/Sites/localhost/cgi/" и добавляем следующей строкой еще одну строчку ScriptAlias /cgi/ "X:/Sites/localhost/cgi/". Находим строку AddHandler cgi-script .cgi, расскоментируем ее и приводим к виду AddHandler cgi-script .cgi .bat .exe, указывая этим расширения файлов, которые будут исполняться как cgi скрипты. Находим строку Directory "R:/Server/Apache/cgi-bin" и приводим ее к виду Directory "X:/Sites/localhost/cgi/".
Вообще это не безопасно если не понимаем, что делаем. Привожу это здесь на всякий случай, может кому пригодится. Сохраняем файл.

42) Далее редактируем файл R:\Server\Apache\conf\extra\httpd-vhosts.conf. Добавляем инструкции ScriptAlias /cgi/ "X:/Sites/localhost/cgi/" и ScriptAlias /cgi/ "X:/Sites/testru/cgi/" в соответствующие блоки. Сохраняем файл.

43) Создаем файл cgitest.bat в каталоге X:\Sites\testru\cgi и вписываем туда следующий код:

@echo off
echo Content-type: text/html
echo.
echo.
echo TEST.RU CGI тест прошел успешно - cgitest.bat!

Создаем файл cigtest.bat в каталоге X:\Sites\localhost\cgi и вписываем туда следующий код:

@echo off
echo Content-type: text/html
echo.
echo.
echo LOCALHOST CGI тест прошел успешно - cgitest.bat!

44) Перезапускаем Apache и тестируем работу CGI введя в броузере следующие адреса:







Обращаем особое внимание на последний скриншот. Не смотря на то, что доменом указан test.ru, сработал cgi сценарий из папки cgi в localhost. Это обусловлено нашими настройками cgi. Папка cgi в localhost является общей для всех виртуальных хостов при обращении к ней через алиас cgi-bin.

45) Теперь очередь за MySQL. Хотя на момент написания была доступна версия 5.4.3-beta под Windwos. Я не стал с ней экспериментировать, а скачал версию 5.1.39 для Win32. Если у вас винда 64-разрядная, то скачиваете соответствующий дистриб вот от сюда. В моем случае файлик назывался mysql-5.1.39-win32.msi. Клацаем по нему и понеслась установка...

клацаем Next

Выбираем Custom клацаем Next

Меняем путь установки, выбираем нужные нам компоненты (я выбрал все) и клацаем Next и затем Install. Понеслась установка...

После завершения установки любуемся красивой картинкой и клацаем Next два раза, так как там еще будет одна красивая картинка :).

Так как сейчас уже MySQL принадлежит корпорации Sun, то нам предлагают зарегистрировать этот продукт, что можно смело пропустить. Оставляем только галку Configure MySQL Server now и клацаем Finish. После этого запустится мастер конфигурирования.

Клацаем Next.

Делаем правильный выбор и клацаем Next.

Тут нам предлагают определиться с типом сервера. От этого будет зависеть использование сервером MySQL ресурсов машины. На выбор дается три варианта:
  • Developer Machine. Как следует из названия, использовать этот вариант следует, если вы ставите MySQL на машине разработчика, где крутится еще куча всякого нужного (и ненужного, как обычно у разработчиков) софта. В этом случае MySQL автоматически будет настроен на минимальное использование ресурсов.
  • Server Machine. В этом случае предполагается, машина серверная и что на машине, кроме MySQL, крутится еще парочка серверных приложений. Например - Apache. В этом случае, очевидно, MySQL будет настроен на совместное использование ресурсов с несколькими, потенциально ресурсоемкими приложениями.
  • Dedicated MySQL Server Machine. Последний вариант - это монопольное использование ресурсов MySQL. Если у вас есть выделенная машина ТОЛЬКО под базу MySQL, я вас поздравляю - выбирайте этот вариант.
Так как у нас WEB сервер, то выбираем Server Mashine и клацаем Next.

Выбираем тип хранилища базы.
  • Mutltifunctional Database. Я обычно выбираю эту опцию. В этом случае создаются хранилища "общего назначения", с возможностью использования как InnoDB, так и MyISAM таблиц.
  • Transactional Database Only. База оптимизируется для серверов приложений или Web приложений с большим числом транзакций. Основным движком для хранилищ становится InnoDB.
  • Non-Transacional Database Only. Используется для большинства простых Web приложений, для сбора статистики и т. п. Активируется только движок MyISAM.
Что выбрать - ваше дело.

Преимущества транзакционных таблиц InnoDB:
  • Надежность.
  • Можно сочетать несколько операторов и принимать все эти операторы одной командой COMMIT.
  • Поддержка откатов
  • Если произойдет сбой во время обновления, все изменения будут восстановлены (в нетранзакционных таблицах все внесенные изменения не могут быть отменены).
  • Лучше обеспечивает параллелизм при одновременных обновлениях таблицы и чтении.
Преимущества нетранзакционных таблиц MyISAM:
  • Скорость
  • Меньший расход дискового пространства
  • Для обновлений используется меньше памяти.
Так что отталкивайтесь от задач. Для нас, на мой взгляд, лучшим будет первый вариант. Выбираем его и клацаем Next.

Так как мы выбрали Mutltifunctional Database, то у нас спрашивают где разместить табличные простарнаства InnoDB. Я их расположил на том же диске, где у меня находится папка Sites. Так как, в начале я уже говорил, что я предпочитаю держать все бинарники на одном диске, а файлы данных на другом. Клацаем Next.

Здесь выбираем нагрузку, которая будет на базу (количество одновременных подключений). В нашем случае первого варианта достаточно. Клацаем Next.

Здесь оставляем все как есть по умолчанию. Если у вас включен Windows FireWall и вам нужно чтобы к MySQL могли подключится по сети, то ставим галку Add firewall exeption for this port. Клацаем Next.

Выбираем русскую кодировочку для таблиц, как показано на рисунке и клацаем Next.

Здесь все и так понятно. Оставляем по умолчанию. Ну если сильно надо из коммандной строки работать, то ставим соответствующую галку. И клацаем Next.

Задаем пароль для пользователя root базы данных. Клацаем Next и затем Execute.

Мастер записал наши параметры в файл конфигурации MySQL и показал где он находится, а так же радостно сообщил что все было successfully. Жмакаем Finish.

46) Теперь будем править файлик my.ini, чтобы MySQL правильно работала с кодировкой windows-1251, а так же переместим расположение баз по умолчанию. Находим в файле R:\Server\MySQL\my.ini строку datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/". Это вот здесь вот! По умолчанию MySQL размещает свои базы. Форменное безобразие. Щас мы это исправим. Создаем папку X:\DataBases\MySQL и соответственно изменяем путь в параметре datadir на следующий datadir="X:/DataBases/MySQL/". Но этого не достаточно! Если щас перезапусить сервис MySQL, то он не запуститься, так как не найдет по новому пути системных баз данных. Поэтому копируем (или еще лучше перемещаем) все содержимое папки C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\Data в папку X:\DataBases\MySQL.

Далее в секции [client]
добавляем путь к папке кодировок

character-sets-dir="R:/Server/MySQL/share/charsets"

В секции [mysql] делаем тоже самое. В секции [mysqld] добавляем эту же строку и строку

init-connect="SET NAMES cp1251"

в которой будут передаваться данные MySQL.

Сохраняем файл и рестартуем сервис.

47) Проверяем работу MySQL (пока отдельно без привязки к Apache и PHP). Даем из командной строки команду

start R:\Server\MySQL\bin\mysql.exe -h localhost -P 3306 -u root -p

на запрос пароля вводим пароль и даем команду

show databases;

видим это:


И радуемся если видим. Если не видим, чешем репу и ищем ошибки.

48) По умолчанию сервис MySQL стартует под учетной записью SYSTEM. Это, как уже говорилось, очень не очень хорошо. Поступаем с ним, так же как и с Apache. Настраиваем запуск, под уже созданной учетной записью webserver. Кроме того, чтобы MySQL стартовал под этой учетной записью, все же придется прописать путь к папке R:\Server\MySQL\bin в системную переменную PATH (это так же можно было сделать при установке MySQL), а также дать учетной записи webserver разрешения на запись в папку X:\DataBases. Релогинимся в системе, чтобы подхватились новые параметры переменной PATH, рестартуем сервис MySQL уже под учеткой webserver и проверяем работу MySQL, как в предыдущем шаге.

49) Прикручиваем MySQL к Apache, хотя вернее сказать к PHP, ну а он уже прикручен к Apache. Вот такой паровозик получается. Итак редактируем файлик R:\Server\PHP\php.ini. Находим в нем строчки

extension=php_mysql.dll
extension=php_mysqli.dll

и раскомментируем их. Затем находим строку mysql.default_port = и приводим ее к виду mysql.default_port = 3306. Далее находим строку mysql.default_host = и приводим ее к виду mysql.default_host = localhost.

Находим строку extension_dir = "ext" и приводим ее к виду extension_dir = "R:/Server/PHP/ext". Указывая этим самым где находятся файлы расширений PHP.

Перезапускаем Apache.

В каталоге X:\Sites\localhost\www\ создаем файлик mysqltest.php и вводим туда следующий код:

<?php
$db = mysql_connect("localhost", "root", "ВАШ ROOT ПАРОЛЬ К MySQL")
or
die("Could not connect : " . mysql_error());
mysql_select_db("test",$db) or die ("Could not select database");

$date = mysql_query("SELECT CURDATE()") or die ("Query failed: " . mysql_error());
echo mysql_result($date, 0);
mysql_close($db);
?>

В броузере вводим адрес http://localhost/mysqltest.php и если все сделали правильно, то видим текущую дату.

50) Включи функции PHP для работы с графикой. Редактируем файлик R:\Server\PHP\php.ini. Находим строку extension=php_gd2.dll (953 строка по идее) и расскоментируем ее. Перезапускаем Apache.

51) В каталоге X:\Sites\localhost\www созадем файлик gdtest.php и вводим следующий код:
<?
$pic=imagecreate(350,100);
$piccolor=imagecolorallocate($pic, 255,255,255);
$textcolor=imagecolorallocate($pic, 0,0,0);
$linecolor=imagecolorallocate($pic, 0,0,255);
$text="GD test successful - gdtest.php!";
imagerectangle($pic, 1,99, 349,0, $linecolor);
imagestring($pic,5,30,40, $text, $textcolor);
header("content-type: image/png");
imagepng($pic);
imagedestroy($pic);
?>
Вводим в браузере адрес http://localhost/gdtest.php и видим:



Радуемся жизни... Если видим.

52) Ставим Perl. На момент написания последней версией был ActivePerl 5.10.1.1006. Берем вот от сюда https://www.activestate.com/activeperl/downloads. Это обычный .msi пакет. Запускаем на установку...



Жмем Next



Снова жмем Next

Выбираем путь нужный нам путь установки и жмем Next

Оставляем эти две галки как есть (то есть отмеченными :) ) И жмем Next и затем Install. И понеслася установка на диск...

53) Редактируем файлик R:\Server\Apache\conf\httpd.conf находим строку AddHandler cgi-script .cgi .bat .exe и приводим ее к виду AddHandler cgi-script .cgi .bat .exe .pl

54) При установке ActivePerl запихнет файл (printenv.pl) для тестирования своей работы совместно с Apache в каталог R:\Server\Apache\cgi-bin, наивно полагая что у нас на него настроен сайт. Поэтому нам надо переместить этот файлик в каталог X:\Sites\localhost\cgi.

55) Редактируем файл X:\Sites\localhost\cgi\printenv.pl. Исправляем первую строку с

#!c:/perl/bin/perl.exe

на

#!R:/Server/Perl/bin/perl.exe (в моем случае)

Или же можно просто написать #!perl, но перед тем как проводить тестирование надо будет сделать выйти и войти снова в систему.

56) Рестарутем Apache и вводим в браузере адрес http://localhost/cgi-bin/printenv.pl и видим...

И радуемся, радуемся жизни... если видим...

57) Теперь самое вкусное - настройка SSL для Virtual Hosts. Много было копий сломано по этому поводу в сети. И так выполняем пункты с 10 по 13 из этой статьи http://adminsnotes.blogspot.com/2008/01/apache-openssl-windows.html

58)Выполняем 14 из той же статьи для каждого нашего виртуального хоста (localhost и test.ru). Естественно что должно получиться два набора файлов для каждого виртуального хоста.

59) Создаем подпапку ssl в корне каждого виртуального хоста и помещаем туда соответствующие наборы фалов сертификатов.

60) Выполняем пункт 16 из той же статьи. ЗА ИСКЛЮЧЕНИЕМ строк добавляющих виртуальный хост. Это мы сделаем в файле httpd-vhosts.conf.

61)Приводим файл httpd-vhosts.conf к следующему виду: