이번 글에서는 무료서버에 워드프레스 설치를 하는 과정 중 PHP설치 방법에 대해서 알아보도록 하겠습니다.
관련글 목록
본 글은 오라클 클라우드를 이용하여 무료 서버를 구축하고자 하시는 분들을 위해서 연재되고 있습니다. 글의 순서는 다음과 같습니다.
무료서버에 워드프레스 설치 – nginx, MariaDB 설치
무료서버에 워드프레스 설치 – PHPMyAdmin 설치하는 2가지 방법
무료서버에 워드프레스 설치 – MySQL DB 설정 및 워드프레스 설치
무료서버에 워드프레스 설치
Nginx는 Apache와는 달리 PHP 파일 처리를 위한 내장 지원이 없습니다. PHP-FPM(“fastCGI 프로세스 관리자”)을 이용하여 PHP 파일을 처리합니다.
Ondrej Sur라는 데비안 개발자는 여러 PHP버전을 포함한 리포지토리를 관리합니다. 다음 명령어를 터미널에 입력하여 외부 저장소 설정을 합니다.
sudo apt install software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt update
다음의 링크를 통해서 현재 최신의 PHP 버전을 확인하실 수 있습니다. 2023년 8월 기준 PHP는 8.2.8이 최신의 Stable 버전입니다.

향후에 버전을 확인하실 때에는 이보다 더 높은 버전이 제공되고 있을 것입니다. 그 때에는 아래 명령어 중 PHP_VERSION 변수값을 수정하여 명령어를 터미널에서 수행하시면 됩니다. 버전이 8.2.8이 최신이지만 앞의 두 자리수만 버전으로 이용하여 설치합니다.
PHP_VERSION=8.2 sudo apt install php$PHP_VERSION php$PHP_VERSION-cli php$PHP_VERSION-fpm \ php$PHP_VERSION-bcmath php$PHP_VERSION-bz2 php$PHP_VERSION-common php$PHP_VERSION-curl \ php$PHP_VERSION-gd php$PHP_VERSION-mbstring \ php$PHP_VERSION-readline php$PHP_VERSION-soap \ php$PHP_VERSION-xml php$PHP_VERSION-xmlrpc php$PHP_VERSION-zip \ php$PHP_VERSION-redis php$PHP_VERSION-gmp \ php$PHP_VERSION-mysql php$PHP_VERSION-imagick php$PHP_VERSION-intl \ php$PHP_VERSION-dev php$PHP_VERSION-dba php$PHP_VERSION-opcache -y
7.4 버전까지는 제공되던 geoip 패키지가 8.1 버전 이후부터는 더이상 제공되지 않습니다. 따라서 아래와 같이 composer를 이용하여 추가로 설치합니다.
sudo apt install -y geoip-bin geoip-database geoipupdate -v curl -sS https://getcomposer.org/installer | php php composer.phar require geoip2/geoip2:~2.0
PHP 설정하기
PHP 및 PHP-FPM 설정을 진행합니다.
php.ini
먼저 수정할 것은 php.ini 파일이며, 보통 다음의 경로에 있습니다. (/etc/php/8.2/fpm/php.ini) 자신의 설치한 php 버전에 따라서 중간에 들어가는 숫자의 값이 달라집니다. 만약 8.1 버전으로 설치하셨다면 /etc/php/8.1/fpm/php.ini 파일을 열어야 합니다.
다음의 명령어를 터미널에 입력하여 해당 파일이 있는 폴더로 이동합니다.
cd /etc/php/8.2/fpm/ ls -al
ls는 폴더 내 파일 목록을 확인하는 명령어 입니다.

다음의 그림과 같이 중간에 php.ini 파일이 있는 것을 확인하실 수 있습니다. php.ini 파일을 수정하기 위해서 nano 라는 프로그램을 사용해 보겠습니다. vim과 nano를 주로 사용하는데 윈도우에 익숙하신 분들은 nano를 조금 더 편리하게 사용하실 수 있습니다.
sudo nano php.ini

