Програмиране в интернет среда. Инсталиране и настройка на Apache уеб сървър в Линукс.

Програмиране в интернет среда. Инсталиране и настройка на Apache уеб сървър в Линукс.

1. Технология "клиент-сървър"

Технологията "клиент-сървър" се използва широко в интернет за предаване на данни от съръва към клиента и обратно. За тази цел е въведен стандартът CGI (Common Gateway Interface), който представлява набор от правила и команди, които се изпълняват от web-сървъра при получаване на заявка от компютъра-клиент. CGI програмата обработва заявката, постъпила от браузъра на клиента, след което генерира резултат. Резултат може да бъде както обикновено текстово съобщение, така и  база-данни, дори цяла HTML страница. Това прави CGI интерфейса изключително подходящ за създаване на динамични HTML страници, както и за web-ориентирани бази данни. CGI програмите могат да се създават на произволен език за програмиране Perl, PHP, Python, Tool Command Language, C, C++  и много други.
    Пример за подобна заявка е една форма, която клиентът попълва и изпраща с бутона “Submit”. Всяко едно от полетата на тази форма се кодират от браузъра по определен начин и се изпращат след интернет адреса във вида:
            променлива1= стойност1&променлива2=стойност2 .......
Скриптът, който обработва заявката на клиента има пряк достъп до тези променливи. След обработката на подобна заявка сървърът връща резултата обратно на клиента.

Най-популярният и надежден сървър за обработка на HTTP заявки (Apache) се използва изключително със средствата на CGI интерфейса. Част от дистрибутивите на Unix и Linux, днес имат версии и за всички операционни системи, включително и Windows. Apache сървърът е безплатен, предоставя безплатни услуги и е с отворен код, което го прави достъпен за използване навсякъде по света. Модулната му организация позволява да се надгражда като по този начин се повишава неговата функционалност и връзката му с всякакви езици за програмиране и бази данни.

HTTP - протокол, който се използва за предаване на информацията от клиента към сървъра и обратно.

 

2. Инсталиране и настройка на Apache уеб сървър

Apache Web Server е най-често използвания Web сървър в Интернет - използва се в над 60% от Интернет сайтовете. Причината за неговата популярност е че той е безплатен и много стабилен. Друго голямо предимство на Apache, че той е с отворен код, което позволява лесно модифициране на кода или писане на допълнителни модули. Apache поддържа следните основни функции:

Сигурност

Apache притежава набор от защити, които го правят труден за осъществяване на атаки. Този набор включва идентификационни механизми и Secure Socket Layer (SSL). Тъй като Apache поддържа широк списък от сървъри за бази данни като MySQL и Oracle, то те може да се използват за съхраняване на потребителите имащи достъп до Web сървъра.

Можете да добавите поддръжка на SSL на сървъра чрез модула mod_ssl. SSL използва цифрови подписи за криптиране на данните пренасяни през Интернет.

Поддръжка на HTTP/1.1

Apache поддържа най-новата спецификация на HTTP протокола, а именно 1.1. Това означава, че Apache поддържа виртуални хостове, постоянни връзки (persistent connection), кеширане на ресурсите, качване на файлове от страна на клиента и др.

Поддръжка на множество езици

Apache поддържа множество езици за създаване на Web съдържание. Езиците които той поддържа са: PHP (Hypertext Preprocessor), ASP (Active Server Pages), JSP (Java Server Pages), Perl, CGI (Common Gateway Interface), SSI (Server Side Includes) и много други.

Кеширане на информацията

Чрез модула mod_proxy, Apache може да кешира страниците, като при повторно заявяване тя се зарежда не от Интернет, а от локалния кеш. Това може да спести трафик и време за зареждане.

Dynamic Shared Objects

Apache поддържа механизъм за зареждане на модули, които добавят различна функционалност на Web сървъра. Това става без прекомпилиране на Web сървъра.

Поддръжка на Windows

Версия 1.x.x на Apache може да работи успешно и на Windows базирани машини. Тази версия обаче не е оптимизирана за работа под Windows и не трябва да се използва за реални Web сървъри. След версия 2.x Apache вече може да работи и като реален сървър на Windows базирани машини.

Скаларност

Можете да конфигурирате Apache така, че множество сайтове да работят на един сървър. Това става чрез задаване на виртуални хостове.

