CentOS7에서 아파치2.4와 PHP8.2를 소스로 설치하기 > 리눅스

본문 바로가기

리눅스

리눅스

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

1.PNG


[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

2.PNG



[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



3.PNG



[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


4.PNG




[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


5.PNG


6.PNG



[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



Copyright © LEELAB.CO.KR. All rights reserved.