연동 방법 두 가지
Apache와 PHP를 연동하는 방법은 크게 두 가지가 있음
- mod_php를 이용
- php-fpm을 이용
- 다른 방법들도 존재하지만 오래된 방법들이고 현재는 성능이나 보안 상 추천하지 않음
- CGI
mod_php를 이용하는 방법
- mod_php는 Apache가 php 파일에 대한 인터프리터로 동작할 수 있게 해주어 Apache가 외부 프로세스와 통신하지 않고 php를 직접 다뤄서 결과를 낼 수 있음
장점
- 편리함
- 비교적 설정이 간단함
단점
- Apache 최신 버전(2.4)에서는 지원하지 않음
- 웹서비스에 필요한 자원에 대한 권한이 Apache httpd 프로세스의 소유자(주로 root)에게 주어져야 함
설치 방법
직접 빌드해서 설치하는 방법
- Apache httpd를 직접 빌드하는 경우 --enable-so 옵션을 가지고 빌드해야 나중에 모듈을 동적으로 로드할 수 있음
- 아래 configure 명령에는 한두 가지 옵션만 설정되어 있으나 실제로는 여러 옵션을 조합해서 설정해야 원하는 모든 기능이 Apache httpd와 모듈에 포함됨
- 다운로드해야 할 소스
- Apache httpd: http://httpd.apache.org/download.cgi
- apr & apr-util: https://apr.apache.org/download.cgi
# 다운로드 (버전은 달라질 수 있음)
wget http://archive.apache.org/dist/httpd/httpd-2.2.34.tar.bz2
wget http://apache.mirror.cdnetworks.com//apr/apr-1.6.5.tar.bz2
wget http://apache.mirror.cdnetworks.com//apr/apr-util-1.6.1.tar.bz2
wget -O php-7.3.3.tar.bz2 http://php.net/get/php-7.3.3.tar.bz2/from/this/mirror
tar xvfj httpd-2.2.34.tar.bz2
tar xvfj apr-1.6.5.tar.bz2
tar xvfj apr-util-1.6.1.tar.bz2
tar xvfj php-7.3.3.tar.bz2
cd apr-버전/
./configure && make all install
cd ../apr-util-버전/
./configure --with-apr=../apr-버전 && make install
# 빌드 시에 expat 관련 에러가 발생하면 apt install libexpat1-dev로 라이브러리와 헤더 설치하고 다시 빌드
cd ../httpd-버전/
./configure --with-apr=../apr-버전 --with-apr-util=../apr-util-버전 --enable-so && make all install
cd ~/php-버전/
./configure --with-iconv --with-pear --with-apxs2=/usr/local/apache2/bin/apxs --with-gettext=shared && make all install
# 빌드 시에 libxml2 관련 에러가 발생하면 apt install libxml2-dev로 라이브러리와 헤더 설치하고 다시 빌드
# Apache httpd의 초기 설정 필요함 (ServerName 항목 작성)
vi /usr/local/apache2/conf/httpd.conf
# php 소스코드 형태로 제공되지 않고 해석되도록 하려면 mime type 정의를 변경해야 함
echo "application/x-httpd-php php" >> /usr/local/apache2/conf/mime.types
# 서비스 구동
/usr/local/apache2/bin/apachectl start
# 서비스 프로세스 확인
ps aux | grep httpd
- 소스 빌드 시 문제가 생긴다면 다음 페이지를 참고할 것
# php phpinfo(); ?라는 내용을 포함하고 있는 test.php 파일 생성
vi /usr/local/apache2/htdocs/test.php
# curl이나 w3m으로 확인
curl http://localhost/test.php
패키지 관리자를 이용하여 설치하는 방법
- yum이나 apt를 이용해서 설치하는 경우, 자동으로 동적 모듈 로딩 기능이 활성화되어 있고 모듈을 설치하면서 자동으로 활성화됨
# 설치
apt install apache2 libapache2-mod-php
# Apache httpd의 초기 설정 필요함 (ServerName 항목 작성)
vi /etc/apache2/sites-enabled/000-default.conf
# 서비스 구동
service apache2 start
# 서비스 프로세스 확인
ps aux | grep apache2
# php phpinfo(); ?라는 내용을 포함하고 있는 test.php 파일 생성
vi /var/www/html/test.php
# curl이나 w3m으로 확인
curl http://localhost/test.php
php-fpm을 이용하는 방법
- Apache 2.4에서는 FastCGI의 구현체인 php-fpm을 이용하는 방법을 권장함
장점
- php-fpm 프로세스를 prefork하여 고성능을 확보할 수 있음
- 독립적인 프로세스라서 Apache httpd에 영향을 주지 않음
- 웹서비스에 필요한 자원에 대한 권한을 Apache httpd 프로세스의 소유자와 분리할 수 있음
단점
- 빌드나 설정, 운영이 복잡함
설치 방법
직접 빌드해서 설치하는 방법
- 소스 다운로드하여 빌드하는 과정은 위의 내용을 참고할 것
# PHP 빌드 시에 --enable-fpm 옵션 추가
cd ~/php-버전/
./configure --with-iconv --with-pear --with-apxs2=/usr/local/apache2/bin/apxs --with-gettext=shared --enable-fpm && make all install
# 빌드 시에 libxml2 관련 에러가 발생하면 apt install libxml2-dev로 라이브러리와 헤더 설치하고 다시 빌드
/usr/local/apache2/conf/httpd.conf 설정 변경
ServerName www.example.com
User nobody
Group nobody
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule php7_module modules/libphp7.so
Require all granted
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /run/php/php-fpm.sock -pass-header Authorization
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
# Deny access to files without filename (e.g. '.php')
Require all denied
- User와 Group은 php-fpm의 설정과 맞춰야 함
- php7 모듈은 비활성화하고 actions, alias, proxy, proxy_fcgi 모듈은 활성화해야 함
- URL이 test.php처럼 php 파일을 요청하면 proxy 모드로 유닉스 도메인 소켓을 가지고 통신을 하게 됨
- SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
- php-fpm은 이 유닉스 도메인 소켓을 읽어서 요청을 받게 됨
- listen = /run/php/php-fpm.sock
# 기본 설정 파일을 실제 사용할 설정 파일로 이름 변경
mv /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
mv php-fpm.d/www.conf.default php-fpm.d/www.conf
php-fpm.conf의 include 설정 항목을 다음과 같이 변경
include=/usr/local/etc/php-fpm.d/*.conf
php-fpm.d/www.conf의 listen 설정 항목을 다음과 같이 변경 (/run/php 디렉토리를 생성할 필요가 있음)
listen = /run/php/php-fpm.sock
# Apache httpd 서비스 구동
/usr/local/apache2/bin/apachectl start
# Apache httpd 서비스 프로세스 확인
ps aux | grep httpd
# php-fpm 서비스 구동
/usr/local/sbin/php-fpm
# nobody user나 group이 없다는 에러 메시지나 발생하면 useradd nobody 또는 groupadd nobody로 추가해줄 것
# php-fpm 서비스 프로세스 확인
ps aux | grep fpm
# php phpinfo(); ?라는 내용을 포함하고 있는 test.php 파일 생성
vi /var/www/html/test.php
# curl이나 w3m으로 확인
curl http://localhost/test.php
패키지 관리자를 이용하여 설치하는 방법
# 설치
apt install apache2 php-fpm
sites.enabled/000-default.conf 파일을 편집기로 열어서 다음과 같이 설정을 <VirtualHost> 내부에 추가함
Require all granted
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /run/php/php7.0-fpm.sock -pass-header Authorization
mods-enabled/proxy.load 파일 작성
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
mods-enabled/proxy_cfgi.load 파일 작성
# Depends: proxy
LoadModule proxy_fcgi_module /usr/lib/apache2/modules/mod_proxy_fcgi.so
# Apache httpd의 초기 설정 필요함 (ServerName 항목 작성)
vi /etc/apache2/sites-enabled/000-default.conf
# Apache httpd 서비스 구동
a2enmod proxy proxy_fcgi
service apache2 start
# 서비스 프로세스 확인
ps aux | grep apache2
# php-fpm 서비스 이름 확인
service --status-all | grep fpm
# php-fpm 서비스 구동
service php7.2-fpm start
# php-fpm 서비스 프로세스 확인
ps aux | grep fpm
# php phpinfo(); ?라는 내용을 포함하고 있는 test.php 파일 생성
vi /var/www/html/test.php
# curl이나 w3m으로 확인
curl http://localhost/test.php