개발 블로그

[교육] 하나의 엔진에 하나의 도메인 본문

리눅스 | 서버

[교육] 하나의 엔진에 하나의 도메인

토도 2024. 9. 20. 17:59

하나의 엔진에 하나의 도메인(test.co.kr)

  1. context path = "/" 샘플
  2. context path = "/doc" 샘플
  3. 가상폴더 = "/upload" 실제 경로 = 다른 폴더
  4. context단위로 다른 로그폴더 지정
  5. get/post 한글처리
  6. 아무로컬또는 개발db에 jndi 설정 및 ap connection 샘플

 

 

 

아파치와 톰캣이 연동 된 상태에서, localhost로 들어가야 톰캣 고양이를 볼 수 있는데

milk.com으로 들어갈 수 있게 하겠음

 

vi /etc/hosts 

 

 

호스트 파일을 수정해주고

vi /engine/apache/conf/extra

# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/engine/apache2.4/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/engine/apache2.4/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>

 

기존에 있던 요걸 싹다 지우고

 

<VirtualHost *:80>
   ServerName milk.com

    # Document root 설정 (Tomcat으로 프록시 연결할 때는 필요 없음)
    DocumentRoot "/engine/apache2.4/htdocs"

    # Tomcat으로 요청을 전달
    JkMount /* worker1

    ErrorLog /var/log/httpd/milk_error.log
    CustomLog /var/log/httpd/milk_access.log combined
</VirtualHost>

 

얘를 넣어 줬다

 

그리고 httpd.conf 에서 

 

 

얘도 추가해주고, 

 

 

virtual host의 주석을 풀어준다 

 

그리고 톰캣과 아파치 재기동

 

...

http://milk.com:8080/ 

8080 포트를 붙이면 접속이 되는데 

http://milk.com 는 안되는 것이다

 

이는 Apache가 80번 포트에서 요청을 처리하고 Tomcat이 8080번 포트에서 동작하기 때문입니다. 이 문제는 ApacheTomcat을 연동하여 포트 80으로 접속했을 때도 Tomcat으로 전달되도록 설정하면 해결할 수 있습니다.

 

Apache의 Reverse Proxy 설정을 사용하여 80번 포트의 요청을 8080번 포트로 전달해 줄 수 있습니다.

 

mod_proxy 모듈 설치 확인: mod_proxy와 mod_proxy_http가 설치되어 있는지 확인합니다.

CentOS 7에서는 기본적으로 설치되어 있습니다. 설치가 안 되어 있으면 아래 명령으로 설치합니다:

sudo yum install mod_proxy mod_proxy_http
 
 
 

보니까 VirtualHost를 수정하래서 

 

<VirtualHost *:80>
   ServerName milk.com
   ServerAlias http://www.milk.com
   # Document root 설정 (Tomcat으로 프록시 연결할 때는 필요 없음)
   DocumentRoot "/engine/apache2.4/htdocs"

   # 80번 포트 요청을 Tomcat의 8080 포트로 프록시
   ProxyPass / http://localhost:8080/
   ProxyPassReverse / http://localhost:8080/

   # Tomcat으로 요청을 전달
   JkMount /* worker1

   ErrorLog /var/log/httpd/milk_error.log
   CustomLog /var/log/httpd/milk_access.log combined
</VirtualHost>

 

ProxyPass와 ProxyPassReverse는 Apache가 80번 포트로 들어오는 요청을 Tomcat의 8080번 포트로 전달하고,

그 응답을 클라이언트에게 다시 전달하는 역할을 합니다.

 

그리고 httpd.conf에서 

 

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

요 두놈의 주석을 풀어주셈

 

 

 

이제 www.milk.com 해서 톰캣 고양이가 뜨게는 완료했어

 

 

  1. context path = "/" 샘플
  2. context path = "/doc" 샘플

server.xml 에서 이걸 추가해

 

 

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="/choco" docBase="/engine/tomcat/webapps/choco" />
</Host>

 

 

jsp가 위치에 있는 것을 확인 했다

 

 

톰캣을 재시작하니 안된다 흑..

 

 

내가 원했던건,

www.milk.com/choco 

로 접속할 수 있는건데.. 

 

 

여기에 index.jsp 파일을 만들어주니 

자동으로 연결이되어서

 

 

되는구나 아싸

근데 어이 없는게

약간 오타가 생겨서 

 

 

ContextPath 설정한걸 지웠는데도 연결이 된다, 뭔일이고

그래도 혹시 모르니 원상복귀로 아까 만든대로 다시 설정하고 저장하고 끝


 

가상폴더 = "/upload" 실제 경로 = 다른 폴더

 

3번에서 요청하신 가상 폴더를 설정하려면, Tomcat의 server.xml이나 context.xml에서 <Context>와 <Resources>를 사용하여 가상 폴더를 설정할 수 있습니다. Apache를 사용하지 않고도 Tomcat에서 가상 폴더를 설정할 수 있습니다.

가상 폴더를 설정하는 방법을 설명해드리겠습니다.

3. 가상폴더 = /upload, 실제 경로 = 다른 폴더 설정 방법

1. server.xml 또는 context.xml 수정

server.xml 또는 context.xml에서 해당 Context에 <Resources> 태그를 사용하여 가상 폴더를 설정할 수 있습니다. 예를 들어, upload라는 가상 폴더를 /var/web/upload라는 실제 경로로 연결하려면 아래와 같이 설정할 수 있습니다.

예시: server.xml 또는 context.xml 설정

 
<Context path="/" docBase="/path/to/your/app" reloadable="true">
<!-- 가상 폴더 설정 -->
      <Resources>
                <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                base="/upload" webAppMount="/upload" />
      </Resources>
</Context>
 

2. 설명

  • path="/": 기본 context path를 설정하는 부분입니다. 즉, test.co.kr로 접근할 경우 기본 페이지가 로드됩니다.
  • base="/var/web/upload": 실제 파일들이 존재하는 서버상의 경로입니다.
  • webAppMount="/upload": 클라이언트가 웹을 통해 접근할 가상 경로입니다. 즉, http://test.co.kr/upload로 접근하면 /var/web/upload에 있는 파일들을 참조합니다.

이렇게 설정하면 Tomcat이 /upload 경로로 요청을 받을 때, 실제로는 /var/web/upload 경로에 있는 파일을 참조하게 됩니다.

 

애를 했을때 단순히 이렇게 했는데 404 에러가 뜨더이다

알고보니

 

 

이렇게 해서는 안되고 

 

1. Resources 태그의 위치 문제

현재 설정을 보면 <Resources> 태그가 Host 태그 아래에 위치해 있습니다. 그러나 Resources 태그는 Context 태그 내에 정의되어야 합니다. Host 태그 아래에 직접 설정하는 것이 아니라, 특정 컨텍스트에 연결된 리소스로 사용하려면 Context 태그 내부에서 설정해야 합니다.

/upload 경로는 특정 Context와 연결되어야 하기 때문에, 설정을 Context 태그 안으로 이동시켜야 합니다.

2. 올바른 Context 설정

현재 /upload 경로는 어느 Context에도 연결되어 있지 않아서 Tomcat이 이를 인식하지 못할 가능성이 큽니다. /upload 경로는 choco 애플리케이션과 함께 사용될 것으로 보이므로, choco 애플리케이션의 Context에 Resources를 추가해야 합니다.

수정된 설정 예시는 아래와 같습니다:

수정된 설정 예시:

 
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
    <!-- choco 애플리케이션의 Context 설정 -->
    <Context path="/choco" docBase="/engine/tomcat/webapps/choco">
        <!-- 가상 폴더 설정: /upload -->
        <Resources>
            <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                          base="/upload" webAppMount="/upload" />
        </Resources>
    </Context>
    
</Host>
 
 

요렇게 바꿔주니까 http://milk.com/choco/upload/ 

 

 

여기있는 파일이 아래의 url로 조회할 수 있다

 

 

되는고만요

 


 

context단위로 다른 로그폴더 지정

 

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log" suffix=".txt"
            attern="%h %l %u %t &quot;%r&quot; %s %b" />
        <!-- choco 애플리케이션의 Context 설정 -->
        <Context path="/choco" docBase="/engine/tomcat/webapps/choco">
            <!-- 가상 폴더 설정: /upload -->
            <Resources>
                <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                base="/upload" webAppMount="/upload" />
            </Resources>
            <Valve className="org.apache.catalina.valves.AccessLogValve"
             directory="/var/log/tomcat/choco"
             prefix="choco_access_log"
             suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />  
        </Context>
 </Host>

 

 

완료


 

get/post 한글처리

 

server.xml에서 URI 인코딩 설정

server.xml 파일에서 Connector 태그에 URIEncoding="UTF-8" 속성을 추가해야 합니다.

 

 

이렇게 했고,

 

웹 애플리케이션의 web.xml 파일에 필터를 추가하라는데 

 

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

 

이렇게 web.xml이 많아서 어떻게 해야하는지 모르겟더라,, 

 

한글 처리 필터를 설정할 위치는 애플리케이션의 web.xml입니다. 라구해서 

 

WEB-INF를 만들어주고 web.xml 파일을 만들어주고 필터를 추가해줬다

 

 

 

되는구먼


 

아무 로컬또는 개발 db에 jndi 설정 및 ap connection 샘플

 

1. 데이터베이스 드라이버 추가

오라클 데이터베이스에 연결하기 위해 JDBC 드라이버를 다운로드하고 Tomcat의 lib 디렉토리에 추가해야 합니다.

  • JDBC 드라이버 다운로드: Oracle JDBC Driver에서 ojdbc8.jar 파일을 다운로드합니다.
  • 다운로드한 .jar 파일을 Tomcat의 lib 디렉토리 (<TOMCAT_HOME>/lib)에 복사합니다.

 

 

그냥 host 컴퓨터에서 ojdbc8.jar 파일을 다운 받고 vm 쪽으로 드래그 했더니 넣어지네 뭐지

 

 

 

이제 웹 애플리케이션에서 이 JNDI 리소스를 참조할 수 있습니다. web.xml 파일에 다음과 같이 정의합니다.

 

 

넣었다제

 

정상적으로 서버는 가동되지만, 아직 db가 연결되었는지는 모른다이 그건 나중에 테스트하고 다음으로 넘어갈게용