아파치에서 mod_proxy_balancer와 mod_jk를 같이 사용할 때 응답코드가 500입니다.

조회수 2690회

안녕하세요. 웹개발자 나부랭이입니다.

웹 어플리케이션을 운영기에 올렸을 때 발생하는 문제를 사전에 테스트해보려는 목적으로 운영기와 최대한 비슷한 환경을 만들어 보려고 합니다. 운영기에선 L4 스위치가 있을테니 L4가 하는 일을 아파치 한대가 하게끔 하려는 거죠.

제가 의도하는 서버의 구조와 대략적인 작동은 이러합니다: 이미지

  • 구성: 아파치 3대, 톰캣 2대
  • 아파치와 톰캣은 모두 하나의 리눅스 서버에 존재함
  • apache0은 모든 80포트 요청을 받아서 apache1과 apache2로 분산 처리(proxy with loadbalancing)
  • apache1은 tomcat1과 jk로 연결, apache2는 tomcat2와 jk로 연결됨.

이를 위해 설정한 값은 다음과 같습니다:

apache0 httpd.conf:

# 생략

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule session_module modules/mod_session.so
LoadModule session_cookie_module modules/mod_session_cookie.so
LoadModule session_dbd_module modules/mod_session_dbd.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so

# 생략

ProxyRequests off
ProxyPreserveHost on

<Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all
</Proxy>

ProxyVia On

<VirtualHost *:80>
    ServerName mydomain.com

    <Proxy "balancer://focluster">
        BalancerMember http://mydomain.com:1081/
        BalancerMember http://mydomain.com:1082/
    </Proxy>
    ProxyPass "/" "balancer://focluster"
</VirtualHost>

apache1 httpd.conf:

# 생략

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

<VirtualHost *:1081>
    ServerName mydomain.com
    JkMount "/*" fo
</VirtualHost>

apache1 workers.properties:

worker.template.type=ajp13
worker.list=fo
worker.fo.reference=worker.template
worker.fo.port=8011
worker.fo.host=localhost

apache2 httpd.conf:

# 생략

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

<VirtualHost *:1082>
    ServerName mydomain.com
    JkMount "/*" fo2
</VirtualHost>

apache2 workers.properties:

worker.template.type=ajp13
worker.list=fo2
worker.fo2.reference=worker.template
worker.fo2.port=8012
worker.fo2.host=localhost

추가적으로 WAS의 웹 루트에 index.jsp와 test.html이 있고 톰캣 web.xml의 welcome-file은 index.jsp로 되어 있습니다.

이렇게 설정하고 난 후 브라우저에서 mydomain.com으로 연결하면 index.jsp는 잘 보입니다. 하지만 mydomain.com/test.html을 요청하거나 서블릿을 거쳐야 하는 URL을 요청할 경우 500 상태값이 응답됩니다. 로그를 확인해보면 apache0까지의 access는 찍힙니다. 하지만 apache1의 access는 없고 WAS log도 아무것도 찍히지 않습니다. proxy balancer 설정 없이 테스트했을때 정상적으로 페이지가 표시되는걸 보면 jk 설정이나 WAS에 이상이 있는건 아니거든요.

다음처럼 BalancerMember 없이 ProxyPass만 해보면:

<VirtualHost *:80>
    ServerName mydomain.com
    ProxyPass          "/" "http://mydomain.com:1081/"
    ProxyPassReverse   "/" "http://mydomain.com:1081/"
</VirtualHost>

이건 또 잘됩니다. 단지 요 설정에 로드밸런스만 추가했을 뿐인데 말이죠. 뭐가 잘못되었는지 모르겠네요. 부디 아시는분 답변 부탁드립니다.

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)