다음 이전 차례

8. 가상의 웹

8.1 Virtuald와 실행하기

권하지 않음!(Not recommended)

아파치는 기본적으로 가상의 도메인을 위한 지원을 해준다. 아파치는 내가 내부의 가상 도메인 기작을 사용하는 것을 권하는 유일한 프로그램이다. inetd를 통해서 어떤 프로그램이 실행되는 것은 많은 대가를 필요로 하며, 프로그램이 시작하기 위해서는 항상 inetd가 시작되어야 한다는 단점이 있다. 이런 결과로 반응 시간이 느려질 것인데, 다른 네트워크 서비스에서는 이런 느려짐이 견딜만 하지만 웹 서비스에서는 그렇지 않을 것이다. 아파치는 또한 너무 많은 요청이 들어오는 경우 제어를 할 수 있는 기능을 가지고 있는데, 이 기능은 크지 않은 규모의 사이트에서도 중요한 문제가 될 수 있다.

간단히 말하면, 아파치 서버를 virtuald와 함께 사용하여 가상 시스템을 구축하는 것은 정말 안좋은 생각이다. virtuald가 지향하는 것은 제공하고자 하는 서비스가 내부에서 가상 공간에 대한 만족스러운 지원을 하지 않을 경우에 부족한 부분을 채우는 일이다. virtuald가 이미 완벽하게 가상 시스템을 지원하는 좋은 코드를 대체하기 위한 것은 아니다.

물론 위의 충고도 꼭 그렇개 하고 말리라 생각하는 무모한 사람들에게는 별 효용이 없을 것이지만.

Inetd

/etc/inetd.conf 를 편집하라.

vi /etc/inetd.conf # Add this line
www stream tcp nowait www /usr/local/bin/virtuald \
        virtuald /virtual/conf.www httpd -f /var/www/conf/httpd.conf

Httpd.conf

/var/www/conf/httpd.conf를 편집하라.

vi /var/www/conf/httpd.conf # Or wherever you put the Apache config files
It should say:
ServerType standalone

Replace it with:
ServerType inetd

설정

그리고는 아파치 서버을 일반적으로 설정하는 과정을 수행한다.

Httpd.init

inetd를 통해서 아파치가 실행될 때에는 httpd.init은 필요없다.

8.2 Apache VirtualHost와 같이 실행하기

아파치는 세 개의 설정 파일 - access.conf , httpd.conf , srm.conf을 가진다. 아파치의 새로운 버전은 설정 파일이 세 개일 필요는 없다. 하지만, 세 개의 설정파일로 나누어져 있는 것이 훨씬 관리하고 설정하기가 쉽다고 생각되기 때문에 이 하우투 문서에서는 이 스타일을 기준으로 설명하겠다.

Access.conf

이 설정파일은 웹 디렉토리 구조에서 접근을 통제하는데 사용된다. 여기 각각의 도메인에 어떻게 서로 다른 옵션을 설정할 수 있는지를 보여주는 예제 설정파일이 있다.

# /var/www/conf/access.conf: Global access configuration

# Options are inherited from the parent directory
# Set the main directory with default options
<Directory />
AllowOverride None
Options Indexes
</Directory>

# Give one domain a passwd protected directory
<Directory /virtual/domain1.com/var/www/html/priv>
AuthUserFile /var/www/passwd/domain1.com-priv
AuthGroupFile /var/www/passwd/domain1.com-priv-g
AuthName PRIVSECTION
AuthType Basic
<Limit GET PUT POST>
require valid-user
</Limit>
</Directory>

# Give another domain Server Side Includes
<Directory /virtual/domain2.com/var/www/html>
Options IncludesNOEXEC
</Directory>

Httpd.conf

이 설정파일은 아파치 서버의 주된 옵션을 관리한다. 여기 각각의 도메인에 대해서 서로 다른 옵션을 설정하는 것에 대한 예제 파일이 있다.

# /var/www/conf/httpd.conf: Main server configuration file

# Begin: main conf section

# Needed since not using inetd
ServerType standalone

# Port to run on
Port 80

# Log clients with names vs IP addresses
HostnameLookups on

# User to run server as
User www
Group www

# Where server config, error and log files are
ServerRoot /var/www

# Process Id of server in this file
PidFile /var/run/httpd.pid

# Internal server process info
ScoreBoardFile /var/www/logs/apache_status

# Timeout and KeepAlive options
Timeout 400
KeepAlive 5
KeepAliveTimeout 15

# Number of servers to run
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 30

# End: main conf section

# Begin: virtual host section

# Tell server to accept requests for ip:port
# I have one for each IP needed so you can explicitly ignore certain domains
Listen 10.10.10.129:80
Listen 10.10.10.130:80

# VirtualHost directive allows you to specify another virtual
# domain on your server.  Most Apache options can be specified
# within this section.
<VirtualHost www.domain1.com>

# Mail to this address on errors
ServerAdmin webmaster@domain1.com

# Where documents are kept in the virtual domain
DocumentRoot /virtual/domain1.com/var/www/html

# Name of the server
ServerName www.domain1.com

# Log files Relative to ServerRoot option
ErrorLog logs/domain1.com-error_log
TransferLog logs/domain1.com-access_log
RefererLog logs/domain1.com-referer_log
AgentLog logs/domain1.com-agent_log

