My name is Vasyl Khrystiuk‎ > ‎process‎ > ‎main‎ > ‎

WebDev

Треба налаштувати такі речі як http-server(apache), mysql-server, php. 
Треба це все налаштувати так, щоб:
1) воно працювало
2) було незалежним від системи і змінних оточення/файлів/драйверів
Також при можливості буду згадувати ті помилки, я кими я стикався - власне щоб знайти їх вирішення тут.


Якщо ж ви не хочете нічого розбиратись в настройках і хочете, щоб все працювало - рекомендую готові зборки а-ля USBWebserver , Денвер. Я сам ними досить часто користуюсь.

Apache - це головне. Скачуєм останню стабільну сборку під свою платформу (win32-x86). Досить шкода, що розповсюджується в вигляді інсталяційних пакетів а не архівів. Однак після кількох маніпуляцій ми зробимо сервер незалежним від системи. Отже запускаємо. Ви повинні будете побачити щось приблизно таке:
Жмем далі, на сторінку з ліцензією і погоджуємось і жмем далі на можливо ще одну ліцензію, погоджуємось, жмем далі:

Тут заповнюєм так як в мене - в полі "Network Domain" пишем "localhost", в полі "Server name" пишем також "localhost" а в полі "Administrator's e-mail" - відповідно "admin@localhost". Галочку знизу ставте де і я - це буде порт, на якому наш сервер чекати вхідних запитів. На одному порту на одному комп'ютері може працювати тільки одна програма(мова йде саме за серверний сокет), водночас одна програма може займати будь-яку кількість портів. Якщо порт однієї програмки займає інша - програма не буде працювати(або буде працювати неправильно). Тут увага: ми вибрали 80 порт. На 80 порту іноді може працювати скайп - для роботи сервера потрібно в його вимкнути(або налаштувати). Хто думає, що в нього 80 порт вільний - нехай перевірить, бо бували випадки, коли в людей працювали різні сервери а вони не знали про це. Перевірити 80 порт дуже просто - потрібно в браузері перейти на сторінку "localhost". Якщо браузер сказав, що не може створити з'єднання з обраною адресою - значить все добре - порт вільний. Якщо ж вам посміхається різнокольорова сторінка - читайте що там пишуть в питайте в google як то виключити. 
Також дуже часто на 80 порту працює IIS.Це невикористовуваний компонент Windows, який треба видалити. Як це зробити.
Також можна зробити так: netstat -abn

