Ubuntu 한 서버에서 PHP, JSP 동시에 사용하기

HYEONG HWAN, MUN/ 3월 28, 2015/ 미분류/ 27 comments

https://blog.lael.be/post/1023

요청에 의해서 한 서버에서 PHP와 JSP를 동시에 구동하는 방법을 설명하고자 한다.

 


이 글은 동시구동 방법에 대해서 설명하고 있습니다.

아래의 단계를 진행하시려면 먼저 서버에 Ubuntu-Apache-PHPUbuntu-Tomcat-JSP 가 설치되어 있어야 합니다.

설치되어 있지 않으면 기존 글 Ubuntu-Apache-PHPUbuntu-Tomcat-JSP 을 참조하여 먼저 설치해주세요.


 

먼저 간단한 이론 2가지를 이해하고 가도록 하자.

 

1) 포트 바인딩

우리가 사용하는 TCP/IP 네트워크에서 서버간 통신은 IP 주소 + PORT 번호로 이루어진다.

당연한 이야기겠지만 네트워크 프로그램도 IP 주소 + PORT 번호로 연결을 설정한다.

 

당신이 웹서버 프로그램에 IP 주소를 지정하지 않으면 (나를 포함 대부분 지정하지 않는다),

기본값으로 0.0.0.0 (=모든 IP 라는 뜻) 이 지정된다.

즉 아무런 설정을 하지 않았다면

Apache0.0.0.0:80 을 사용하고

Tomcat0.0.0.0:8080 을 사용한다.

 

Apache 와 Tomcat 을 설치한 상태에서 Tomcat 의 포트를 80 으로 바꾸면

이미 사용중(Already in use) 에러가 발생한다.

 

2) 프록시(Proxy) 및 리버스 프록시(Reverse Proxy)

ISAProxy

Proxy 서버란?

사용자 와 Web Server 중간에서 요청을 처리하는 것이다.

세팅을 하면 아래의 역할을 수행할 수 있다.

- 방화벽 역할을 수행할 수 있다.

- 부하 분산(Load Balancing)을 할 수 있다.

- 특정 요청(특정 IP나 특정 사이트)에 대해서 필터링 할 수 있다.

 

Proxy 의 종류에 Forward Proxy 와  Reverse Proxy 가 있는데, 웹에서 부하분산에 쓰이는 것은 Reverse Proxy 이다.

Proxy 서버가 능동적으로 설정된 분배(또는 필터링, 방화벽) 작업을 하면 Reverse Proxy 이다.

Proxy 서버가 수동적으로 네트워크 기능을 시키는 대로 하는 것Forward Proxy 이다.

Forward Proxy 는 방화벽등으로 네트워크 통신이 원활하지 않을 때 사용자의 네트워크 명령을 대신 수행해 주는 것이다. (패킷 경유지)

여러분이 warning.or.kr 사이트를 뚫기 위해서 해외의 서버를 경유하는 것이 Forward Proxy 이다.

Citrix_ForwardProxy_101003

 

스크린샷 2015-06-13 오후 10.26.07

<크롬의 확장프로그램 Zen**** 는 크롬의 프록시 설정을 제어 할 수 있다>

 

 

이제 작업해보자. 당연히 리버스 프록시 작업을 할 것이고, 대상 서버는 자기자신이다.

내가 요청을 받아서 특정 요청을 나의 다른 프로그램에 proxying 하는 것이다.

 


 

 

Apache 는 80포트에서 구동중이고 Tomcat은 8080포트에서 구동중이라고 가정한다.

/etc/apache2/sites-available/test1.com.conf

스크린샷 2015-03-29 오후 8.43.28

 

#vi /home/myuser/www/index.php

<?php session_start(); echo "HELLO PHP! "; echo date("Y-m-d h:i:s"); ?>

스크린샷 2015-03-29 오후 8.40.19

 


/etc/tomcat7/server.xml

스크린샷 2015-03-29 오후 8.48.16

 

#vi /home/myuser/www/ROOT/index.jsp

HELLO JSP!

<%= new java.util.Date() %>

<% // response.sendRedirect("test.jsp"); %>

 

스크린샷 2015-03-29 오후 8.51.03


 

두 프로그램이 동시에 같은 IP:PORT 를 사용할 수 없기 때문에,

Apache (PHP) 를 앞단에, Tomcat을 뒤에서 구동시키도록 하겠다.

 

Apache 프로그램에서 ProxyPass 관련 구문을 해석할 수 있도록 설정

#a2enmod proxy

 

http 로 proxy 할 수 있도록 변경

#a2enmod proxy_http

 

아파치 재시작

#service apache2 restart

 


 

사용 예시에 따라서 3가지 방법을 적도록 하겠다.

 

1. 사이트의 모든 요청을 Tomcat 이 처리하도록 수정

ProxyPass / http://test1.com:8080/
ProxyPassReverse / http://test1.com:8080/

스크린샷 2015-03-29 오후 9.09.11

스크린샷 2015-03-29 오후 9.10.43

 

2. 사이트의 특정 경로만 Tomcat 이 처리하도록 수정