Инсталиране:

    1) инсталира се чрез контролния панел или с командата urpmi apache (или apache2 за по-новата версия)

    2) стартира се сървъра чрез контролния панел или чрез командата service httpd start или apachectl start

   
3) работата на apache сървъра се тества като се стартира браузър за интернет (Мозила или Конкюерър) и се отвори адреса на локалния компютър: http://localhost, при което трябва да се появи началната страница по подразбиране

проверка дали apache е инсталиран (услуга http) - чрез команда nmap localhost - ако е стартиран, ще видите на порт 80 услуга http

Друг начин за тестване на apache:
telnet localhost 80  - при което следва да се подаде подходяща команда за връзка чрез HTTP протокол, например:
GET / HTTP/1.0 (два пъти Enter)

отговорът от сървъва трябва да бъде подобен на следното:

HTTP/1.1 200 OK
Date: .....
Server: Apache-AdvancedExtranetServer/2.0.48 (Mandrake Linux/...) PHP 4.3.4.....
........
........
Content-Type: text/html;...
<html>
........
</html>
Connection closed by foreign host.

    4) за настройка на apache се използва конфигурационният файл: /etc/http/conf/commonhttpd.conf. По подразбиране главната директория на уеб сървъра е /var/www/httpd/, като уеб страниците и скриптовете на PHP се разполагат в директория html, а CGI програмите в директория cgi-bin. За тестване на CGI-програмите може да се стартира скриптът testcgi.cgi, като се отвори следния адрес:  http://localhost/cgi-bin/testcgi.cgi

    5) при всяка промяна в конфигурационния файл, уеб сървърът трябва да се рестартира чрез команда
apachectl restart

 

Параметри на командата apachectl:
 

        ·         start – стартира сървъра.

·         stop – спира сървъра.

·         restart – рестартира сървъра при промяна на конфигурацията.

·         fullstatus – предоставя пълна информация за сървъра в момента. Изисква инсталиран браузър lynx и активиран модул mod_status.

·         status – предоставя кратка информация за сървъра в момента. Изисква инсталиран браузър lynx и активиран модул mod_status.

·         graceful – елегантно рестартиране на сървъра. Ако не е стартиран, то чрез тази команда той се стартира.

·         configtest – проверява валидността на конфигурацията.

·         help – кратка помощна информация.

 

Настройка на конфигурационния файл (/etc/http/conf/commonhttpd.conf)

Той е разделен на няколко секции. Първата от тях е Global Environment. Директивите в тази секция са глобални и се отнасят за целия Web сървър и различните виртуални хостове. Тя включва следните основни директиви:

·         ServerType – можете да настроите сървъра да работи в един от двата режима: standalone или inetd. inetd може да се използва само за UNIX/Linux базирани системи. В пърия случай сървъра работи като самостоятелен сървър, а във втория – като услуга стартираща се от inet демона.

·         ServerRoot – тази директива задава основната директория в която е инсталиран сървъра. В нашия пример това е /usr/local/apache

·         StartServers – указва колко сървъра да бъдат стартирани едновременно. Добре е тази директива да не се променя. За Windows версията на Apache тази директива няма никакво значение и не присъства в конфигурационния файл.

·         MaxClients – задава максималния брой на едновременно свързани клиента. По подразбиране стойността е 150, което може да не е достатъчно за натоварени сървъри.

·         Listen – това е важна директива, която може сериозно да повлияе на бързината и сигурността на сървъра. Чрез нея се задава порта и IP адреса на който ще „слуша“ сървъра за заявени връзки. По подразбиране порта е 80 за локалната машина. Можете да задавате или само порт (Listen 5000) или комбинация от порт и IP адрес (Listen 192.168.7.102:80). Можете да задавате повече от една комбинация от IP адрес и порт, като подреждате Listen директивите последователно една след друга. Ако зададените IP адреси не са достъпни за сървъра, той ще откаже да се стартира.

·         LoadModule – също много важна директива, чрез която може да зареждате различни модули, като по този начин разширявате функциите поддържани от сървъра. Например : LoadModule mime_module libexec/mod_mime.so Тук libexec е директорията в която са инсталирани модулите на сървъра.

·         AddModule – след като сте добавили модула в LoadModule трябва да го направите и в тази тук. Например: AddModule mod_mime.c След това модула е активен и достъпен за използване.