Впевнились що порт вільний - продовжуєм установку(якщо щось не так ви про це обов'язвково дізнаєтесь). На наступній сторінці, де нам пропонують вибрати "Setup type" вибираєм "Typical" і жмем "далі". Далі нам пропонують вибрати "Destination folder":

Система в мене стоїть на С:\ а всі файли зберігаються на D:\ тому я створив на диску D:\ папку "server" і вказав інсталятору ставити сервер в неї. Якщо інсталятор не знайде якоїсь папки - він її створить. Жмем "Ок" і "Далі" і "Install". Якщо все гаразд - в кінці ми повинні побачити приблизно таке вікно:
 Завершуємо з установкою і тестуємо. Зараз всі параметри по замовчуванню і перевірити роботу сервера можна за адресою: http://localhost/
Добре. Все інстальоване і зараз працює. Різні установки проходять по різному. Головний файл з настройками для Apache знаходиться тут:
D:\server\conf\httpd.conf
Відкриваєм файл в блокноті і шукаєм приблизно таке місце:

#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName localhost:80

І розкоментовуємо останню стрічку(забираєм #):

#
ServerName localhost:80
 Якщо в вас вона розкоментована, значить все добре.

Тепер по суті:
З командної строки заходимо до папки з сервером в каталог D:\server\bin>
Для допомоги по командам серверу пишемо:
httpd.exe -help
Приклад запиту:

Ось корисні нам зараз команди:
  • Зупинка сервісу: httpd.exe -k stop
  • Видалення сервісу: httpd.exe -k uninstall
  • Встановлення сервісу: httpd.exe -k install
  • Запуск сервісу: httpd.exe -k start
  • Перезапуск сервісу: httpd.exe -k restart
Тепер створимо основу нашого сайту. Створим для нашого сайту папку D:\root. Тепер сконфігуруєм httpd.conf для роботи в новому місці.

Шукаєм приблизно таке місце:

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "D:/server/htdocs"
І замінюєм на:
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "D:/root"
 Також скрізь по файлу знаходим "
D:/server/htdocs" і замінюєм на 
"D:/root"
Наприклад тут має бути так:
<Directory "D:/root">

Cтворим в каталозі D:/root файл "index.hml"  і напишем там шось типу "Привіт з D:/root!", збережем в кодуванні UTF8.
Тепер якщо з браузера зайти по адресу "http://localhost/index.html" ми побачим те, що написали в файлі. Значить директорія успішно перенесена. Тепер про російські і українські літери.
Якщо вони не відображаються то для їх підтримки тра дописати:
AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
    CharsetSourceEnc utf-8
    CharsetDefault utf-8
</IfModule>
Якщо після цього всеодно нема - значить проблема кодування в файлі.

Тепер додамо кілька віртуальних хостів. Спочатку Створим папку для першого віртуального хоста. Я створив папку "mysite" в середині папки D:\root. А в середині "mysite" створив папки "www" і "cgi". Тепер налаштуєм конфіг файл так, щоб сервер бачив цю папку як окремий сервер.

Для цього розкоментуйте цю стрічку:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
і перейдем до файлу цього файлу("conf/extra/httpd-vhosts.conf") - там вже багато чого написано. Міняєм, щоб було так як нам треба:
# спочатку вказуєм, який адрес буде використовуватись для віртуальних хостів:
NameVirtualHost 127.0.0.1
# або так:
#NameVirtualHost 127.0.0.1:80 
# потім вносим запис першого віртуального хоста:

<VirtualHost mysite>
ServerAdmin me@mysite
ServerName mysite
DocumentRoot "D:/root/mysite/www"
ScriptAlias /cgi/ "D:/root/mysite/cgi/"
ErrorLog D:/root/mysite/error.log
CustomLog D:/root//mysite/access.log common
</VirtualHost>
Також додамо "localhost" - створим відповідно папку "localhost"  в середині "D:\root" а в ній папки "www" і "cgi":
<VirtualHost localhost>
ServerAdmin admin@localhost
ServerName localhost
DocumentRoot "D:/root/localhost/www"
ScriptAlias /cgi/ "D:/root/localhost/cgi/"
ErrorLog D:/root/localhost/error.log
CustomLog D:/root/localhost/access.log common
</VirtualHost>
 
Не забудем для тесту в папки "D:\root\mysite\www"  і "D:\root\localhost\www" покласти якісь "index.html" з привітаннями. Однак це ще не все. Треба зробити так, щоб адреса наших віртуальних хостів були доступними. Для в системній папці "C:\WINDOWS\system32\drivers\etc" знаходим файл "hosts" і редактуєм його, вносячи в нього імена наших віртуальних хостів і IP-адрес, під яким їх потрібно шукати:
127.0.0.1       localhost
127.0.0.1       mysite
Зберігаєм і перезапускаєм сервер. Тепер тестим:
  

Перер приступим до скачування і налаштування PHP. Я буду використовувати останню стабыльну сборку 5 версії. Скачую в вигляді zip архіва.
Тут качаю це php-5.2.14-Win32.zip і розпаковую в D:\php5. Бажано, щоб в системі не було інших встановлених версій PHP(якщо є і немає бажання видаляти - перейменуйте їх і ситема не знайде їх). Берем файл "php.ini-recommended" і перезберігаєм його під новим ім'ям "php.ini".
Внесем деякі зміни в цей файл:
; ввімкнем підтримку коротких відкриваючих тегів <? так само як і <?php
short_open_tag = On 

; змінюєм magic_quotes_gpc = Off на
magic_quotes_gpc = On
; цей параметр відповідає за автоматичне екранування всіх escape- символів 
; ось про цей параметр і шо з ним робити хороша стаття - http://www.ddvhouse.ru/articles/text/7/

; змінюєм register_globals = Off на
register_globals = On
; цей параметр відповідає за те, що всі передані з форми данні будуть доступні в скрипті як змінні з тими ж іменами
; для розробки цей параметр краще залишати виключеним і писати правильно. але нехай поки буде включеним - хто зна,
; скільки неправильних скриптів вам доведеться запускати...

; ввімкнем повідомлення про помилки:
display_errors = On

; явно вкажем куди зберігати файли сесій
session.save_path = "D:\root\temp"
; якщо паки немає, її треба створити

; далі напишем налаштування для пошти
; ось що рекомендують писати:
;SMTP = mail.example.com
;smtp_port = 25
;sendmail_from = youremail@example.com
; я ж скачав sendmail
; і збираюсь працювати через нього і для цього в группі команд [mail function] змінив і добавив таке:
[mail function]
SMTP =
sendmail_from =
sendmail_path = "D:\root\sendmail\sendmail.exe -t"
;

Тепер про підключення PHP до Apache. Є два способи підключити PHP до Apache - підключити його як модуль Apache, і підключити його як інтерпритатор CGI-скриптів.
Для підключення його як модуль потрібно все в тому ж файлі настройок Apache "conf\httpd.conf" знайти і розкоментувати/змінити/дописати таке:
# Для PHP5 і Apache 2.2 треба написати так:
LoadModule php5_module "D:/php5/php5apache2_2.dll"
# для Apache 2.0
# LoadModule php5_module "D:/php5/php5apache2.dll"
# також для пітримки в Apache php траба  в блок <IfModule mime_module> ... </IfModule> добавити це:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# також треба вказати директорію з файлом PHP, де знаходиться наш php.ini
PHPIniDir "D:/php5"

Також треба добавити підтримку індексних сторінок для нового розширення. Для цього треба в "conf\httpd.conf" знайти і змінити таке:
DirectoryIndex index.html index.php

Перезапускаєм Apache і тестим localhost/index.php...
Вуаля:


Тепер приступим до налаштування MySQL.

Скачуєм:mysql. Можна скачати інсталятор і там напевно буде майстер, який допоможе налаштувати. Але це не для нас.
Тому ми скачуємо:

Windows (x86, 32-bit), ZIP Archive 5.1.50 115.3M
(mysql-noinstall-5.1.50-win32.zip).

І розпаковуємо до D:\root. Знаходим файл "my-medium.ini" і копіюєм під новим ім'ям "my.ini". Для настройки mySQL його треба інсталювати. Заходим в "D:\root\mysql\bin"  і виконуєм команду:
mysqld --install MySQL --defaults-file=../my.ini 

Cлово MySQL в даному випадку - це ім'я, під яким ми інсталюємо цю службу
Потім запускаємо службу:
net start MySQL
Потім підключаємось для установки пароля:
mysqladmin -u root password 123
Потім підключаємось до сервера:
D:\root\mysql\bin>mysql -u root -p
Enter password: ***
і видяляєм для безпеки все лишнє:
 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;
Потім все виключаєм:
Виходим з сервера: quit;
Зупиняємо все:
net stop MySQL
mysqld --remove MySQL

Тепер настроїм PHP для роботи з mySQL.
В файлі php.ini знаходим, розкоментовуєм і дописуєм такі значення:
extension_dir = "D:/root/php5/ext"
i ввімкнем(розкоментуєм) бібліотеки, які треба для роботи:
extension=php_curl.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll

Також шоб все працювало, треба бібліотеки mysql зробити доступними для Apache. Це можна зробити кількома способами. 
1) Закопіювати бібліотеки з mysql з каталогу PHP до каталогу Windows(для уникнення залежності від системи і уникнення DLL hell рекомндую цього не робити).
2) Добавити шлях "D:\php5" i "D:\php5\ext" в змінну оточення "PATH"(рекомендую для навчання).
3) Явно вказати, які бібліотеки має підгружати Apache. Для цього треба змінити блок підключення PHP в Apache:
########
# Для PHP5 і Apache 2.2 треба написати так:

