Приручаємо дикого індійця: Apache, Сервери, Інтернет-технології, статті

Данила Данилов, Мережеві рішення

У даній статті я хотів би розглянути кілька питань з мініатюрної налаштування Apache HTTP Server: будуть розглянуті питання щодо використання найбільш популярних freeware продуктів: Apache, SSL і http-акселерації.

Отже, приступимо-с. Нерідко можна зустріти середньостатистичний офісний сервер поставлений під Linux, на дохлий 486 машині, яка виконує всі функції internet сервера і плюс до всього згладжує взаємодія локальних користувачів з глобальною мережею і всіма наданими нею сервісами. А часто буває так, що цей роботяга виконує функції веб-сервера. Все б добре і відмінно працює, скажете ви. Звичайно ж, але ж у деяких web-сервер обробляє не два запиту в день, а кілька десятків тисяч, як і було в моєму випадку. Мріяти про те, що начальство зволить поміняти машину, було справою абсолютно марним, тоді я вирішив попрацювати напилком в самому софті, що в принципі принесло свої плоди.
Перше за що я взявся це за бідолаху apache, якому доводилося “шарудіти” по диску постійно, то потім щоб пропарсіть shtml, то потім щоб виконати забаганки server-side додатків. Причому робити це при будь-якому і кожному запиті користувача. Розкривши товсті розумні книжки “Linux Encyclapedia” і “Linux Internet Server”, відкривши мануали, я взявся за роботу.

http-акселерація

Спочатку Apache, як ви розумієте працює, як web-сервер, але за допомогою нехитрих маніпуляцій його можна перемкнути в режим http-акселерації. Сама суть механізму зводитися до наступного: є frontend-сервер, який відповідає на запити користувачів та кешує інформацію і є backend сервер, який займається генерацією сторінок.
Перш ніж чогось рівняти у вашому працюючому софті треба перевірити за якими модулями скомпільований ваш apache, це робиться просто:

[root bin]#./httpd -l 
Compiled-in modules: 
	http_core.c 
	mod_charset.c 
........ 
	mod_proxy.c 
........

і так далі. Він обов’язково повинен бути зібраний з модулем mod_proxy. Отже, є якийсь хост lnx.open.by, веб-сервер встановлений на якому буде піддаватися всіляким знущань і турбо-прискорення ;). Вибираємо будь-який вільний порт для організації backend сервера і переводимо існуючий сервер на роботу через цей порт. А робиться це тільки для того, щоб відключити генерацію логів, щоб не вводити в оману аналізатори оних.
Ось приблизний опис вашого існуючого сервера (я сподіваюся він у вас простроена через vhost?). (IP адреси й імена хостів природно вигадані):

<VirtualHost 192.168.0.1:80> 
ServerName lnx.open.by 
DocumentRoot /home/httpd/html/lnx-server 
ServerAdmin admin@lnx.open.by 
ErrorLog /var/log/httpd/lnx-server-errorlog 
CustomLog /var/log/httpd/lnx-server-accesslog combined 
</VirtualHost>

Для побудова backend, міняємо на наступне:

<VirtualHost 192.168.0.1:8081> 
ServerName lnx.open.by 
DocumentRoot /home/httpd/html/lnx-server 
ServerAdmin admin@lnx.open.by 
</VirtualHost>

Тепер йдемо в httpd.conf для внесення і там деяких правок:


Listen 8081

# Тим самим ми дозволяємо з’єднуватися з 8081 портом і обробляти запити приходять на нього.


ProxyRequests On

# Включаємо прокси


ProxyVia On

# Дозволяємо передавати відомості про те, від кого прийшов запит


CacheRoot “/usr/local/apache/cache/”

# Тут у нас буде зберігатися сам кеш


CacheSize 50000

# Розмір кеша вказуємо в кілобайтах


CacheGcInterval 2

# Інтервал у годинах, після закінчення якого буде перевірятися ліміт обсягу кешу і необхідність видалення старих сторінок


CacheMaxExpire 2

# Максимальний час, який станиці можуть лежати в кеші.


NoConcurrentCacheUpdates On

# Дозволяє оновлення кешу різними програмами.
Цього має вистачити по ідеї. Якщо вас интерисует більш детальна інформація про модуль mod_proxy, то звертайтесь за нею за адресою:

www.apache.org/docs/mod/mod_proxy.html 

Тепер займемося “малюванням” frontend сервера.

<VirtualHost 192.168.0.1:80> 
ServerName lnx.open.by 
ProxyPass / http://192.168.0.1:8081/ 
ProxyPassReverse / http://192.168.0.1:8081/ 
CacheRoot "/usr/local/apache/cache/" 
ErrorLog /var/log/httpd/lnx-server-errorlog 
CustomLog /var/log/httpd/lnx-server-accesslog combined 
NoCache chat 
</VirtualHost>

Тепер створюємо каталок / usr / local / apache / cache / с повними правами для користувача від імені якого запускається Apache сервер, зазвичай це nobody.

[root bin]# mkdir /usr/local/apache/cache 
[root bin]# chown nobody.nobody /usr/local.apache/cache

Прошу зауважити, що кеш можна створювати в будь-якому місці файлової системи.
Власне, строчки починаються з Proxy і кажуть акселератора оброщаться за вихідними сторінками розташований на 8081 порту. Ще одне маленьке зауваження: ніхто вам не забороняє замість рядки:

ProxyPass / http://192.168.0.1:8081/

Написати щось таке:

ProxyPass /info http://info.lnx.open.by:8081/

І при зверненні користувача до http://lnx.open.by/info він отримає дані з http://info.lnx.open.by. Це іноді буває корисним при асоціацій кількох серверів в один.
Команда NoCache вказує на ті слова в URL, при зустрічі яких, інформація не буде кешуватися на диску. Таке може знадобитися для бистрообновляющіхся сторінок, які не надають великого навантаження на сервер.
Ось власне і все, за умови, що налаштований все у вас правильно. І після перезапуску сервера, всі запити будуть прокешіровани. Перевірити це дуже легко.

[root@lnx home]# cd /usr/local/apache/cache 
[root@lnx cache]# ls 
2 8 E H J M O R U W _ c i v 
3 B G I L N P T V Z b h j z 
[root@lnx cache]#

А тепер типізований розглянемо, як же все таки працює ця зв’язка. На 80-й порт за адресою 192.168.0.1 приходить запит. Apache розбирає його і дивиться, для якого віртуального сервера він призначений. Якщо для lnx.open.by, проксі розбирає запит і дивиться в кеші, не робив чи хто такий запит раніше. Якщо робили і час “протуханія” сторінки ще не підійшло, то просто віддаємо закешовану сторінку і вагу. Якщо не робили або сторінка протухла “, до робить запит до backend-серверу на 8081-й порт і кешує заново видану сторінку. Все дуже просто і надійно.

SSL для Apache HTTP Server

Отже, тепер ваш “індіанець” неміряно швидкий і непогано б йому бути нактолько же захищеним і вміти захищати інших. (Це так – Алігор 😉 Спробуємо прикрутити до нього SSL.
Спочатку нам необхідний сам Apache. Якщо у вас вже є зібране і працює дерево apache, то скопіюйте його в безпечне місце. Якщо ні, то витягніть останню версію Apache і розгорніть його.
Будемо розглядати настройку на базі наступних пакетів:

ftp://ftp.modssl.org/source/mod_ssl-2.6.4-1.3.12.tar.gz

ftp://ftp.openssl.org/source/openssl-0.9.5a.tar.gz
і безпосередньо самого Apache 1.3.12.
Робимо з усім цим наступне, тим самим розпаковуємо архіви:

[root@lnx tmp]# gzip -d -c mod_ssl-2.6.4-1.3.12.tar.gz | tar xvf - 
[root@lnx tmp]# gzip -d -c openssl-0.9.5a.tar.gz | tar xvf -

Йдемо далі:

[root@lnx tmp]# cd openssl-0.9.5a 
[root@lnx openssl-0.9.5a]#./config 
[root@lnx openssl-0.9.5a]# make

Отконфигурировать і зібрали openssl, пакет, який і буде забезпечувати шифрування. Я рекомендую дати ще команду make install, після якої в / usr / local / ssl лежатиме це пакет.
Далі …

[root@lnx openssl-0.9.5a]# cd.. 
[root@lnx tmp]# cd mod_ssl-2.6.4-1.3.12 
[root@lnx mod_ssl-2.6.4-1.3.12]#./configure -with-apache=../apache_1.3.12 
       -with-ssl=../openssl-0.9.5a -prefix=/usr/local/apache)

Цими командами ви включили модуль mod_ssl в число зібраних модулів для Apache. (В нашому випадку Apache знаходитися в директорії: tmp/apache_1.3.12)
Тепер просто перейдіть в каталог з Apache і скажіть make – всі необхідні модулі будуть зібрані. Так само, якщо у вас раніше були зібрані нестандартні модулі, як у мене, вони нікуди не зникнуть і будуть теж вкомпіліровани.
Далі ….