명령어를 입력하면 위 그림과 같이 php.ini 파일이 열립니다. 파일 내부에 몇 군데 수정할 부분이 있는데 파일이 길이 내용을 찾기 수월하지 않습니다. Ctrl+w를 누르면 화면의 하단에 검색창이 뜨며 원하는 키워드를 검색하여 수정이 필요한 위치로 이동합니다. 예를 들어 date.timezone을 수정하기 위해서 timezone을 검색하여 이동하는 식입니다.
수정하려는 문구 앞에 세미콜론(;)이 붙어있으면 주석처리된 내용입니다. 세미콜론을 없애야 적용됩니다.

date.timezone = Asia/Seoul expose_php = Off post_max_size = 512M upload_max_filesize = 200M memory_limit = 512M
값은 자신의 상황에 맞춰서 조정하시면 됩니다. 수정이 완료되었다면 Ctrl+o를 입력하여 변경 내용을 저장하고 Ctrl+x를 눌러서 프로그램을 종료합니다.
php-fpm.conf
다음으로 수정할 파일은 php-fpm.conf 파일입니다. 파일 경로는 다음과 같습니다.
/etc/php/8.2/fpm
앞선 경우와 같이 자신의 php 버전에 따라 경로 중간의 숫자를 변경해 주어야 합니다.
cd /etc/php/8.2/fpm ls -al

폴더 내 php-fpm.conf 파일이 있는 것을 확인하였습니다. nano를 열어 파일을 수정해 보도록 하겠습니다.
sudo nano php-fpm.conf
아래의 내용을 수정합니다. 역시나 Ctrl+w 검색기능을 이용하여 각각의 내용을 수정합니다. error 로그가 저장되는 경로에 버전정보가 있는 것을 볼 수 있습니다. 자신이 설치한 버전으로 수정하여 변경합니다.
error_log = /var/log/php8.2-fpm.log log_level = notice
www.conf
다음으로 수정할 파일은 www.conf 파일입니다. 다음의 명령어를 터미널에 입력하여 해당 파일이 있는 위치로 이동합니다.
cd /etc/php/8.2/fpm/pool.d
기존의 www.conf 파일을 www.conf.ori 이름으로 백업해 두겠습니다.
sudo cp -rp www.conf www.conf.ori ls -al

nano를 이용하여 파일을 열어 수정합니다.
sudo nano www.conf
수정이 필요한 부분은 아래와 같습니다.
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
listen = /run/php/php8.2-fpm.sock
; 접속을 받는 방식을 설정 - Socket(USD) 방식 이용
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 40
pm.max_requests = 500
; pm.max_children 는 설정된 PHP Pool내에서 가동할 수 있는 최대 자식 프로세스 수를 의미
; pm.start_servers 는 php-fpm 을 실행할 때 초기에 생성하는 자식 프로세스의 개수
; pm.min_spare_servers 는 idle 상태의 자식 프로세스 개수
; pm.max_spare_servers 는 idle 상태의 자식 프로세스의 최대 개수
; pm.max_requests 는 각 프로세스가 최대 request를 처리하는 수
access.log = /var/log/php-fpm-$pool.access.log
; 주석제거 및 경로 및 파일명 변경
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
; 주석제거
slowlog = /var/log/php-fpm-$pool.log.slow
; 주석제거 및 경로 및 파일명 변경
request_slowlog_timeout = 5
; 주석제거, 내용변경
php_admin_value[error_log] = /var/log/fpm-php.$pool.error.log
; 주석제거 및 경로 및 파일명 변경
php_admin_flag[log_errors] = on
; 주석제거
Nginx 설정 변경하기
다음으로 Nginx 설정을 해보도록 하겠습니다.
nginx.conf
먼저 수정할 파일은 nginx.conf 라는 파일입니다. nginx관련한 파일은 /etc/nginx 폴더에 주로 있습니다. 다음 명령어를 이용해서 해당 폴더에 있는 nginx.conf 파일을 열어보도록 하겠습니다.
sudo nano /etc/nginx/nginx.conf
nginx.conf 파일이 열렸다면 정상적으로 실행된 것입니다. 만약 빈 파일이 열렸다면 해당 경로에 파일이 있는지부터 확인해야 합니다. 아래의 내용을 변경합니다.
기존 내용에 비해 파일 압축을 위한 gzip 설정 및 추가 http 설정이 변경되었습니다.
user nginx;
# user 정보를 변경합니다.
worker_process auto;
# 접속받고 처리하는 worker_process 수 이며 auto값으로 유지합니다.
error_log /var/log/nginx/error.log notice;
# 로깅 레벨을 notice 수준으로 설정합니다. 기동과 중지와 관련된 로그를 받을 수 있습니다.
event {
use epoll;
# 추가
worker_connections 1024;
# 한 worker당 가능한 접속수를 의미합니다.
}
http {
log_not_found off;
index index.php index.htm index.html;
# 위 2개 라인을 기존 내용에 추가합니다.
## 컨텐츠 압축을 위한 gzip 사용
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 500;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_vary on;
gzip_types
text/plain
text/css
text/js
text/xml
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
image/svg+xml
image/png;
tcp_nopush on;
tcp_nodelay on;
aio on;
sendfile_max_chunk 512k;
directio 4m;
server_tokens off;
client_max_body_size 50M;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
http2_max_concurrent_streams 512;
# 위 내용을 http 아래에 추가합니다.
}default.conf
default.conf 파일을 수정합니다. nginx 폴더 아래 conf.d 폴더 내에 있으며 서버 설정을 할 수 있습니다. 먼저 기존의 파일을 백업 합니다.
cd /etc/nginx/conf.d sudo cp -rp default.conf default.conf.ori
default.conf 파일을 열어 수정해 보도록 하겠습니다.
sudo nano default.conf