#LoadFile "D:/php5/libeay32.dll"
#LoadFile "D:/php5/ssleay32.dll"
LoadFile "D:/php5/libmysql.dll"  
#LoadFile "D:/php5/php5ts.dll"  

LoadModule php5_module "D:/php5/php5apache2_2.dll"
# для Apache 2.0
# LoadModule php5_module "D:/php5/php5apache2.dll"

<IfModule php5_module>
# також треба вказати директорію з файлом PHP, де знаходиться наш php.ini
PHPIniDir "D:/php5"
#php_admin_value extension_dir "D:/php5/ext" # в мене не працює

# також для пітримки в Apache php траба добавити це:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>
Зберігаєм, виходим.



Тепер тестим:
Запускаєм все, створюєм базу а в ній таблицю з одним полем і вносим 2 записи в цю табличку:
D:\root\mysql\bin>mysqld --install MySQL --defaults-file=../my.ini
D:\root\mysql\bin>net start MySQL
D:\root\mysql\bin>mysql -u root -p
Enter password: ***
mysql> create database test;
mysql> use test;
Database changed
mysql> create table tt(
    -> id INT);
mysql> insert into tt(id) values (25),(123);
mysql>quit;
Перезапускаєм Apache:
D:\server\bin>httpd -k restart

Тепер пишем php скрипт, який буде виводити наші значення:
<?
echo "Я php скрипт <br>";
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '123';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'test';
mysql_select_db($dbname);
$result = mysql_query('SELECT * from tt');
while ($row = mysql_fetch_assoc($result)) {
echo $row['id']."<br>";
}
?>

