이번 글에서는 무료서버에 워드프레스 설치를 하는 과정 중 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