make certificate

На всілякі запитання можна особливо ретельно могз не напружувати, а вводити будь-які паролі або просто тиснути Enter, тим самим ви сгенеріруете свої сертефікати.

make install

Цією командою ви інсталюєте Apache в призначене для нього місце (/ usr / local / apache).
Все, можете спробувати запустити apache командою

/usr/local/apache/bin/apachectl startssl

Якщо все запустилося, а перевірити можна так:

ps ax|grep ht

у відповідь має з’явитися з’являються httpd-DSSL, то можете себе привітати – воно зібралося.
Тепер треба трохи подпілість наш apache.
Отже, почнемо конфігурувати, відкриваємо в редакторі файл httpd.conf.

Listen 443

NameVirtualHost 192.168.0.1:443

Ці команди вказують Apache слухати 443 порт (стандартний порт для secure http (https)) і обслуговувати на ньому віртуальні сервери.
Тепер додаємо опис віртуального сервера.

<VirtualHost 192.168.0.1:443> 
SSLEngine on 
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt 
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key 
SSLLog /usr/local/apache/logs/ssl_engine_log 
SSLLogLevel warn 
SSLOptions +StdEnvVars

Тут добовлять стандартні для цього місця директиви 😉

</VirtualHost>

Тепер треба перезапустити сервер, в перший раз після перезапуску він у вас повинен запитати парольний фразу. Але слід звернути увагу, що це відбувається лише один раз і таке не типово для вже робочого https-сервера. Тепер робимо следуещее:
Входимо в каталог з ssl.key

cp server.key server.key.org

openssl rsa -in server.key.org -out server.key

Вводимо пароль для дешифрування

chmod 400 server.key

І закриваємо файл з відритим ключем від сторонніх очей, все сервер більше не буде питати пароль. На даному етапі вже повинен працювати SSL на повну котушку. Тобто, набираючи https://ваш.хост.ltd ви повинні отримувати запит браузера на використання цього сертифіката.
Для того, щоб трошки автоматизувати процес запуску Apache разом з SSL подредактіруем bin / apachectl. Виправимо в ньому умову start на startold, а startssl на просто start. Потім скопіюємо його в / etc / rc.d / init.d / httpd. Тепер за замовчуванням при завантаженні сервера, буде запускатися Apache з підтримкою SSL.
Щоб не мучитися з PATH, зробимо, щоб openssl запускався нормально.

cd /usr/local/bin

ln -s /usr/local/ssl/bin/openssl openssl

Отже, тепер будемо генерувати нормальні сертифікати.
Генеруємо ключ.

openssl genrsa -des3 -out server.key 1024

На даному етапі ми створили server.key, тепер генеруємо запит в службу верифікації.

openssl req -new -key server.key -out server.csr

Будьте обережні у відповідях, адже це потім побачать все. Якщо помилилися, все можн повторити заново. CommonName – це адреса хоста без http://.
Все, якщо ви отримали наступний напис, то запит згенерований правильно:

You now have to send this Certificate Signing Request (CSR)

to a Certifying Authority (CA) for signing

Але ми не буржуї, підписувати у нас нікому, тому ми буде самі підписувати себе. Хоча якщо у вас є гроші і вам необхідно підписати свій сертифікат саме у глобальних авторизаційних центрів, то на modssl.org Ви знайдете всі необхідні адреси та посилання.

openssl genrsa -des3 -out ca.key 1024

openssl req -new -x509 -days 365 -key ca.key -out ca.crt

Генеруємо підпис авторизаційного центру на рік (можна і на більше), процедура полность схожа з генерацією ключа.
Копіюємо sign.sh з pkg.contrib з пакету mod_ssl в каталог з ключами
І підписуємо свій же запит

./sign.sh server.csr

Отримавши напис, що містить

Now you have two files: server.key and server.crt. These now can be used as following

Починаємо радіти, все зібрано так, як треба. Копіюємо server.key і server.crt на місце старих, але в каталозі c crt файлом Makefile не чіпаємо. Скопіювавши новий.crt файл, наберіть make в цьому ж каталозі – Він створить якийсь хеш файл.
Все, тепер перезапустіть Apache і можете насолоджуватися тим, що ви зробили власний WWW сервер, захищений за допомогою SSL.
Перевірити захищеність ви можете подивившись інформацію про сертифікати або з’єднанні в info-вікнах браузерів. Якщо ви їм не довіряєте, то дайте команду

openssl s_client -connect localhost:443 -state -debug

Вона виведе повністю всю інформацію, яку вона зможе вичавити з вашого SSL сервера.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*