ProxyPass /tomcat http://test1.com:8080
ProxyPassReverse /tomcat http://test1.com:8080

스크린샷 2015-03-29 오후 9.11.32

경로에 따라 요청을 처리하는 프로그램이 다르다.

*Apache 가 처리한 경우

스크린샷 2015-03-29 오후 9.13.20

 

*Tomcat 이 처리한 경우

스크린샷 2015-03-29 오후 9.13.35

 

3. PHP, JSP를 동시에 같은 경로에서 사용.

*이 방식을 사용할 경우 보안에 특히 신경써야 한다. 파일 업로드시 확장자 제한을 한번 더 확인하도록 하자.

ProxyPassMatch ^/(.*\.jsp(/.*)?)$ http://localhost:8080/$1

DocumentRoot 와 Directory 옵션도 바꾼다.

스크린샷 2015-03-29 오후 9.16.27

 

파일도 동일한 경로에 위치하게 하고.

스크린샷 2015-03-29 오후 9.19.33

 

스크린샷 2015-03-29 오후 9.21.11

스크린샷 2015-03-29 오후 9.21.28

.jsp 파일만 Tomcat 이 받아서 실행.

 


 

보안설정.

Tomcat 이 서비스 뒤로 숨어야 한다.

#vi /etc/tomcat7/server.xml
address="127.0.0.1" 추가

스크린샷 2015-03-29 오후 9.24.03

 

Tomcat 을 재시작하면, 서비스는 구동중이나 외부에서의 접근은 차단될 것이다. 즉 프록시로만 접근가능.

 