위와 같은 화면이 나온다면 정상적으로 파일을 연 것입니다. 아래의 내용을 변경합니다.
server {
listen 80 default_server;
# 포트번호 설정
server_name localhost;
# IP나 도메인을 입력합니다. 도메인이 없다면 localhost로 작성합니다.
charset utf-8;
# charset 설정합니다.
access_log /var/log/nginx/localhost.access.log;
error_log /var/log/nginx/localhost.error.log;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
# wordpress setting
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# root html;
fastcgi_pass unix:/run/php/php-fpm.sock;
# fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
proxy_redirect off;
fastcgi_intercept_errors on;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
location = /xmlrpc.php {
deny all;
error_page 403 = /403.html;
}
}
default.conf 파일을 없는 경우
설치하는 버전에 따라서 위 경로에 default.conf 파일이 없는 경우가 있습니다. 먼저 nginx.conf 파일을 살펴보면 다음과 같은 부분이 보입니다.

nginx 아래 conf.d 폴더 내 뿐만 아니라 sites-enabled라는 폴더도 함께 include 하는 경우 conf.d 폴더 아래에 default.conf 파일이 없는 경우가 있습니다.
sites-enabled 폴더로 이동해 보겠습니다.
cd /etc/nginx/sites-enabled ls -al

다음과 같이 sites-available 폴더 내에 있는 default 파일을 바라보고 있는 default 파일이 있습니다. 한번 열어보겠습니다.
sudo nano default

다음과 같이 default.conf에 해당하는 파일이 있는 것을 알 수 있습니다. 위 파일에 default.conf에서 변경한 내용을 적용하면 되겠습니다.
테스트
기본적인 설정이 완료되었고 이제 정상작동 하는지 테스트 해 보도록 하겠습니다. 먼저 nginx의 기본 home 경로에 다음의 파일을 생성해 보겠습니다.
cd /usr/share/nginx/html sudo nano phpinfo.php
아무런 내용이 없는 파일이 열리고 아래의 내용을 복사 붙여넣기 합니다.

<?php
phpinfo();
?>파일의 접근 권한을 변경합니다. 아래의 명령어를 터미널에 입력합니다.
sudo chown nginx:nginx phpinfo.php
아래 명령어를 입력하여 nginx 및 php-fpm을 재실행합니다. 터미널에 해당 명령어를 입력합니다.
sudo systemctl restart php8.2-fpm sudo systemctl restart nginx
아무런 오류 없이 정상실행되었다면 브라우저를 띄워 현재 아래와 같이 주소를 입력하여 php 정보 화면이 나오는지 확인합니다.
자신의ip주소/phpinfo.php

php-fpm 재시작 오류 발생 시
php-fpm을 재시작 하는 과정에서 다음과 같은 에러가 발생하는 경우가 있습니다. 자세한 내용을 살펴보면 다음과 같습니다.

nginx 유저를 찾을 수 없다는 내용입니다. nginx user를 추가해서 문제를 해결할 수 있습니다.
sudo adduser nginx sudo usermod -a -G nginx nginx