아파치서버설치 (modcluster) 적용 및 Wildfly 서버 이중화 구성 방법
/* 아파치 서버 2대 + Wildfly 서버 2대 2중화 구성 방법 */
🗺️ 네트워크 구성도 (Architecture Overview)
/* 서버 운영제제 Rocky Linux 9.3 */
/* 아파치 서버 설치 버전 apache-2.4.63 */
🧱 1. 사전 준비
🔹 필수 패키지 설치
dnf groupinstall "Development Tools" -y
dnf install gcc gcc-c++ make cmake autoconf pcre pcre-devel openssl-devel expat-devel wget net-tools apr-devel apr-util-devel libxml2-devel -y
mod_http2
, mod_ssl
, mod_deflate
, mod_proxy
, mod_security
, mod_cluster
등을 컴파일할 때 필요📥 2. Apache 소스 다운로드 및 컴파일
🔹 Apache 2.4.63 + APR, APR-util 다운로드
1. 아파치 소스 리눅스에서 직접 다운로드 설치
cd /usr/local/src
wget https://downloads.apache.org/httpd/httpd-2.4.63.tar.gz
압축해제
tar -xvf httpd-2.4.63.tar.gz
//2. apr 다운로드
wget https://downloads.apache.org/apr/apr-1.7.5.tar.gz
압축을 푼다
tar -xvf apr-1.7.5.tar.gz
//3. apr-util 다운로드
wget https://downloads.apache.org/apr/apr-util-1.6.3.tar.gz
tar -xvf apr-util-1.6.3.tar.gz
/* 압축해제한 파일들을 apache소스의 srclib폴더로 이동한다. */
mv apr-1.7.5 httpd-2.4.63/srclib/apr
mv apr-util-1.6.3 httpd-2.4.63/srclib/apr-util
// 아파치 서버를 설치할 폴더를 생성한다.
mkdir /app
⚙️ 3. 컴파일 및 설치
🔹 configure
(필요 모듈 포함)
/* http2를 지원하기 위해서는 소스를 먼저 다운받아서 컴파일을 해야 enable-http2가 에러없이
처리 된다. */
/* http2 설치 소스 컴파일 */
cd /usr/local/src
git clone https://github.com/nghttp2/nghttp2.git
cd nghttp2
git submodule update --init
autoreconf -i
./configure
make
make install
이렇게 하면 /usr/local/lib 경로에 설치되며, Apache 컴파일 시 LD_LIBRARY_PATH 또는 LDFLAGS, CPPFLAGS로 지정해줄 수 있습니다.
설치 확인
dnf list installed | grep nghttp2
--with-nghttp2는 HTTP/2를 위한 필수 라이브러리이며,
/usr/local 등 설치 경로를 정확히 지정해야 합니다.
/* http2 사전 준비가 끝났으면 configure 설정을 진행합니다. */
/* 일단 clean 명령으로 깨끗하게 정리 해준 뒤에 진행합니다. */
cd /usr/local/src/httpd-2.4.63
make clean
./configure --prefix=/app/apache2.4.63 \
--enable-so \
--enable-ssl \
--enable-http2 \
--with-nghttp2=/usr/local \
--enable-rewrite \
--enable-expires \
--enable-headers \
--enable-deflate \
--enable-cache \
--enable-disk-cache \
--enable-slotmem-shm \
--enable-mpms-shared=all \
--with-mpm=event \
--with-included-apr \
--enable-proxy \
--enable-proxy-fcgi \
--enable-proxy-http \
--enable-proxy-ajp \
--enable-proxy-balancer \
--enable-mods-shared=all \
--enable-manager \
--enable-modules=most
make
make install
/* http2 모듈 존재 확인 */
mod_http2.so 모듈 존재 확인
ls /app/apache2.4.63/modules/mod_http2.so
파일이 있다면 성공적으로 http2 지원환경 빌드가 처리 되었습니다.
없다면 Apache를 다시 --enable-http2 옵션으로 재빌드 해야 합니다
httpd.conf에 모듈 로딩 추가
LoadModule http2_module modules/mod_http2.so
/* HTTP/2 프로토콜 활성화 */
SSL 가상 호스트 내에 Protocols 지시어 추가:
<VirtualHost *:443>
ServerName www.example.com
Protocols h2 http/1.1
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
...
</VirtualHost>
* 주의: HTTP/2는 HTTPS 환경에서만 완벽히 작동
Apache의 mod_http2는 HTTP(포트 80)에서도 동작할 수는 있지만,
대부분의 브라우저는 HTTPS 연결에서만 HTTP/2를 사용합니다.
🔄 mod_proxy_cluster(구 mod_cluster) 소스 컴파일 및 설치
1. 의존성 및 소스 다운로드
cd /usr/local/src
https://github.com/modcluster/mod_proxy_cluster
mod_proxy_cluster (구 mod_cluster) 는 Apache httpd 2.4.X 버전으로 올라가면서 명칭이 mod_proxy_cluster로 변경되었습니다.
mod_cluster는 WAS서버(jboss, wildfly, tomcat)에서 사용되는 모듈의 명칭이고
mod_proxy_cluster는 WEB서버(Apache httpd)에서 사용되는 모듈의 명칭으로 지정되었습니다
git clone https://github.com/modcluster/mod_proxy_cluster.git
$ cd mod_proxy_cluster/native
$ mkdir build
$ cd build/
$ cmake ../ -G "Unix Makefiles" \
-DAPR_LIBRARY=/app/apache2.4.63/lib/libapr-1.so \
-DAPR_INCLUDE_DIR=/app/apache2.4.63/include \
-DAPRUTIL_LIBRARY=/app/apache2.4.63/lib/libaprutil-1.so \
-DAPRUTIL_INCLUDE_DIR=/app/apache2.4.63/include \
-DAPACHE_INCLUDE_DIR=/app/apache2.4.63/include
$ make
/* 컴파일 확인 */
[root@8cec427cb119 build]# ll ./modules/
total 292
drwxr-xr-x 2 root root 4096 4월 20 09:24 .
drwxr-xr-x 8 root root 4096 4월 20 09:24 ..
-rwxr-xr-x 1 root root 32272 4월 20 09:24 mod_advertise.so
-rwxr-xr-x 1 root root 36528 4월 20 09:24 mod_lbmethod_cluster.so
-rwxr-xr-x 1 root root 118672 4월 20 09:24 mod_manager.so
-rwxr-xr-x 1 root root 100080 4월 20 09:24 mod_proxy_cluster.so
/* 4개파일이 생성 되었으면 성공이다. 생성된 파일을 아파치 모듈 경로에 복사 해 준다. */
cp ./modules/*.so /app/apache2.4.63/modules/
/* mod_proxy_cluster 설정 */
vi /app/apache2.4.63/conf/extra/httpd-modcluster.conf
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 slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so
LoadModule watchdog_module modules/mod_watchdog.so
LoadModule lbmethod_cluster_module modules/mod_lbmethod_cluster.so
<IfModule manager_module>
<VirtualHost *:80>
ServerName 127.0.0.1
<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
Require all granted
</Location>
</VirtualHost>
Listen 6666
ServerName localhost
# WebSocket 사용시
EnableWsTunnel
WSUpgradeHeader websocket
# mod_cluster reverse proxy용 서비스 정의
<VirtualHost *:6666>
# WAS가 연결하는 위치 정의
<Location />
# Require ip 192.168.0
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
# 이 매니저에 연결된 WAS그룹 이름 지정
# 만약 WAS 에서 직접 balancer 이름을 지정하는경우 무시된다.
ManagerBalancerName mycluster
# Advertise 기능 활성화 여부
ServerAdvertise Off
EnableMCMPReceive
# modcluster 관련 로그 출력
LogLevel info
ErrorLog logs/modcluster.log
# 원본 호스트의 요청 헤더를 백엔드로 넘겨줌
ProxyPreserveHost on
# Where administrator reads the console from
<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from all
#Require ip 127.0.0
</Location>
</VirtualHost>
</IfModule>
/* 아파치 서버 재기동후 브라우저에서 확인한다. */
브라우저 접속 은 http(80)이나 https(443) 포트만 허용된다.
6666 포트는 내부 was 통신만 허용된다.
curl http://127.0.0.1:6666/mod_cluster-manager
브라우저 http://127.0.0.1/mod_cluster-manager