2009. 7. 16. 06:08

레드헷 리눅스에서 Apache + Oracle + PostgreSQL + MySQL + PHP + Tomcat + JAVA 서버구성3 (버추얼호스팅 Virtual hosting)


어느덧 아침이 밝아온다. jsp용 웹호스팅세팅만 끝나면 그동안 실현하고자 했던 웹서버 구현이 완성이 된다. 사용자 환경에 quata와 ftp,ssh만 적용하고 안정적인 회선과 IP만 공급되면 웹서버로서의 충분한 실현가치를 할수 있을것이라고 본다.

우선 테스트환경으로 별도의 DNS서버를 만들지 않고 사용자계정을 이용한 jsp서버를 완성한다.
http://ip/~account 식의 도메인이 붙을것이다.


테스트용 DNS서버를 만들어서 아파치의 버추얼호스트 기능과 함께 완벽하게 개별 도메인하에서 jsp가 작동하는지 알아보자.

1. user의 생성과 아파치설정 변경
/etc/skel디렉토리에 유져 등록시 자동 생성되는 파일이나 디렉토리를 정의후, 유져를 등록하면 편하다. jsp스크립트를 확인하기 위하여 skel디렉토리에 jsp코드로 된 파일을 생성하고 테스트용 유져를 등록했다.
테스트용이므로 test계정에는 php,html코드로 된 파일들도 생성한다.

[root@localhost ~]# cd /etc/skel
[root@localhost skel]# ls
public_html
[root@localhost skel]# vi public_html/index.jsp
<HTML>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>AKAS'S BLOG</title>
</head>

 <BODY>
  <h1><h1><% out.print("akasアカウントです"); %></h1><br /></h1>
  <h1>
http://bestakas.tistory.com <br /></h1>
  <h1>
http://snowrice.com<br /></h1>

 </BODY>
</HTML>

[root@localhost skel]# useradd test
[root@localhost skel]# passwd test
Changing password for user test.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@localhost skel]# useradd akas
[root@localhost skel]# passwd akas
Changing password for user akas.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@localhost skel]# chmod -R 755 /home/test
[root@localhost skel]# chmod -R 755 /home/akas
[root@localhost skel]# ls /home/akas
public_html
[root@localhost skel]# cd /home/test/public_html/
[root@localhost public_html]# cp index.jsp index.html
[root@localhost public_html]# vi index.php
<?='this is test'?>
아파치에서 사용자계정을 사용해서 사용자 디렉토리에 접근할수 있도록 설정해보자.
[root@test home]# vi /usr/local/httpd/conf/httpd.conf
# User home directories
Include conf/extra/httpd-userdir.conf
#Include문앞에 주석을 제거한다.
[root@test home]# /usr/local/httpd/bin/httpd -k restart


우선, http://ip/~test/index.php를 실행시켜본다.


php사용을 위해서 httpd.conf에서
 #JkMount /* loadbalancer
처럼 #주석을 주고 아파치를 재가동하면  정상출력된다. 즉 php스크립트가 먹힌다는 이야기다.
그럼 이제, index.html를 가동하여 보자.

위에 만들어놓은 jsp용 스크립트를 실행시켜보자.
index.jsp index.html을 public_html디렉토리에 이와같이 만든다.
 <HTML>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>AKAS'S BLOG</title>
</head>

 <BODY>
  <h1><h1><% out.print("akasアカウントです"); %></h1><br /></h1>
  <h1>
http://bestakas.tistory.com <br /></h1>
  <h1>
http://snowrice.com<br /></h1>

 </BODY>
</HTML>


http://ip/~test/http://ip/~test/index.jsp로 접속하여 보자.


하지만 html의 경우 jkmount를 시켰기 때문에 읽을수 없다. 그럼~! 계정용 디렉토리의 index.jspl가 정상출력되면 jsp연동이 잘되었다는 이야기이다. 이제 출력되게끔 설정에 들어가자.

test 계정에서
[test@localhost public_html]$ mkdir /home/test/public_html/WEB-INF
[test@localhost public_html]$ exit
exit
[root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

      <Context path="/~test" docBase="/home/test/public_html" debug="0" reloadable="true" />

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
        -->

      </Host>
    </Engine>
  </Service>
</Server>
[root@localhost conf]# /usr/local/httpd/bin/httpd -k restart
[root@localhost conf]# /usr/local/tomcat/bin/catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /usr/local/jdk
[root@localhost conf]# /usr/local/tomcat/bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /usr/local/jdk



위와 같이 public_html아래에 WEB-INF를 만들고 루트로 돌아와 /usr/local/tomcat/conf/server.xml에 <Context path="/~test" docBase="/home/test/public_html" debug="0" reloadable="true" />식으로 </host>위에 입력하고 저장하고 톰캣을 다시 시동한다.

로칼에서 http://ip/~testhttp://ip/~test.jsp 입력하여 보자.
 jsp파일이 정상 출력되는것을 알수있다. 하지만 html은 <% %>코드는 먹히질 않는다.

 

jsp가 잘 적용되었음을 알수있다. 
이제 도메인을 주고 사용자 계정에 도메인을 붙여 jsp가 잘 구동되는지 알아봐야 한다.

테스터 서버에 도메인을 붙이기 위해, 가상의 DNS를 만들어보자.(네임서버 포스팅이 아니기 때문에 대략적으로..이놈의 네임서버 오랜만에 구성해보네^^)
[root@localhost named]#yum install caching-nameserver
[root@localhost named]#yum install bind

[root@localhost named]# vi /etc/named.caching-nameserver.conf
//
// named.caching-nameserver.conf
//
// Provided by Red Hat caching-nameserver package to configure the
// ISC BIND named(8) DNS server as a caching only nameserver
// (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// DO NOT EDIT THIS FILE - use system-config-bind or an editor
// to create named.conf - edits to this file will be lost on
// caching-nameserver package upgrade.
//
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";

        // Those options should be used carefully because they disable port
        // randomization
         query-source    port 53;
        // query-source-v6 port 53;

        //allow-query     { localhost; };
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
view localhost_resolver {
        match-clients      { any; };
        match-destinations { any; };
        recursion yes;
        include "/etc/named.rfc1912.zones";
};

[root@localhost named]# vi /etc/named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
zone "." IN {
        type hint;
        file "named.ca";
};

zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};

zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.ip6.local";
        allow-update { none; };
};

zone "255.in-addr.arpa" IN {
        type master;
        file "named.broadcast";
        allow-update { none; };
};

zone "0.in-addr.arpa" IN {
        type master;
        file "named.zero";
        allow-update { none; };
};

zone "test.com" IN {
        type master;
        file "test.com.zone";
        allow-update { none; };
};

[root@localhost named]# vi /var/named/test.com.zone
$TTL    86400
@               IN SOA  ns.test.com. root.test.com (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                IN NS           ns.test.com.
                IN MX 10        mail.test.com.
                IN A            192.168.100.132
ns             IN A            192.168.100.132
www         IN A            192.168.100.132
akas         IN A            192.168.100.132
ftp             IN CNAME        @
*               IN CNAME        @
mail           IN CNAME        www

[root@localhost etc]# service named restart
named を停止中:                                            [  OK  ]
named を起動中:                                            [  OK  ]
[root@localhost etc]#
[root@localhost named]# system-config-securitylevel-tui
53:tcp , 53:udp 방화벽 해제


테스트서버이므로 방화벽을 아예 꺼버리는것이 신경안쓰고 좋다.


윈도우에서 위와 같이 지금의 테스트 서버로 DNS서버를 맞춘다.


 일본윈도우(테스트 클라이언트- 인코딩테스터기)에서 DNS변경후 제대로 출력됨을 알수있다. 이제 가상 내부 DNS를 가지고 www.test.com과  akas.test.com이라는 두 도메인을 만들어서 톰캣 가상호스팅을 해보자


윈도우에서 DNS서버를 테스터서버 IP로 주고 인터넷에 연결해 www.test.com에 접속해본다. 외부에서 DNS서버로 이용하고 싶으면 포트포워딩을 하거나 직접 공인ip에 DNS서버를 물리면 바로 DNS서버로 이용가능하다.
www.test.com이 제대로 DNS서버에서 인식하였는지 확인하여 본다.

DNS서버가 정상적으로 운영되고 있음을 알수있다.


DNS서버 zone파일에서 www와 akas를 지정해서 www.test.com으로 접속하면 test계정의 웹디렉토리로 접속하고 akas.test.com으로 접속하면 akas계정으로 접속을 시도한다.

이것을 위해서 test계정의 index 세파일을 akas계정으로 카피한다.

[root@test public_html]# cp /home/test/public_html/* /home/akas/public_html/
cp: omitting directory `/home/test/public_html/WEB-INF'
cp: `/home/akas/public_html/index.jsp' を上書きしてもよろしいですか(yes/no)? yes
[root@test public_html]# ls /home/akas/public_html/
index.html  index.jsp  index.php

세파일을 아래와 같이 변형한다.
[root@test public_html]# vi index.html
<HTML>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>AKAS'S BLOG</title>
</head>

 <BODY>
  <h1><h1><% out.print("akasアカウントです"); %><br /></h1>
  <h1>
http://bestakas.tistory.com <br /></h1>
  <h1>
http://snowrice.com<br /></h1>

 </BODY>
</HTML>


[root@test public_html]# vi index.jsp
<HTML>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>AKAS'S BLOG</title>
</head>

 <BODY>
  <h1><h1><% out.print("akasアカウントです"); %><br /></h1>
  <h1>
http://bestakas.tistory.com <br /></h1>
  <h1>
http://snowrice.com<br /></h1>

 </BODY>
</HTML>


[root@test public_html]# vi index.php
<?='this is AKAS'?>


이제 위의 httpd.conf를 수정하여 www.test.com과 akas.test.com을 버추얼 호스팅 하여보자.
vi /usr/local/httpd/conf/httpd.conf 의 #Include conf/extra/httpd-vhosts.conf주석을 제거한다.

[root@test named]# vi /usr/local/httpd/conf/httpd.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf

아래와 같이 일반 아파치 버추얼 호스팅처럼 httpd-vhosts.conf 수정한다.
[root@test named]# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
#
www.test.com
<VirtualHost *:80>
    DocumentRoot /home/test/public_html
    ErrorLog logs/www.test.com_error_log
    CustomLog logs/www.test.com_access_log common
    ServerName
www.test.com
    ServerAlias www.test.com
</VirtualHost>
<Directory /home/test/public_html/>
    AllowOverride All
</Directory>

#akas.test.com
<VirtualHost *:80>
    DocumentRoot /home/akas/public_html
    ErrorLog logs/akas.test.com_error_log
    CustomLog logs/akas.test.com_access_log common
    ServerName akas.test.com
    ServerAlias akas.test.com
</VirtualHost>
<Directory /home/akas/public_html/>
    AllowOverride All
</Directory>

[root@test named]# /usr/local/httpd/bin/httpd -k restart


웹서버 다시 가동

www.test.comindex.php index.jsp index.html이 모두 출력되나 php코드는 적용되고 jsp코드는 적용이 안됨을 알수있다. akas.test.com의 파일들을 열어보자. php의 출력모습이 틀리는것을 확인하니, 버추얼 호스트가 잘 적용되었다. 



이제부터 jsp도 적용할수 있게 jsp버추얼호스팅을 하자.
httpd-vhosts.conf의 내용을 수정해야 한다. 우선 위에서 입력한 버추얼호스팅 변경부분을 지우고 아래의 내용으로 변경한다. (물론 파일안에 예시 구문들은 모두 #처리하거나 지워주어애 한다.)

[root@test named]# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf
#
www.test.com
<VirtualHost *:80>
 ServerAdmin        
webmaster@test.com
 DocumentRoot        /home/test/public_html
 ServerName         
www.test.com
 ServerAlias         www.test.com
 DirectoryIndex      index.jsp index.html
 ErrorLog            logs/www.test.com-error.log
 CustomLog           logs/www.test.com-access.log common
          JkMount /*.jsp loadbalancer
          JkMount /*.do loadbalancer
          JkMount /*.html loadbalancer
          JkMount /servlet/* loadbalancer
          #JkMount /* loadbalancer
          JkMount /*.gif loadbalancer

</VirtualHost>
<Directory /home/test/public_html/>
    AllowOverride All
</Directory>

#akas.test.com
<VirtualHost *:80>
 ServerAdmin        
webmaster@akas.com
 DocumentRoot        /home/akas/public_html
 ServerName          akas.test.com
 ServerAlias         akas.test.com
 DirectoryIndex      index.jsp index.html
 ErrorLog            logs/akas.test.com-error.log
 CustomLog           logs/akas.test.com-access.log common
          JkMount /*.jsp loadbalancer
          JkMount /*.do loadbalancer
          JkMount /*.html loadbalancer
          JkMount /servlet/* loadbalancer
          #JkMount /* loadbalancer
          JkMount /*.gif loadbalancer

</VirtualHost>
<Directory /home/akas/public_html/>
    AllowOverride All
</Directory>


아주 간단하다. httpd/htdocs의 연동처럼 JkMount만 버추얼호스트 부분에서 첨가해주면 된다.
다음으로  /usr/local/tomcat/conf/server.xml을 수정한다. </host>로 끝나는 태그 아래에 추가한다.

 [root@test public_html]# vi /usr/local/tomcat/conf/server.xml

      <Host name="
www.test.com"  appBase="home/test/public_html"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

      </Host>
      <Host name="akas.test.com"  appBase="home/akas/public_html"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>


사이트 이름의 디렉토리를 /usr/local/tomcat/conf/Catalina에서 만든다.
[root@test conf]# mkdir /usr/local/tomcat/conf/Catalina/www.test.com
[root@test conf]# mkdir /usr/local/tomcat/conf/Catalina/akas.test.com
[root@test conf]# vi /usr/local/tomcat/conf/Catalina/www.test.com/ROOT.xml
<Context path="" reloadable="true" debug="1" docBase="/home/test/public_html" />
[root@test conf]# vi /usr/local/tomcat/conf/Catalina/akas.test.com/ROOT.xml
<Context path="" reloadable="true" debug="1" docBase="/home/akas/public_html" />

jsp가 적용될 계정의 public_html의 아래에 WEB-INF 디렉토리를  만들고 /usr/local/tomcat/webapps/WEB-INF의 web.xml을 계정 디렉토리의 WEB-INF에 카피한다.
[root@test conf]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /home/test/public_html/WEB-INF/
[root@test conf]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /home/akas/public_html/WEB-INF/

이제 설정은 끝났다. 다시 웹서버와 톰캣을 재시동하자.
[root@test conf]# /usr/local/httpd/bin/httpd -k restart
[root@test conf]# /usr/local/tomcat/bin/catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /usr/local/jdk
[root@test conf]# /usr/local/tomcat/bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /usr/local/jdk

브러우져에서 php와 index.html을 모두 로드해본다.
두 사이트 모두 의도한대로 정상적으로 출력된다.


Apache + PHP + MySQL + Oracle + PostGreSQL + JSP의 모든 연동이 끝났다.