19. CentOS7에서 아파치2.4와 PHP8.2를 소스로 설치하기
페이지 정보
작성자 관리자 댓글 0건 조회 4회 작성일 26-11-04 17:40본문
19. CentOS7에서 아파치2.4와 PHP8.2를 소스로 설치하기
CentOS 7에서 Apache(HTTPD)와 PHP 8을 소스 컴파일(Source Compilation)로 설치하는 방법입니다.
소스 설치는 패키지 매니저(yum)를 사용하는 것보다 과정이 복잡하지만, 원하는 모듈을 직접 커스텀하고 최적화할 수 있다는 장점이 있습니다. 안정적인 연동을 위해 Apache(2.4.x)와 PHP(8.2.x) 버전 기준으로 안내해 드립니다.
1. 개발 도구 및 필수 의존성 패키지 설치
컴파일에 필요한 빌드 도구와 압축, 암호화, XML 관련 라이브러리를 먼저 설치해야 합니다.
# yum -y groupinstall "Development Tools"
# yum -y install wget openssl-devel libxml2-devel libjpeg-devel libpng-devel libwebp-devel libX11-devel libicu-devel libxslt-devel libzip-devel bzip2-devel curl-devel freetype-devel
또, Apache와 PHP 최신 버전을 빌드하려면 pcre, apr, sqlite, oniguruma 등의 최신 라이브러리가 필요합니다. 소스 컴파일을 진행할 임시 디렉토리를 만들고 이동합니다.
# mkdir -p ~/src && cd ~/src
2. Apache (HTTPD 2.4) 소스 설치
Apache는 apr과 apr-util이라는 이식성 라이브러리가 함께 필요하므로, 이들을 다운받아 아파치 소스 디렉토리 내에 넣고 한 번에 빌드하는 것이 가장 편리합니다.
# APR 및 APR-Util 다운로드 및 압축 해제
다운로드 사이트 :
https://projects.apache.org/releases.html
[root@edu src]# tar xvf apr-1.7.6.tar.gz
[root@edu src]# tar xvf apr-util-1.6.5.tar.gz
# Apache 다운로드 및 압축 해제 (최신 버전 확인 필요)
다운로드 사이트 : https://projects.apache.org/releases.html
[root@edu src]# tar xvf httpd-2.4.69.tar.gz
# APR 라이브러리를 아파치 소스 트리 내부로 이동
[root@edu src]# mv apr-1.7.6 httpd-2.4.69/srclib/apr
[root@edu src]# mv apr-util-1.6.5 httpd-2.4.69/srclib/apr-util
[root@edu src]#
# Apache 컴파일 및 설치 (/usr/local/apache2 디렉토리에 설치됨)
[root@edu src]# cd httpd-2.4.69
[root@edu httpd-2.4.69]# ./configure --prefix=/usr/local/apache2 --with-included-apr --enable-ssl --enable-so --enable-rewrite
[root@edu httpd-2.4.69]# make
crypto/apr_passwd.c:73:20: error: missing binary operator before token "("
#if __has_attribute(always_inline)
^
make[3]: *** [crypto/apr_passwd.lo] 오류 1
make[3]: Leaving directory `/home4/leelab/src/httpd-2.4.69/srclib/apr-util'
make[2]: *** [all-recursive] 오류 1
make[2]: Leaving directory `/home4/leelab/src/httpd-2.4.69/srclib/apr-util'
make[1]: *** [all-recursive] 오류 1
make[1]: Leaving directory `/home4/leelab/src/httpd-2.4.69/srclib'
make: *** [all-recursive] 오류 1
위와 같은 오류가 나온다면 아래와 같이 조치하고 다시 설치합니다.
※ 컴파일러(GCC) 버전을 높여서 빌드 (가장 근본적인 해결)
코드를 수정하지 않고 컴파일러를 최신 버전으로 전환하여 빌드하는 방법입니다. 구형 문법 오류를 근본적으로 우회할 수 있어 추후 PHP 8을 컴파일할 때도 에러를 예방할 수 있습니다.
(1) CentOS 7 확장 저장소 및 GCC 9 버전 설치
[root@edu httpd-2.4.69]# yum -y install centos-release-scl
[root@edu httpd-2.4.69]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++
(2) 현재 터미널 세션에 GCC 9 활성화
[root@edu httpd-2.4.69]# scl enable devtoolset-9 bash
다시 컴파일을 실행한다.
[root@edu httpd-2.4.69]# make
[root@edu httpd-2.4.69]# make install
[root@edu httpd-2.4.69]# cd ..
[root@edu src]#
3. PHP 8 빌드를 위한 추가 의존성 설치 (중요)
PHP 8을 CentOS 7에서 빌드할 때 기본 sqlite3와 oniguruma 버전이 낮아 컴파일 에러가 발생합니다. 이 두 가지는 소스로 직접 설치해 주어야 합니다.
① SQLite3 최신 소스 설치
다운로드 사이트 :
https://sqlite.org/download.html
[root@edu src]# tar xvf sqlite-autoconf-3540100.tar.gz
[root@edu src]# cd sqlite-autoconf-3540100/
[root@edu sqlite-autoconf-3540100]# ./configure --prefix=/usr/local/sqlite3
[root@edu sqlite-autoconf-3540100]# make
[root@edu sqlite-autoconf-3540100]# make install
[root@edu sqlite-autoconf-3540100]# cd ..
[root@edu src]#
② Oniguruma (정규식 라이브러리) 소스 설치
다운로드 사이트 :
https://github.com/kkos/oniguruma/releases
[root@edu src]# tar xvf onig-6.9.10.tar.gz
[root@edu src]# cd onig-6.9.10/
[root@edu onig-6.9.10]# ./configure --prefix=/usr/local/oniguruma
[root@edu onig-6.9.10]# make
[root@edu onig-6.9.10]# make install
[root@edu onig-6.9.10]# cd ..
[root@edu src]#
4. PHP 8 소스 설치 및 Apache 연동
이제 PHP 8 소스를 다운로드하고, 앞서 설치한 Apache 경로(apxs)와 라이브러리 경로들을 지정하여 컴파일합니다.
# PHP 8.2 다운로드 및 압축 해제 (원하는 8.x 버전 선택 가능)
다운로드 사이트 : https://www.php.net/downloads.php
[root@edu src]# tar -xvf php-8.2.35.tar.gz
[root@edu src]# cd php-8.2.35
# 컴파일 환경 변수 설정 (위에서 수동 설치한 sqlite3, oniguruma 인식용)
[root@edu php-8.2.35]# export PKG_CONFIG_PATH=/usr/local/sqlite3/lib/pkgconfig:/usr/local/oniguruma/lib/pkgconfig:$PKG_CONFIG_PATH
# PHP 환경 설정 (Apache 연동을 위해 --with-apxs2 필수)
[root@edu php-8.2.35]# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/php/etc --enable-mbstring --with-openssl --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-curl --with-zlib --enable-gd --with-jpeg --with-freetype
# 컴파일 및 설치 (/usr/local/php 디렉토리에 설치됨)
[root@edu php-8.2.35]# make
/home4/leelab/src/php-8.2.35/ext/openssl/xp_ssl.c:145:28: error: subscripted value is neither array nor pointer nor vector
145 | _bytes[14] << 8 | _bytes[15] \
| ^
/home4/leelab/src/php-8.2.35/ext/openssl/xp_ssl.c:520:5: note: in expansion of macro ‘EXPAND_IPV6_ADDRESS’
520 | EXPAND_IPV6_ADDRESS(ipbuffer, ASN1_STRING_get0_data(san->d.iPAddress));
| ^~~~~~~~~~~~~~~~~~~
make: *** [ext/openssl/xp_ssl.lo] 오류 1
위와 같이 오류가 나온다면 아래와 같이 조치후, 다시 설치합니다.
이 오류는 CentOS 7에 기본 제공되는 OpenSSL 버전(1.0.2k)이 너무 오래되어 발생하는 현상입니다.
PHP 8.2 최신 마이너 버전(8.2.31 이상)의 소스 코드(xp_ssl.c)에 OpenSSL 1.1.0 이상 버전에서 사용하는 ASN1_STRING_get0_data() 문법이 적용되었습니다. 하지만 CentOS 7의 구형 OpenSSL 라이브러리는 이 함수를 선언하지 않고 있어, 컴파일러가 이를 올바르게 해석하지 못하고 빌드를 중단시키는 것입니다.
방법1. xp_ssl.c 소스 코드 수정 (가장 추천)
오류가 발생한 파일에 구형 OpenSSL 1.0.2를 위한 호환용 코드(Shim)를 직접 삽입하여 우회하는 방법입니다. PHP 내의 다른 소스 파일(openssl.c)에서 이미 사용 중인 검증된 방식입니다.
(1) 에러가 발생한 소스 파일을 편집기로 엽니다.
[root@edu php-8.2.35]# vi ext/openssl/xp_ssl.c
(2) 파일의 가장 최상단 부분(보통 #include 문들이 모여있는 곳 뒤, 약 30~40번째 줄 근처)에 아래 호환용 매크로 코드를 붙여넣고 저장합니다.
#ifndef ASN1_STRING_get0_data
#define ASN1_STRING_get0_data(x) ((const unsigned char *)ASN1_STRING_data(x))
#endif
(3) 저장하고 나온 뒤, 깨끗하게 지우고 다시 컴파일을 진행합니다.
[root@edu php-8.2.35]# make clean
[root@edu php-8.2.35]# make
[root@edu php-8.2.35]# make install
# PHP 설정 파일 복사
mkdir -p /usr/local/php/etc
cp php.ini-development /usr/local/php/etc/php.ini
[root@edu php-8.2.35]# mkdir -p /usr/local/php/etc
[root@edu php-8.2.35]# cp php.ini-development /usr/local/php/etc/php.ini
[root@edu php-8.2.35]#
5. Apache 설정 파일 수정 (PHP 핸들러 등록)
Apache가 .php 확장자를 가진 파일을 만났을 때 PHP 엔진으로 해석할 수 있도록 설정 파일(httpd.conf)을 수정해야 합니다.
vi /usr/local/apache2/conf/httpd.conf
파일 내부에서 아래 내용을 찾아 확인하거나 추가합니다.
1. LoadModule php_module modules/libphp.so 문선이 자동으로 추가되어 있는지 확인합니다. (없다면 추가)
2. <IfModule mime_module> 섹션 내부(보안상 적당한 위치)에 아래 두 줄을 추가합니다.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
3. DirectoryIndex 부분을 찾아 index.php를 추가합니다.
DirectoryIndex index.html index.php
설정을 저장하고 나온 뒤 Apache를 실행합니다.
# Apache 시작
/usr/local/apache2/bin/apachectl start
6. 설치 및 연동 확인
동작 여부를 확인하기 위해 웹 루트 디렉토리에 테스트 파일을 생성합니다.
echo "<?php phpinfo(); ?>" | sudo tee /usr/local/apache2/htdocs/info.php
브라우저를 열고 http://서버_IP_주소/info.php로 접속했을 때, PHP Version 8.2.x 화면과 함께 Server API 항목이 Apache 2.0 Handler로 표시되면 소스 컴파일 연동이 완벽하게 성공한 것입니다.
7. PHP 설정
Find your socket path first using: find / -name mysql.sock
# vi /usr/local/php/etc/php.ini
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
8. apache 데몬 설정
(1) systemd 서비스 파일 생성 및 작성
아래 명령어로 서비스 파일을 생성하고 편집기를 엽니다.
# vi /usr/lib/systemd/system/apache.service
파일이 열리면 다음 내용을 그대로 복사하여 붙여넣고 저장합니다. (설치 경로가 /usr/local/apache2가 아니라면 ExecStart, ExecStop, ExecReload 경로를 알맞게 수정합니다.)
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecStop=/usr/local/apache2/bin/apachectl stop
ExecReload=/usr/local/apache2/bin/apachectl graceful
PrivateTmp=true
[Install]
WantedBy=multi-user.target
(2) systemd 데몬 재로드
새로운 서비스 파일을 추가했으므로 systemd 관리자 설정을 재로드합니다.
# systemctl daemon-reload
(3) 부팅 시 자동 시작 설정 및 아파치 실행
이제 systemctl 명령어를 통해 아파치 서비스를 관리할 수 있습니다.
• 부팅 시 자동 시작 설정: systemctl enable apache
• 아파치 서비스 시작: systemctl start apache
• 아파치 상태 확인: systemctl status apache
• 부팅 시 자동 시작 삭제: systemctl disable apache
9. 방화벽 설정
만약 외부 브라우저에서 접속이 되지 않는다면 CentOS 7 방화벽에서 HTTP(80) 포트가 닫혀있기 때문일 수 있습니다. 아래 명령어로 포트를 개방해 줍니다.
# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload
