Приручаємо дикого індіанця: 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, то звертайтеся за нею за адресою:

http://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>

*

*