Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags more
Archives
Today
Total
관리 메뉴

holssi 님의 블로그

xcp-ng vm에 apache-tomcat, php 설치 본문

카테고리 없음

xcp-ng vm에 apache-tomcat, php 설치

holssi 2026. 5. 10. 12:33

설치 버전

설치 경로

 

Royal TS

서버에 접속할때 사용하는 원격 관리 도구

RDP, SSH, VNC, SFTP 등 다양한 프로토콜을 하나의 프로그램에서 관리함

 

1. 설치 파일 준비

apache 2.0 일때는 apr, apr-util이 필요가 없음

apache-2.4 이상에서는 apr, apr-util이 없어서 별도 파일 혹은 설치가 필요함

- apr-util 1.6.3.tar.gz

- apr-1.6.3.tar.gz

- httpd-2.4.59.tar.gz

- pcre-8.44.tar.gz 

- php-8.2.30.tar.gz

- re2c-3.1.tar.gz

 

2. 터미널 서버에 접속해서 위의 파일들 이관 및 xcp-ng 서버에 /root경로로 파일 이동

  1. deneb의 kaeunlee 계정에서 sftp root@[xcp-ng 서버] (스크립트를 돌리기 전이므로 xcp-ng 서버에 kaeunlee 계정이 없음)
  2. put [파일명]
  3. ssh root@ [xcp-ng 서버]

현재 xo lite를 보면 xcp-ng-inframgr 밑에 kaeunlee_test 서버가 있는걸 알 수 있고, 위 파일들을 kaeunlee_test 서버에서 쓰고 싶음 (kaeunlee_test 서버는 xcp-ng 하이퍼바이저 위에서 실행중인 별도의 vm)

/root 경로에 있는 파일들은 호스트 서버의 로컬 스토리지에 있는 것이고, 가상 머신 내부에서는 이 파일들이 보이지 않음. 

1. scp를 통해 파일 전송 (네트워크 이용)

가상 머신 내부에서 호스트 서버로 접속해서 파일 복사하기

ssh root@175.115.95.40 "ls -l /root" (파일 목록 확인)

 