Това са по-важните директиви в Global Environment секцията. Следващата секция, която ще разгледаме е Main Server Configuration. Тази секция се отнася за основния Web сървър. Отделните виртуални хостове може да имат конфигурация различна от тази, ако дадена директива не е зададена изрично в конфигурацията на виртуалния хост, то се използва стойността й зададена тук. Main Server Configuration секцията съдържа следните по-важни директиви:

·         Port – задава порта на който „слуша“ сървъра. По подразбиране стойността е 80.

·         User – задава името на потребителя с които права работи сървъра.

·         Group – задава името на групата с които права работи сървъра.

·         ServerAdmin – задава електронния адрес, който се появява на страниците генерирани от сървъра при грешки или съобщения.

·         ServerName – задава името под което работи сървъра. По подразбиране се използва localhost. Той обаче е подходящ само за тестови цели. Зададеното име трябва да е регистрирано DNS име или поне да бъде описано във файла /etc/hosts.

·         DocumentRoot – важна директива задаваща къде сървъра ще търси Web документите. За нашия пример това е /home/www/htdocs .

·         DefaulType – чрез тази директива се задава на сървъра как да изпрати към клиента документ от тип, които не му е познат. По поддразбиране стойността е text/plain.

·         ErrorLog – тази директива указва пътя към журналния файл в който се пазят грешките на сървъра.

·         LogLevel – задава степента на подробност на грешките. По подразбиране стойността в warn, което означава, че към журналния файл се изпращат грешки от тип Warning или по-сериозни. Възможните стойности са debug, info, notice, warn, error, crit, alert, emerg. Най-високо ниво на съобщаване на грешки е debug, а най-ниско - emerg

·         ScriptAlias – задава псевдоним на директорията, в която ще се изпълняват CGI или други скриптове. По подразбиране стойността е зададената при конфигурацията на сървъра, а за конкретния пример тя е: ScriptAlias /cgi-bin/ „/home/www/cgi-bin/“. Когато един клиент напише в адресното поле на браузъра с : http://www.localhost/cgi-bin/ , то той ще осъществи достъп до директорията /home/www/cgi-bin/

·         BrowserMatch – чрез тази директива се търси съвпадение в името на браузъра използван от клиента и зададеното в директивата. Ако се намери съвпадение, то се може да се укаже на сървъра да промени своето поведение така, че да избегне определени бъгове в даден браузър. Например: BrowserMatch „Mozilla/2“ nokeepalive.

 

Друга много важна директива е <Directory ime_na_direktoria></Directory>. Тук може да се задават различни опции за дадената директория. Задължително име поне две такива директиви – една за DocumentRoot и една за директорията зададена чрез ScriptAlias. В тази директива може да се задават различни поддирективи, които имат влияние само за дадената директория. Ето пример за използването на директивата:

 

<Directory /var/www/html>

Options Indexes FollowSymLinks

DirectoryIndex index.php index.html index.htm

AllowOverride All

Order allow,deny

Allow from all

</Directory>

 

Значението на различните поддирективи е следното:

·         Options – задава различни опции на директорията. Indexes означава, че ако няма някои от документите по подразбиране (зададени в DirectoryIndex), то ще се показва съдържанието на директорията. FollowSymLinks е опция указваща на сървъра да следва символичните линкове. Ако се зададе и ExecCGI, то в дадената директория ще може да се изпълняват CGI скриптове.

·         DirectoryIndex – указва реда в който ще се търсят документите по подразбиране в дадената директория. В конкретния случай сървъра първо ще потърси файла с име index.php, ако не го намери, ще потърси index.html и т.н.

·         AllowOverride – ако стойността е None, то всички директиви зададени във файла .htaccess се игнорират. В този случай стойността е All, което позволява на този файл да предефинира опциите зададени в директивата <Directory>. Името на този файл може да се променя чрез директивата AccessFileName.

·         Order – указва в какъв ред ще се извършва проверката за това дали даден хост и дадено потребителско име има достъп до сървъра. Следващата директива Allow from с опция all указва , че всички хостове ще имат достъп до дадената директория.

Понякога се налага да се асоциира дадено разширение на файла към определен MIME тип. Например, за да знае сървъра какво да прави с PHP файловете (освен зареждането на модулите) е необходимо файловете с разширение .php да се асоциират към MIME типа application/x-httpd-php. Това може да стане с директивата AddType:

AddType application/x-httpd-php .php

Ето и обяснение на други директиви в :

·         AddEncoding – чрез тази директива можете да свържете дадено файлово разширение към даден тип.

·         AddLanguage – свързва файлово разширение към определен език.

·         AddHandler – свързва файлово разширение към определен изпълнител (handler).

 

Третата секция в commonhttpd.conf е Virtual Hosts. Чрез правилното конфигуриране на тази секция Вие ще можете да пуснете няколко Web сайта, които се хостват на един единствен Web сървър. Тези сайтове може да бъдат част от основния домейн или да не бъдат. Всеки отделен виртуален хост трябва да се поставя в своя собствена <VirtualHost></VirtualHost> секция. Вътре в нея се дефинират отделните директиви специфични за дадения виртуален хост. Виртуалните хостове могат да бъдат два типа IP базирани (IP-Based) и Именно базирани (Name-Based). Разликата между тях е, че при първия тип е необходимо за всеки виртуален сървър да се конфигурира отделен IP адрес. За разлика от него, при втория тип можете да конфигурирате множество виртуални сървъри на един единствен IP адрес. Важно е да се знае, че втория тип виртуални хостове не могат да работят в версия на HTTP по-ниска от 1.1.

Ето примерна конфигурация на IP-Based виртуален хост:

<VirtualHost 192.168.1.2>

ServerName ivan.com

DocumentRoot /home/www/public_html/ivan

</VirtualHost>

<VirtualHost 192.168.1.3>

ServerName gosho.com

DocumentRoot /home/www/public_html/gosho

</VirtualHost>

За да работи това е необходимо да конфигурирате вашия мрежови интерфейс да има повече от едно IP едновременно. Това може да стане така:

#ifconfig eth0:0 192.168.1.2

#ifconfig eth0:1 192.168.1.3

Разбира се, трябва да имате и валидни записи в DNS сървърите които да свързват ivan.com и gosho.com с 192.168.1.2 и 192.168.1.3. Това най-лесно може да стана като добавите следните редове в /etc/hosts:

192.168.1.2 ivan.com

192.168.1.3 gosho.com

Конфигурацията на Name-Based виртуални хостове е подобна. Преди секциите с отделните виртуални хостове, трябва да промените директивата:

NameVirtualHost 192.168.1.2

<VirtualHost 192.168.1.2>

ServerName ivan.com

DocumentRoot /home/www/public_html/ivan

</VirtualHost>

<VirtualHost 192.168.1.2>

ServerName gosho.com

DocumentRoot /home/www/public_html/gosho

</VirtualHost>

Съществена разлика има в редовете добавени в /etc/hosts:

192.168.1.2 ivan.com

192.168.1.3 gosho.com

В самите секции на различните виртуални хостове, може да слагате различни директиви, които имат по-висок приоритет от тези в секцията описваща основната конфигурация.

Apache поддържа и т.нар. Dynamic Virtual Hosting. Това позволява на администратора създаде специфични темплейти за DocumentRoot и ScriptAlias . На тази база и на базата на клиента, Web сървъра създава сам необходимите директории и връзки. Това е подходящо да се използва в сайтове поддържащи множество виртуални хостове, чието администриране на ръка би било трудоемка задача. Dynamic Virtual Hosting може да направите както с IP-Based виртуални хостове, така и с Name-Based такива.

Повечето Web сървъри се използват за съдаване на динамично съдържание, чрез определени програмни езици. Най-старата технология за създаване на динамично съдържание е използването на CGI. Чрез CGI можете да напишете програма на който език пожелаете и да визуализирате резултата на Web браузъра. За да направите това, трябва да са спазени някои изкисвания, които ще бъдат разгледани по долу. Като първо, трябва да имате директория в която е позволено изпълнението на CGI скриптове. Ето пример за такава директория:

<Directory /home/www/cgi-bin>

Options +ExecCGI

</Directory>

След това трябва да присвоите дадени разширения към CGI съдържанието:

AddHandler cgi-script cgi pl

След това трябва да напишете програма, чийто изход е форматиран по определен начин:

·         MIME заглавие – първото което трябва да връща вашата програма е заглавие от определен MIME тип, а именно text/html за HTML страници. Заглавието задължително завършва с два празни нови реда.

