Серверы · 7 min read · Oct 08, 2025
Идеальный балансировщик нагрузки и высокодоступный веб-кластер с 2 серверами, работающими под Xen на Ubuntu 8.04 Hardy Heron - Страница 2
7. Apache/PHP5/Ruby (web1, web2)
7.1 Установка программного обеспечения
Теперь мы устанавливаем Apache:
apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert
Далее мы устанавливаем PHP5 и Ruby (оба как модули Apache):
apt-get install libapache2-mod-php5 libapache2-mod-ruby php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
7.2 Конфигурация Apache
Далее мы редактируем /etc/apache2/mods-available/dir.conf:
vi /etc/apache2/mods-available/dir.conf
и изменяем строку DirectoryIndex:
#DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.php3 index.pl index.xhtml
Теперь нам нужно включить некоторые модули Apache (SSL, rewrite, suexec и include):
a2enmod ssl
a2enmod rewrite
a2enmod suexec
a2enmod include
Перезагрузим конфигурацию Apache:
/etc/init.d/apache2 force-reload
Мы добавим некоторые домены в файл конфигурации vhost :
mkdir /var/www/example
mkdir /var/www/yoursite
mkdir /var/www/example/web
mkdir /var/www/example/ssl
mkdir /var/www/yoursite/web
mkdir /var/www/yoursite/ssl
echo “Include /etc/apache2/vhosts.conf” >> /etc/apache2/apache2.conf
vi /etc/apache2/vhosts.conf
Файл конфигурации должен выглядеть так :
#NameVirtualHost 192.168.1.106:80
#
# ServerName localhost
# ServerAdmin root@localhost
# DocumentRoot /var/www/sharedip
#
#NameVirtualHost 192.168.1.107:80
#
# ServerName localhost
# ServerAdmin root@localhost
# DocumentRoot /var/www/sharedip
#
###EXAMPLE.COM###
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/example.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/example.com-error.log
Redirect /webmail http://www.example.com:81/squirrelmail
Redirect /squirrelmail http://www.example.com:81/squirrelmail
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/example.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/example.com-error.log
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
### Раскомментируйте эту часть, если вы будете использовать SSL на этом виртуальном хосте.
### Не забудьте создать или скопировать файлы сертификатов перед перезапуском apache.
#
#
# ServerName example.com
# ServerAlias www.example.com
# DocumentRoot /var/www/example/web
# SetEnvIf Request_URI \.jpg dontlog
# SetEnvIf Request_URI \.gif dontlog
# SetEnvIf Request_URI \.css dontlog
# SetEnvIf Request_URI \.png dontlog
# SetEnvIf Request_URI \.txt dontlog
# CustomLog /var/log/apache2/example.com-access.log combined env=!dontlog
# ErrorLog /var/log/apache2/example.com-error.log
# SSLEngine on
# SSLCertificateFile /var/www/example/ssl/www.example.com.crt
# SSLCertificateKeyFile /var/www/example/ssl/www.example.com.key
# SSLCertificateChainFile /var/www/example/ssl/www.example.com.key.org
# Redirect /webmail http://www.example.com:81/squirrelmail
# Redirect /squirrelmail http://www.example.com:81/squirrelmail
# ErrorDocument 400 /error/invalidSyntax.html
# ErrorDocument 401 /error/authorizationRequired.html
# ErrorDocument 403 /error/forbidden.html
# ErrorDocument 404 /error/fileNotFound.html
# ErrorDocument 405 /error/methodNotAllowed.html
# ErrorDocument 500 /error/internalServerError.html
# ErrorDocument 503 /error/overloaded.html
#
#
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/example.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/example.com-error.log
Redirect /webmail http://www.example.com:81/squirrelmail
Redirect /squirrelmail http://www.example.com:81/squirrelmail
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/example.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/example.com-error.log
Redirect /webmail http://www.example.com:81/squirrelmail
Redirect /squirrelmail http://www.example.com:81/squirrelmail
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
###YOURSITE.COM###
ServerName yoursite.com
ServerAlias www.yoursite.com
DocumentRoot /var/www/yoursite/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/yoursite.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/yoursite.com-error.log
Redirect /webmail http://www.yoursite.com:81/squirrelmail
Redirect /squirrelmail http://www.yoursite.com:81/squirrelmail
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
ServerName yoursite.com
ServerAlias www.yoursite.com
DocumentRoot /var/www/yoursite/web
SetEnvIf Request_URI \.jpg dontlog
SetEnvIf Request_URI \.gif dontlog
SetEnvIf Request_URI \.css dontlog
SetEnvIf Request_URI \.png dontlog
SetEnvIf Request_URI \.txt dontlog
CustomLog /var/log/apache2/yoursite.com-access.log combined env=!dontlog
ErrorLog /var/log/apache2/yoursite.com-error.log
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
### Раскомментируйте эту часть, если вы будете использовать SSL на этом виртуальном хосте.
### Не забудьте создать или скопировать файлы сертификатов перед перезапуском apache.
#
#
# ServerName yoursite.com
# ServerAlias www.yoursite.com
# DocumentRoot /var/www/yoursite/web
# SetEnvIf Request_URI \.jpg dontlog
# SetEnvIf Request_URI \.gif dontlog
# SetEnvIf Request_URI \.css dontlog
# SetEnvIf Request_URI \.png dontlog
# SetEnvIf Request_URI \.txt dontlog
# CustomLog /var/log/apache2/yoursite.com-access.log combined env=!dontlog
# ErrorLog /var/log/apache2/yoursite.com-error.log
# SSLEngine on
# SSLCertificateFile /var/www/yoursite/ssl/www.yoursite.com.crt
# SSLCertificateKeyFile /var/www/yoursite/ssl/www.yoursite.com.key
# SSLCertificateChainFile /var/www/yoursite/ssl/www.yoursite.com.key.org
# Redirect /webmail http://www.yoursite.com:81/squirrelmail
# Redirect /squirrelmail http://www.yoursite.com:81/squirrelmail
# ErrorDocument 400 /error/invalidSyntax.html
# ErrorDocument 401 /error/authorizationRequired.html
# ErrorDocument 403 /error/forbidden.html
# ErrorDocument 404 /error/fileNotFound.html
# ErrorDocument 405 /error/methodNotAllowed.html
# ErrorDocument 500 /error/internalServerError.html
# ErrorDocument 503 /error/overloaded.html
#
# Опции “SetEnvIf Request_URI … “ и “env=!dontlog” предназначены для того, чтобы сделать логи более чистыми, они не будут записывать доступ к изображениям и css файлам.
Я использую файлы shareip ISPConfig и страницы ошибок : ЗДЕСЬ
Измените их под свои нужды.
Сначала установите wget :
apt-get install wget
cd /var/www
wget http://www.blogama.org/errorpages.tar.gz
tar -zxvf errorpages.tar.gz
rm -rf errorpages.tar.gz
chmod 755 /var/www/error/ -R
cp -av /var/www/error/ /var/www/example/web/
cp -av /var/www/error/ /var/www/yoursite/web/
Теперь мы отредактируем файл /etc/apache2/sites-available/default, чтобы он не записывал запросы ldirectord (балансировщика нагрузки) :
mv /etc/apache2/sites-available/default /etc/apache2/sites-available/default.bak
vi /etc/apache2/sites-available/default
И вставьте это :
NameVirtualHost *
ServerAdmin webmaster@localhost
DocumentRoot /var/www/
Options FollowSymLinks
AllowOverride None
Options FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /var/log/apache2/error.log
# Возможные значения: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
#CustomLog /var/log/apache2/access.log combined
SetEnvIf Request_URI "^/ldirectord\.php$" dontlog
SetEnvIf Request_URI "token" dontlog
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
SetEnvIf Request_URI \.ico dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog
ServerSignature On
Alias /doc/ "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
Теперь мы откроем некоторые порты в apache, которые будут использоваться позже :
vi /etc/apache2/ports.conf
Listen 80
Listen 81
Listen 10001
Listen 20001
Listen 443
Порты 10001 и 20001 будут использоваться для мониторинга. Порт 81 будет для веб-почты.
Мы должны перезапустить apache, чтобы применить внесенные изменения :
/etc/init.d/apache2 restart
7.3 Подготовка узлов apache для балансировки нагрузки
Наконец, мы должны настроить наши узлы кластера Apache web1.example.com и web2.example.com для приема запросов на виртуальных IP-адресах 192.168.1.106 и 192.168.1.107.
apt-get install iproute
Добавьте следующее в /etc/sysctl.conf:
vi /etc/sysctl.conf
# Включить конфигурацию опции arp_ignore
net.ipv4.conf.all.arp_ignore = 1
# Когда запрос arp получен на eth0, отвечать только если этот адрес
# настроен на eth0. В частности, не отвечать, если адрес
# настроен на lo
net.ipv4.conf.eth0.arp_ignore = 1
# То же самое для eth1, добавьте для всех интерфейсов ARPing
#net.ipv4.conf.eth1.arp_ignore = 1
# Включить конфигурацию опции arp_announce
net.ipv4.conf.all.arp_announce = 2
# При выполнении ARP-запроса, отправленного через eth0, всегда используйте адрес, который
# настроен на eth0 в качестве исходного адреса ARP-запроса. Если это
# не установлено, и пакеты отправляются через eth0 для адреса, который находится на
# lo, и требуется запрос arp, то будет использоваться адрес на lo.
# Поскольку исходный IP-адрес ARP-запросов записывается в кэш ARP на
# целевом устройстве, это имеет эффект объявления этого адреса. Это
# нежелательно в данном случае, так как адреса на lo на реальных серверах должны
# объявляться только linux-director.
net.ipv4.conf.eth0.arp_announce = 2
# То же самое для eth1, добавьте для всех интерфейсов ARPing
#net.ipv4.conf.eth1.arp_announce = 2Затем выполните:
sysctl -p
Добавьте этот раздел для виртуального IP-адреса в /etc/network/interfaces:
vi /etc/network/interfaces
auto lo:0
iface lo:0 inet static
address 192.168.1.106
netmask 255.255.255.255
pre-up sysctl -p > /dev/null
auto lo:1
iface lo:1 inet static
address 192.168.1.107
netmask 255.255.255.255
pre-up sysctl -p > /dev/nullЗатем выполните:
Обратите внимание: после следующего шага вы, вероятно, получите эту ошибку: SIOCSIFFLAGS: Не удается назначить запрашиваемый адрес
Это нормальная ошибка, и вы можете ее игнорировать.
ifup lo:0
ifup lo:1
Если вы измените IP на более позднем этапе, рекомендуется выполнить ifup lo:0, затем ifdown lo:0, а затем снова ifup lo:0
Наконец, мы должны создать файл ldirectord.php. Этот файл запрашивается двумя узлами балансировщика нагрузки постоянно, чтобы они могли видеть, работают ли два узла Apache вместе с MySQL. Я предполагаю, что корневая директория основного веб-сайта apache на web1 и web2 - это /var/www, поэтому мы создаем файл /var/www/ldirectord.php:
vi /var/www/ldirectord.php
и копируем это :
Позже мы настроим MySQL с локальным доступом для пользователя “ldirectord”, сейчас файл не будет работать.
Get new posts in your inbox
No spam. Unsubscribe anytime.