scp root@175.115.95.40:/root/* . (/root/ 밑에 있는 모든 파일 가져오기)

폴더를 추가로 가져오려면, scp -r root@175.115.95.40:/root/Rocky9_Script .

 

3. 환경보안 스크립트 돌리기

1) common_step1_config.py

2) common_step2_config.py

3) inframgr_step1_config.py

4) inframgr_step2_config.py

 

4. pcre2-10.47 설치

pcre(Perl Compatible Regular Expressions)는 펄 호환 정규 표현식으로서, 정규식 패턴 일치를 구현하는 함수의 집합

apache, php, kde 등을 포함한 오픈 소스 프로젝트에서 사용되고 있고, 아파치 2.4  버전 설치시 pcre를 설치해야함

설치한 버전: pcre-10.47

설치한 경로: /root/pcre2-pcre2-10.47

cd ~
tar -zxvf prce2-pcre2-10.47.tar.gz
cd pcre2-10.47
./configure --prefix=/usr/local/pcre
make && make install

./configure --prefix로 현재 디렉토리에 있는 configure 스크립트를 실행하고, 소스 코드를 빌드(컴파일)하기 전, 어떤 옵션으로 어디에 설치할지 결정

 

4. apr/apr-util/apache 설치

아파치 필요 패키지 설치

rpm -qa로 현재 설치되어 있는 모든 rpm 패키지 목록 확인

rpm -qa | grep openssl-devel
rpm -qa | grep expat-devel

없으면 yum install openssl-devel expat-devel

openssl 라이브러리는 데이터 통신을 암호화하는 개발 도구, apache(httpd)나 php에서 https(ssl/tls) 기능을 사용하려면 보안 통신 코드가 필요하고 이를 위해 openssl 기능을 빌려야함

expat-devel은 xml 파일을 읽고 해석하는 expat 라이브러리 개발 도구

 

!!!!! 보안 스크립트 돌려서 yum install이 안됨..!!!!

 

apr 설치

apr은 /아파치경로/srclib/apr 경로 해제함

특정 폴더로 압축 풀기: tar -zxvf apr-1.6.3.tar.gz -C /httpd-2.4.59/srclib/apr --strip-components=1

 

apr-util 설치

apr-util은 /아파치경로/srclib/apr-util 경로 해제함

특정 폴더로 압축 풀기

tar -zxvf apr-util-1.6.3.tar.gz -C /httpd-2.4.59/srclib/apr-util --strip-components=1

--strip-components=1은 압축을 풀때 압축 파일 내의 최상위 디렉토리를 제거하고 그 내용물만 꺼내기 위해 사용함

일반적으로 오픈소스 코드 압축시 apr-util-1.6.3/과 같은 이름의 폴더 안에 파일들이 들어있음. 이 옵션을 사용하면 해당 폴더 자체는 생성하지 않고, 그 안에 들어있는 파일들만 지정한 경로에 풀리게 됨

 

SERVERLIMIT 수정

vi server/mpm/worker/worker.c 폴더 수정

#define DEFAULT_SERVER_LIMIT 16 -> 64로 수정하려고 하는데, /root 경로에서 해당 파일은 없는 파일임

파일이 없는 이유는 tar 명령어로 압축을 푼 위치와 vi로 실행하는 위치가 다름 -> httpd-2.4.59 소스 코드가 풀려 있는 최상위 디렉토리로 이동

cd ~
tar -zxvf httpd-2.4.59.tar.gz -C /httpd-2.4.59 --strip-components=1 (httpd 소스 압축을 /httpd-2.4.59 폴더에 풀기, --strip-components=1을 써서 중복 폴더 생성 방지)
cd /httpd-2.4.59
ls -F
vi server/mpm/worker/worker.c

 

#define DEFAULT_SERVER_LIMIT 16 -> 64 (서버가 한 번에 감당할 수 있는 최대 프로세스 개수의 한계치 높이기)

apache의 worker mpm 방식은 여러 개의 프로세스를 띄우고, 각 프로세스가 또 여러 개의 스레드를 만들어 요청을 처리함

일반적으로 apache 기본 설정(httpd.conf)에서 ThreadsPerChild (프로세스당 스레드 수)를 설정하는데 보통 25이 기본값임

수정 전: 16 x 25 = 400 -> 동시 접속사 최대 400명

수정 후: 64 x 25 = 1600 -> 동시 접속사 최대 1600명

 

apache 설치

cd /httpd-2.4.59

./configure \
--prefix=/home/service/apache/cms \
--with-included-apr \
--with-pcre=/usr/local/pcre/bin/pcre2-config \
--with-expat=/usr/local/expat \
--with-mpm=worker \
--disable-cgid

make ; make install

 

에러1. apache 빌드할때 pcre를 찾지 못했음

위에서 pcre 실행 파일과 라이브러리가 /usr/local/pcre 경로에 생성되었다

apache(htttpd)가 그 위치를 정확히 알 수 있도록 경로 다시 지정해서 configure 돌리기

 

에러2. pcre2-config 라는 파일은 찾았지만, 파일이 정상적인 실행 스크립트가 아님

 

--with-included-apr 옵션을 사용하려면, apr과 apr-util 소스 디렉토리를 apache 소스 내부로 옯겨두어야함

apr-1.6.3 폴더 이름을 apr로 변경해서 httpd-2.4.59/srclib/ 안으로 복사

apr-util-1.6.3 폴더  이름을 apr-util로 변경해서 httpd-2.4.59/srclib/ 안으로 복사

 

불필요한 디렉토리 삭제

cd /home/service/apache/cms
rm -rf cgi-bin icons logs manual htdocs

 

5. php 설치

버전: php 8.2.30.이고 php 8.2 버전부터는 보안과 성능을 위해 pcre2를 필수로 요구함

apache와 pcre2경로를 php 설정시 정확히 연결할 것

cd /root
unzip php-8.2.30-src.zip
cd php-8.2.30

 

php 컴파일 설정

php는 웹 서버와 연결되어야 하므로 apxs 경로를 지정해야하며, pcre2 경로를 지정

./configure \
--prefix=/home/service/php \
--with-apxs2=/home/service/apache/cms/bin/apxs \
--with-config-file-path=/home/service/php/etc \
--with-pcre-regex=/usr/local/pcre \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mbstring \
--disable-debug

 

에러. ls -F 했을때 configure 파일이 없고 buildconf와 configure.ac만 있음

다운로드한 파일이 미리 컴파일 준비가 완료된 상태가 아니라 개발용 소스 상태이기 때문임 -> configure 파일을 직접 만들어야함

 

현재 configure 파일이 없고 buildconf, configure.ac만 있음. 

보통은 ./buildconf를 실행하면 되지만, 이 과정에서 autoconf 라는 도구가 시스템에 설치가 되어 있어야됨. 차라리 configure 파일 생성

cd /root/php-8.2.30
./buildconf --force

 

했는데 root 임에도 Permission denied가 뜸

root 계정이라도 실행 권한이 없으면 리눅스는 보안상 실행을 거부함

특히 zip 파일로 압축을 풀면 실행 권한이 사라지는 경우가 많음

해결

실행 권한 부여: chmod +x buildconf

다시 실행: ./buildconf --force

 

php 소스를 빌드 가능한 상태로 만드는 과정에서 re2c 라는 도구가 없어서 발생

re2c는 php의 구문 분석기(Lexer)를 생성하는 도구인데, 현재 소스가 개발용 소스라 직접 생성하려고 시도하다가 막힌 상황

 

re2c github releases에서 3.1 버전의 .tar.gz 파일 받아서 서버로 옮기고 컴파일 및 설치

 

re2c 설치

# 1. 파일이 있는 곳으로 확실히 이동
cd /root

# 2. 파일 목록을 다시 확인 (여기서 파일명이 정확히 보이면 3번 진행)
ls -lh re2c-3.1.tar.gz

# 3. 경로 없이 파일명만 넣어서 압축 해제
tar -xzvf re2c-3.1.tar.gz

 

re2c-3.1 소스 패키지에 미리 만들어진 configure 스크립트가 포함되어 있지 않음

autogen.sh를 실행해서 환경에 맞는 configure 파일 먼저 생성

# 1. autogen.sh를 실행하여 configure 파일 생성
./autogen.sh

# 2. 이제 생성된 configure를 실행 (여기서 에러가 없다면 성공)
./configure

# 3. 컴파일 및 설치
make && make install

# 4. 설치 확인
re2c --version

 

 

php 설치 중에 configure: error: nothing to build 메시지는 빌드할 대상이 아무것도 선택되지 않았다는 뜻

php를 어던 방식(cli, apache 모듈 등)으로 사용할지 결정하는 SAPI(Server API) 설정이 모두 none 으로 되어 있어서 발생

 

아파치 설치 경로 확인: find / -name apxs 2>/dev/null

 

php를 빌드할때 --with-apxs2 옵션에 넣어야하는 경로는 소스 파일이 아니라 아파치가 실제로 설치된 경로의 bin/apxs 여야함

 

에러: make 도중에 expat.h 파일이 없어서 멈춤

apache의 의존성 라이브러리인 apr-util이 xml을 처리하기 위해 expat 라이브러리를 필요로 하는데, 시스템 관련 개발 도구(header 파일)가 설치되어 있지 않아서 발생하는 에러임

 

expat-2.5.0.tar.gz 깃허브에서 다운로드 

# 1. 압축 해제 및 이동
tar -xzvf expat-2.5.0.tar.gz
cd expat-2.5.0

# 2. 설정 (시스템 기본 경로에 설치되도록 prefix 생략 가능)
./configure --prefix=/usr/local

# 3. 컴파일 및 설치
make && make install
cd /httpd-2.4.59

# 이전에 실패한 캐시 삭제 
make clean
rm -f config.cache

# PCRE2 경로를 명시하여 다시 실행
./configure --prefix=/home/service/apache/cms \
--enable-so \
--enable-mods-shared=all \
--with-pcre=/usr/local/bin/pcre2-config

 

 

make: 소스 코드를 실제 실행 파일로 변환 (컴파일)

make install: 변환된 파일들을 /home/service/apache/cms 경로로 복사

 

설치 확인

ls -l /home/service/apache/cms/bin/apxs

 

다시 php설치

phpm는 apache 모듈, cli, fpm(fastGCI) 등 다양한 형태(SAPI, Server API)로 동작할 수 있음

시스템이 무엇을 만들어야할지 몰라서 발생한 에러

./configure \
--prefix=/home/service/php \
--with-apxs2=/home/service/apache/cms/bin/apxs \
--with-config-file-path=/home/service/php/etc \
--with-external-pcre=/usr/local/pcre \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mbstring \
--disable-debug

 

php 설정 스크립트가 어떤 sapi를 만들어야하지? 라는 질문에 답을 못찾음

php가 해당 경로에 있는 apxs를 정상적인 파일로 인식하지 못하고 무시해버림

head 결과값 보니 Shebang 설정은 정상임. 즉 Perl 경로 문제는 아님

apxs 실행 테스트는 성공함

 

libxml2-devel 소스 파일: libxml2-2.11.x.tar.xz

cd /root
tar -xvf libxml2-2.11.x.tar.xz
cd libxml2-2.11.x
./configure --prefix=/usr/local/libxml2
make && make install

make가 안되는 이유는 configure 과정이 성공적으로 끝나지 않아서 Makefile이 생성되지 않아서임

# 이전에 생성된 찌꺼기 제거 
rm -f config.cache

# Python과 ICU 등 의존성이 많이 걸리는 기능을 끄고 다시 시도 
./configure --prefix=/usr/local/libxml2 --without-python --without-icu

 

sqlite: sqlite-autoconf-3xxxxxx.tar.gz

cd /root
tar -zxvf sqlite-autoconf-3xxxxxx.tar.gz
cd sqlite-autoconf-3xxxxxx
./configure --prefix=/usr/local/sqlite3
make && make install

 

 

다시 php 설치

# 이전에 실패한 캐시 삭제
rm -f config.cache

# PKG_CONFIG_PATH에 직접 설치한 라이브러리 경로 등록 (한 줄로 입력)
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/libxml2/lib/pkgconfig:/usr/local/sqlite3/lib/pkgconfig:/usr/local/pcre/lib/pkgconfig

./configure \
--prefix=/home/service/php \
--with-apxs2=/home/service/apache/cms/bin/apxs \
--with-config-file-path=/home/service/php/etc \
--with-external-pcre=/usr/local/pcre \
--with-libxml-dir=/usr/local/libxml2 \
--with-sqlite3=/usr/local/sqlite3 \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--enable-mysqlnd \
--enable-mbstring \
--disable-debug

 

 

 

위처럼 해도 실패...

php가 아파치 모듈을 만들기 위해 apxs를 참조하려고 했으나 실패한 상황

 

1. 아파치의 DSO 지원 여부 확인

php가 아파치용 모듈(SAPI)로 빌드하려면, 아파치 자체가 동적 모듈 로드(mod_so) 기능을 가지고 있어야함

/home/service/apache/cms/bin/httpd -l

mod_so.c 파일 확인

 

2. apxs 파일 내 경로 꼬임 확인

apxs는 스크립트 파일이고, vi /home/service/apache/cms/bin/apxs로 my $installbuilddir = "..."나 my $prefix = "..."에 /home/service/apache/cms를 가리키고 있는지 확인 -> 경로 정확히 기입

 

해결

export LDFLAGS="-L/usr/local/libxml2/lib -L/usr/local/sqlite3/lib -L/usr/local/pcre/lib -L/usr/local/expat/lib"

export CPPFLAGS="-I/usr/local/libxml2/include/libxml2 -I/usr/local/sqlite3/include -I/usr/local/pcre/include -I/usr/local/expat/include"

export PKG_CONFIG_PATH=/usr/local/libxml2/lib/pkgconfig:/usr/local/sqlite3/lib/pkgconfig:/usr/local/pcre/lib/pkgconfig

 

./configure --prefix=/home/service/php --with-apxs2=/home/service/apache/cms/bin/apxs 
--with-config-file-path=/home/service/php/etc --with-external-pcre=/usr/local/pcre 
--with-libxml --with-sqlite3=/usr/local/sqlite3 --enable-mysqlnd 
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-mbstring --disable-debug

 

 

apxs 실제 경로: /home/service/apache/cms/bin/apxs

 

 

/home/service/apache/cms/bin/httpd -V | grep DSO 하면 아무것도 안나와

Apache가 --enable-so 없이 빌드됨. DSO(동적 모듈) 지원 없고, apxs로 mod_php를 붙일 수 없어서 PHP configure가 nothing to build 출력

 

php의 --with-apxs2는 apache에 동적 모듈(.so) 형태로 php를 붙이는 방식인데 apache가 dso 없이 빌드되면 동적 모듈 자체를 로드할 수 없음

 

아파치 소스 디렉토리에서 

make clean

./configure \
--prefix=/home/service/apache/cms \
--enable-so \
--enable-rewrite \
--enable-mods-shared=all

make
make install

 

 

/home/service/apache/cms/bin/httpd -V | grep DSO

 

mod_so.so가 없음