27 Comments

  1. 감사합니다!! 라엘님 🙂
    잘 따라해보겠습니다!!

  2. 안녕하세요 라엘님
    궁금한점이 생겨 다시 이렇게 답글을 남깁니다.
    연동까지 다 성공하였는데요,
    apache는 권한때문에 /forbidden되는 문제,
    tomcat에서는 화면에 아무것도 안뜨는 문제가 발생하네요 ㅠㅠ
    구글링 열심히 해봤는데도 각각에 따른 솔루션이 먹히지 않아서 이렇게 또 질문을 남깁니다.
    확인좀 부탁드려도 될까요? ㅠㅠ

    1. #chmod -R 777 www/
      해보세요.

      1. Tomcat에 대한 문제는 해결되었는데
        apache구동에 대해서는 아직까지도 Forbidden이 뜨네요 ㅠㅠ
        이건 권한때문이 아닌 다른 문제일까요??

        1. http://blog.lael.be/post/73 13번 항목에서
          allow from all
          require all granted
          제대로 설정되어있는지 확인해보시고요, 아니면 콘솔에 #tailf /var/log/apache2/error.log
          치시고 안뜨는 페이지 새로고침 해보세요. (에러로그 나가기 : 컨트롤 c)

          1. 에러 로그를 확인해보니 제가 지정하지 않은 디폴트 폴더로 요청이 들어가는것 같네요..
            http://blog.lael.be/post/73 13번 항목처럼 저도 지정해서 했는데
            도메인이랑 루트폴더를 제 것으로 지정했는데도
            /var/www/html 폴더로 요청이 들어가면 뭔가 잘못된거죠…?? ㅠ

            1. 13번 14번 항목 다시 실행해 보세요.
              올바르게 도메인정보를 등록했는지, 해당 도메인 이름으로 접속했는지 확인.

          2. 뭐가 잘못됐는지 잘 안되네요.. ㅠㅠ
            처음부터 다시해봐야겠습니다 ㅠㅠ
            항상 감사합니다 라엘님!!

  3. 안녕하세요. 2) 프록시(Proxy) 및 리버스 프록시(Reverse Proxy) 부분에 <VirtualHost 추가하신 부분에 대해 질문이 있습니다. 혹 저 부분은 어디에 추가를 하여야 하는지 알려주세요!!~

    1. 본문 가장 윗쪽을 보면 알겠지만, 이 글은 APACHE 와 TOMCAT 의 연동에 대해서 설명하고 있습니다.

      본문 상단 링크를 통해서 둘을 먼저 설치하세요.

  4. 안녕하세요!! 잘 사용중입니다. 추가적인 질문이 있습니다! 알려주신 글을 보면 1번 예제를 제외하고는 / 경로부터 일부를 제외하고는 아파치가 php를 처리하도록 되어 있는데요, 반대로 / 경로부터 일부를 제외하고는 톰캣이 처리하게 하고 싶은데 이것은 혹시 어떻게 하면 될까요… 답변 부탁드리겠습니다!! 감사합니다..

    1. 해당 방법은 mod_rewrite 로 구현하여야 합니다.
      ProxyPass, ProxyPassReverse, ProxyPassMatch 관련 구문 지우시고.

      Directory 구문 안에
      RewriteCond %{REQUEST_URI} !^/phpmyadmin/
      RewriteRule (.*) http://127.0.0.1:8080/$1 [P]

      넣어보세요.

      phpmyadmin 폴더를 제외하고는 tomcat 으로 연결될 겁니다.
      500번 에러가 발생하면 다음 명령어를 실행해서 rewrite 모듈을 켜세요.
      #a2enmod rewrite

  5. 보안설정 부분에서 address=”127.0.0.1″ 추가를 하는 부분은 포트8080에서의 접근을 차단하는 것인가요? 이 부분을 설정하지 않고 실행할때는 기본 포트 80과 8080포트에서 페이지가 뜨는데 보안설정을 하면 8080에서의 접속이 되지 않고 기본포트 80에서도 The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. 이런식으로 뜨는 것 같습니다.. 어떤 부분을 잘못 설정한걸까요?

    1. 혹시 서버를 분리하신 것 아닌가요?

  6. 안녕하세요 라엘님. 홈페이지 꾸준히 잘 보고 있습니다.
    일단 모든 정보를 tomcat이 처리하도록 설정하였고, 맨 마지막 보안설정에 address=”127.0.0.1″ 추가 를 하게 되면 그냥 test.com(예시) 에서 Service Unavailable이 뜨네요. test.com:8080 은 그냥 접근거부 상태인데, 뭔가 제가 놓친게 있는 것인가요??

    보안부분을 풀면 test.com / test.com:8080 모두 정상적으로 나옵니다.

    1. /etc/hosts 파일을 열고 문서 하단에
      127.0.0.1 test1.com
      을 추가해주세요.

  7. 3번째 방법인 서로 같은 포트를 사용하는 상태에서 확장자로 구별을 하고싶습니다만 방법대로 따라하는데 포트(8080)를 안치면 jsp가 구동이 되지 않습니다
    혹시 게시글에 안나왔지만 톰켓쪽에서 수정해야할 부분이 있나요?

    1. 설정 변경 후 아파치 재시작을 안하셨을것 같습니다. 아파치를 재시작하거나 서버를 재부팅해보세요.

  8. 안녕하세요, 가상으로 서버구성하고 있습니다.

    1. ngnix에서 php(워드프레스, 그누보드)
    2. 아파치에서 jsp (오라클 DB서버 따로 구축- 개발연습용)
    이렇게 가정했을때

    1번과 2번을 한개의 서버로 구성하는게 좋을지

    1번에 서버1개(우분투) 2번에 서버 1개(우분투 혹은 센트오에스)

    php만 돌아가는 서버와 jsp만 돌아가는 서버를 따로 만드는것이 좋을까요?
    아니면 이 게시물처럼 함께 돌아가도록 1대에서 하는것이 좋을까요?

    제가 설명을 현실에서도 잘 못하는데 그것이 글로도 나타나네요ㅠㅠ

    1. php에서도 계정별로 도메인을 연결할 예정입니다.
    2. jsp에서도 계정별로 도메인을 연결할 예정입니다.

    ESXI를 사용하고 있기 떄문에 서버갯수는 늘릴수가 있습니다.

    작년 11월에 처음와서 nginx php mariaDB 이렇게 따라했던것 같은데
    처음엔 안되는것이 너무 많고 힘들었는데
    그동안 몇번씩 따라해 보니 이제 조금 강의내용을 조금씩 따라할수 있을것 같습니다.

    감사합니다.

    다음도전은
    우분투 user를 여러개 추가해서 각각 도메인에 매칭시키는 방법을 라엘님의 글보고 따라해보는것이 목표입니다.

    1. 서버 증설에 비용이 든다면 한대로 하시고, 비용이 들지 않으면 두대로 하세요.
      한대를 사용하면 관리가 편하고, 두대를 사용하면 개념이해에 도움이 됩니다.

      1. 가상서버 추가하였습니다.
        감사합니다.
        도메인:8080 잘 접속됩니다.
        좋은 주말 보내세요

  9. jsp가 구동이 안되었던 것은 제가 프록시 함수를 아팟치 설정에 집어넣을때 사진 보고 test1:8080을 그대로 쳐서 그랬네요 ㅎ;
    지금은 localhost 쳐서 jsp는 잘 작동되는데
    jsp가 작동되게 하니까 php가 500번에러 뜨면서 안되네요…왜이럴까요(ps.서비스 재시작은 설정파일 건드릴때마다 합니다.)
    그 apache2 error log를 확인해보니
    configuration error: couldn’t perform authentication. AuthType not set!:
    이런 에러가 뜨네요…

    1. 낮은 버전의 아파치를 사용중인 것으로 추측됩니다.
      설정파일에서
      require all granted
      를 찾아서 주석처리(#)하거나 구문을 제거해주세요.

      1. Require all granted를 지우니까 되네용
        Require all granted는 뭘 뜻하나요??

        1. 아마 TITI님이 Ubuntu 를 사용하지 않는 것 같습니다.
          해당 구문은 2012년 2월에 출시된 apache 2.4 에 추가된 기능입니다. 그 이하 소프트웨어는 그 구문을 해석할 수 없습니다.

  10. xe town에서 보고, 이곳 블로그글 보고 있네요. 웹호스팅을 하고 있습니다. 서버호스팅을 할까 생각중 인데, 많은 도움이 될 것 같아요. 포스팅, 잘 보고 갑니다.

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*