Лекция 10
Конфигуриране на системата. Стартиране и конфигурация на Apache Web сървър.
Apache Web Server е най-често използвания Web сървър в Интернет. Според Netcraft той се използва в над 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 така, че множество сайтове да работят на един сървър. Това става чрез задаване на виртуални хостове.
След като разбрахме защо Apache е предпочитан Web сървър е време да разберем основите на неговата конфигурация.
Преди да започнем с конфигурацията трябва да проверите дали имате инсталиран Apache. Това може да стане със следната команда:
#whereis apachectl
apachectl: /usr/sbin/apachectl /usr/man/man8/apachectl.8.gz /usr/share/man/man8/apachectl.8.gz
Ако Вие имате изход подобен на този, то Apache е инсталиран на вашата система. В противен случай трябва да инсталирате Apache. Това може да стане както от бинарните пакети на вашата дистрибуция или от изходен код. В повечето случаи пакета е компилиран с повечето полезни опции и компилирането от изходен код е безсмислено. Ако все пак желаете да компилирате, то кода може да се свали от http://www.apache.org/dist/httpd/.
След като свалите кода трябва да го декомпресирате:
#tar zxvf apache_1.3.24.tar.gz
След това трябва да добавите група и потребител за работата на Apache:
#groupadd www
#useradd -g www www
След това чрез passwd -l трябва да заключите потребителя www, така че само root да има достъп до него.
След това трябва да се стартира скрипта ./configure , който да създаде файловете необходими за компилиране не сървъра. Този скрипт има множество полезни опции които може да се видят чрез:
#./configure --help
Ето и примерна конфигурация (възможно най-елементарна):
#./configure --prefix=/usr/local/apache --server-uid=www --server-gid=www \
>--htdocsdir=/home/www/htdocs \
>--cgidir=/home/www/cgi-bin \
>--enable-module=most \
>--enable-shared=max
След това трябва последователно да се изпълнят командите:
#make
#make install
След като е инсталиран, може да контролирате Apache с командата apachectl. Тя има следните опции:
start – стартира сървъра.
stop – спира сървъра.
restart – рестартира сървъра при промяна на конфигурацията.
fullstatus – предоставя пълна информация за сървъра в момента. Изисква инсталиран браузър lynx и активиран модул mod_status.
status – предоставя кратка информация за сървъра в момента. Изисква инсталиран браузър lynx и активиран модул mod_status.
graceful – елегантно рестартиране на сървъра. Ако не е стартиран, то чрез тази команда той се стартира.
configtest – проверява валидността на конфигурацията.
help – кратка помощна информация.
Сега е време за кратък преглед на основните конфигурационни директиви. Те се намират във файла /etc/apache/httpd.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 /home/www/htdocs>
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).
Третата секция в httpd.conf е Virtual Hosts. Чрез правилното конфигуриране на тази секция Вие ще можете да пуснете няколко Web сайта, които се хостват на един единствен Web сървър. Тези сайтове може да бъдат част от основния домейн или да не бъдат. Всеки отделен виртуален хост трябва да се поставя в своя собствена <VirtualHost></VirtualHost> секция. Вътре в нея се дефинират отделните директиви специфични за дадения виртуален хост. Виртуалните хостове могат да бъдат два типа IP базирани (IP-Based) и Именно базирани (Name-Based). Разликата между тях е, че при първия тип е необходимо за всеки виртуален сървър да се конфигурира отделен IP адрес. За разлика от него, при втория тип можете да конфигурирате множество виртуални сървъри на един единствен IP адрес. Важно е да се знае, че втория тип виртуални хостове не могат да работят в версия на HTTP по-ниска от 1.1.
Ето примерна конфигурация на IP-Based виртуален хост:
<VirtualHost 172.17.68.222>
ServerName steve.ulala.com
DocumentRoot /home/www/public_html/steve
</VirtualHost>
<VirtualHost 172.17.68.223>
ServerName pola.ulala.com
DocumentRoot /home/www/public_html/pola
</VirtualHost>
За да работи това е необходимо да конфигурирате вашия мрежови интерфейс да има повече от едно IP едновременно. Това може да стане така:
#ifconfig eth0:0 172.17.68.222
#ifconfig eth0:1 172.17.68.223
Разбира се, трябва да имате и валидни записи в DNS сървърите които да свързват steve.ulala.com и pola.ulala.com с 172.17.68.222 и 172.17.68.223. Това най-лесно може да стана като добавите следните редове в /etc/hosts:
172.17.68.222 steve.ulala.com
172.17.68.223 pola.ulala.com
Конфигурацията на Name-Based виртуални хостове е подобна. Преди секциите с отделните виртуални хостове, трябва да промените директивата:
NameVirtualHost 172.17.68.220
<VirtualHost 172.17.68.220>
ServerName steve.ulala.com
DocumentRoot /home/www/public_html/steve
</VirtualHost>
<VirtualHost 172.17.68.220>
ServerName pola.ulala.com
DocumentRoot /home/www/public_html/pola
</VirtualHost>
Съществена разлика има в редовете добавени в /etc/hosts:
172.17.68.220 steve.ulala.com
172.17.68.220 pola.ulala.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 сървър, но и на цялата машина като цяло. По принцип спазването на девиза „колкото по-малко, толкова по-добре“ е желателно когато говорим за стартирани услуги.