·         Изход в HTML формат – след заглавието трябва да следва валиден HTML код.

 

Ето и пример за такава програма писана на езика Perl:

#!/usr/bin/perl

#mycgitest.cgi

print „Content-type: text/html\n\n“;

print „<html><head></head><body>First CGI program</body>“;

За да се изпълни този файл трябва да са спазени следните условия:

·         да се намира в директорията /home/www/cgi-bin (която трябва да е собственост на потребителя с правата на който работи Web сървъра)

·         файла да има права за изпълнение от потребителя с които права работи сървъра

·         да има разширение .pl или .cgi

Накрая ще поговорим малко за сигурността на сървъра. На първо място е да укажете на сървъра да работи с права различни от тези на root потребителя. Това може да стане чрез директивите User и Group. След това трябва внимателно да обмислите кои директории може да показват соите файлове при липса на index.html. Може да забраните показването като премахнете от директивата Options опцията Indexes. Винаги проверявайте CGI скриптовете които пишете за грешки и/или пропуски, тъй като CGI скриптовете са едни от най-големите дупки в сигурността на Web сървъра. За да намалите вероятността от проблеми с CGI трябва да използвате обща директория зададена чрез директивата ScriptAlias. Позволяването да се стартират CGI скриптове от всички директории е много лоша идея.

Други проблеми носят SSI (Server Side Includes):

·         значително по-голямо натоварване на сървъра, тъй като в този случай той проверява цялата страница за SSI тагове

·         използването на 'exec cmd' в SSI, чрез което може да извикате произволен скрипт или програма. Тъй като тя се изпълнява с правата на потребителя с които работи сървъра трябва внимателно да следите какво се пуска с тови SSI таг.

Чрез файловете .htaccess можете да задавате различни права и достъп за всяка директория. Ако вашия сървър използва AllowOverride All, то потребителя може да запише в своята директория файл с такова име, който да компрометира сигурността на сървъра.

Стартирането на някои услуги на машина с работещ Web сървър може да даде повече права отколкото сте желали. Пример за това е използването на SAMBA сървър на машина с работещ Web сървър, туй като в определени случаи можете да предоставите достъп на целия свят до ресурсите на вътрешната мрежа. Стартирането на telnet и други подобни услуги не само ще намали сигурността на вашия Web сървър, но и на цялата машина като цяло. По принцип спазването на девиза „колкото по-малко, толкова по-добре“ е желателно когато говорим за стартирани услуги.

 

3. Сриптов език PHP за програмиране в интернет среда

"PHP: Hypertext Preprocessor" е скриптов език с отворен код, който се използва предимно за създаване на уеб приложения и може да се вгражда в HTML документи. Синаксисът на езика е заимстван от C, Java и Perl. Основната цел на този език е да предостави средства на уеб дизайнера за генериране на динамично съдържание

Пример за самостоятелен скрипт на PHP, който извежда в прозореца на браузъра "Здравей!":

Създайте текстов файл с име hello.php в директорията за уеб документите (напр: /var/www/html ) със следното съдържание:

<?php
   echo "Здравей!";
?>

Стартирайте скрипта като отворите адреса http://localhost/hello.php

Пример за скрипт на PHP, комбиниран с html код:

Създайте текстов файл с име hello2.php в директорията за уеб документите (напр: /var/www/html ) със следното съдържание:

<html>
<head>
<title>Това е пример</title>
</head>
<body>

<?php
echo "Здравейте, аз съм скрипт на PHP!";
?>

</body>
</html>

Стартирайте скрипта като отворите адреса http://localhost/hello2.php

 

Пример, който извежда служебна информация за PHP:

<?php phpinfo(); ?>

Пример за HTML форма:

<form action="action.php" method="POST">
Вашето име: <input type="text" name="name" />
Години: <input type="text" name="age" />
<input type="submit">
</form>

Пример за PHP скрипта action.php, който се извиква от формата:

<?php
echo "Здравей, ",$_POST["name"],"<br>";
echo "Ти си на ",$_POST["age"], " години.";
?>

Синтаксис на езика PHP:

<?php ... ?>  - отметки, които задават началото и края на PHP скрипта

$x, $y - променливи

# - коментар на един ред

/* .... */  - коментар, който може да бъде на няколко реда