서버 구성 · 6 min read · Oct 08, 2025

완벽한 로드 밸런싱 및 고가용성 웹 클러스터: Xen을 실행하는 2대의 서버와 Ubuntu 8.04 하디 헤론 - 페이지 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 파일에 대한 접근을 기록하지 않습니다.

먼저 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
# eth0에서 arp 요청이 수신되면, 해당 주소가
# 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
# eth0를 통해 전송된 ARP 요청을 만들 때 항상
# eth0에 구성된 주소를 ARP 요청의 소스 주소로 사용합니다. 이 설정이 없으면,
# lo에 있는 주소에 대해 패킷이 eth0로 전송되고 ARP 요청이 필요할 경우,
# lo의 주소가 사용됩니다. ARP 요청의 소스 IP 주소가
# 대상의 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 노드가 여전히 실행 중인지 확인하기 위해 반복적으로 요청합니다. 웹1과 웹2의 주요 Apache 웹사이트의 문서 루트가 /var/www라고 가정하므로, /var/www/ldirectord.php 파일을 생성합니다:

vi /var/www/ldirectord.php

그리고 다음을 복사합니다:

나중에 MySQL을 “ldirectord” 사용자로 로컬 접근을 설정할 것입니다. 지금은 파일이 작동하지 않을 것입니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.