Як бачим, все працює:

Зараз робота з'єднаннями в PHP дуже упростилась з використанням бібліотеки CUrl.
Для того, щоб бібліотека була доступною, треба в "php.ini" розкоментувати таку стрічку:
extension=php_curl.dll
Знайдем тестовий скрипт для роботи з цією бібліотекою:
// is curl installed?
    if (!function_exists('curl_init')){ 
die('CURL is not installed!');
}
    $Url = "http://msangel.org.ua/";
     // create a new curl resource
    $ch = curl_init();
  /*
Here you find more options for curl:
http://www.php.net/curl_setopt
*/
  // set URL to download curl_setopt($ch, CURLOPT_URL, $Url);
  // set referer: curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/");
  // user agent: curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
  // remove header? 0 = yes, 1 = no curl_setopt($ch, CURLOPT_HEADER, 0);
  // should curl return or print the data? true = return, false = print curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  // timeout in seconds curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  // download the given URL, and return output $output = curl_exec($ch);
  // close the curl resource, and free system resources curl_close($ch);
  // print output echo $output;

Однак в мене нічого не робить! А в вас може робити. Вся справа в бібліотеці zlib.dll. Якщо вона у вас уже э в системі, значить в вас все повинно працювати. Мені ж довелось її скачати тут:http://gnuwin32.sourceforge.net/packages/zlib.htm. Dll файл можна розмістити або в каталозі Windows/system32/ або в каталозі з php. В другому випадку для того, шоб Apache бачив її, треба або ж протисати шлях до папки з PHP в змінних оточення(як я рекомендував ше давно спочатку) або в файлі httpd.conf  поряд з підвантаженням libmysql.dll зробити запис:
LoadFile "D:/php5/zlib.dll"  

І опа:

Також при роботі ми можем часто використовувати різні бібліотеки, не знаючи про це, тому краще розкоментити якнайбільше бібліотек:
extension=php_bz2.dll
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_sockets.dll
extension=php_zip.dll

Ну і звичайно, нам для роботи мало одного сервера. Apache дозволяє на одному реальному сервері розміщати кілька "віртуальних хостів".
Для того, щоб їх ввімкнути, треба:
або в файлі httpd.conf розкоментувати стрічку:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
і вносити зміни в той файл, або вносити зміни власне в сам httpd.conf.
Ось приклад змін:
NameVirtualHost 127.0.0.1

<VirtualHost mysite>
    ServerAdmin me@mysite
    ServerName mysite
    DocumentRoot "D:/root/mysite/www"
    ServerAlias mysite
    ServerAlias www.mysite
    ErrorLog D:/root/mysite/error.log
    CustomLog D:/root//mysite/access.log common
</VirtualHost>

<VirtualHost localhost>
    ServerAdmin admin@localhost
    ServerName localhost
    DocumentRoot "D:/root/localhost/www"
    ScriptAlias /cgi/ "D:/root/localhost/cgi/"
    ErrorLog D:/root/localhost/error.log
    CustomLog D:/root/localhost/access.log common
</VirtualHost>

Чи варто говорити, що всі вказані каталоги мають існувати?)

Тут буде коротша версія цього всього: лише порядок дій, шляхи і конфіги.

...
end

Comments