# Use CGI scripts in this domain
ScriptAlias /cgi-bin/ /var/www/cgi-bin/domain1.com/
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
</VirtualHost>

<VirtualHost www.domain2.com>

# Mail to this address on errors
ServerAdmin webmaster@domain2.com

# Where documents are kept in the virtual domain
DocumentRoot /virtual/domain2.com/var/www/html

# Name of the server
ServerName www.domain2.com

# Log files Relative to ServerRoot option
ErrorLog logs/domain2.com-error_log
TransferLog logs/domain2.com-access_log
RefererLog logs/domain2.com-referer_log
AgentLog logs/domain2.com-agent_log

# No CGI's for this host
</VirtualHost>
# End: virtual host section

Srm.conf

이 설정파일은 어떤 요청에 대해 서비스를 제공할 것인지와 그 형식이 어떻게 될 것인지에 대한 것을 조절한다. 가상 도메인에 대해서 이것을 바꿀 필요는 없다. 아파치에서 기본적으로 제공하는 예제 파일 형식 그대로 가상 시스템에 적용해도 작동할 것이다.

Httpd.init

httpd.init 파일에 대해서 특별히 해줄 것은 없다. 아파치의 표준적인 설정을 이용하라.

8.3 파일 서술자 오버플로우(File Descriptor Overflow)

경고

이것은 오직 독립적(standalone style)인 아파치 서버에만 해당된다. inetd를 통해서 서버가 실행될 때에는 다른 도메인과 연관이 없기 때문에 모든 파일 서술자 테이블을 갖는다.

아파치 서버가 여는 모든 로그 파일들은 프로세스에 대한 또다른 파일 서술자 (file descriptor)가 된다. 리눅스에서는 각각의 프로세스에 대해서 256개 까지 파일 기술자를 가질 수 있다는 제약이 있다. 즉 여러개의 도메인을 사용한다면 구먼쿰 많은 파일 기술자들이 필요하게 된다. 만약 하나의 아파치 서버 프로세스에서 너무 많은 도메인을 설정하고 사용한다면 이 테이블이 넘쳐날(overflow) 수도 있다. 이것은 특정한 로그가 작동하지 않을 수도 있으며, CGI가 실패할 수도 있다는 것을 의미한다.

여러개의 아파치 서버

만약 한 도메인에 대해서 다섯개의 파일 기술자를 가지고 있다고 가정하면 당신은 아파치 서버에서 50개의 도메인을 아무 문제없이 실행시킬 수 있다. 하지만, 만약 이런 상황에서 문제가 발생한다면 /var/www1에 도메인1-도메인25 의 아파치 서버를 할당하고, /var/www2에 도메인26-도메인50의 아파치 서버를 할당하는 방식을 사용할 수 있다. 이것은 각각의 서버에 대해 자신만의 설정과 에러, 로그 디렉토리를 갖게 된다. 각각의 서버는 또한 자신만의 Listen과 VirtualHost 디렉토리를 가지고 있어야 한다. httpd.init 파일에서도 여러개의 서버를 설정해 주어야 한다는 사실을 잊지 말라.

8.4 하나의 IP에서 서버 공유

IP 절약하기

HTTP(HyperText Transfer Protocol) 버전 1.1에는 서버의 이름을 클라이언트에 알리는 기능이 추가되었다. 이것은 클라이언트가 서버를 찾을 때 IP 어드레스로 부터 찾을 필요가 없다는 것을 의미한다. 따라서 두개의 가상 서버가 같은 IP 어드레스를 가지고 서로 다른 웹 사이트로 꾸밀 수 있다. 아파치 설정은 위와 똑같은데, 단지 서로 다른 Listen을 지시할 필요가 없다는 점만 다르다. (두개의 도메인이 같은 IP를 쓰기 때문에 Listen 역시 같게 된다.)

결점

오직 문제가 되는 점은 virtuald가 도메인을 구분하기 위해서 IP 어드레스를 사용한다는 점이다. 지금 현재의 virtuald 형태로는 각각의 도메인에 대한 스풀 디렉토리를 chroot로 다르게 설정할 수 없다. 따라서, 메일은 하나의 IP에 대해서만 반응할 수 있기 때문에 각각의 도메인에 대해서 독자적인 스풀 디렉토리를 갖는 것은 불가능하다. IP를 공유하는 모든 웹 클라이언트는 IP의 스풀 디렉토리 역시 공유해야 한다. 또 이것은 사용자이름을 복사해서 사용하는 것에 대한 문제를 언급하게 하지만, 이정도는 IP를 공유함에 있어서 필요한 대가일 것이다.

8.5 더 많은 정보

이 하우투는 단지 어떻게 가상 시스템을 아파치 웹 서버에서 제공할 수 있는지만을 보여주고 있다. 대부분의 웹 서버들은 비슷한 인터페이스를 갖는다. 가상 웹 호스팅에 대해 더 많은 내용을 알고싶다면 WWW HOWTO, 를 참고하거나, 아파치에 대한 문서들 ( Apache 사이트에서 구할 수 있다) 혹은 ApacheWeek를 찾아보라.


다음 이전 차례