2018-09-05

Synology NAS에서 PHP 7.2로 워드프레스 구동하기

Synology NAS는 아직까지도 PHP 7.2 패키지를 제공하고있지 않다. PHP 7.2가 정식 출시 된지도 한참 지났는데, 아직까지도 지원해줄 생각을 안하는 이유는 뭘까. Docker 지원해 줬으니 알아서 설치해서 쓰라는건가? 하지만 Docker로 웹서버를 설치해서 쓰면 시놀로지 자체에서 지원해주는 Web Station은 물론이고 거기에 연동된 편리한 기능들 - 예를 들면 Let’s Encrypt 인증서 자동발급 및 갱신 - 을 사용할 수 없게 된다. Synology의 Web Station은 그대로 살리면서도 PHP 모듈만 연동해서 워드프레스를 사용하려면 어떻게 해야할까?

결론부터 이야기하자면 본인이 그렇게 사용하고 있다! 본인의 블로그를 보면 한달이 멀다하고 서버환경이 바뀌고 있지만, 이 글을 쓰는 현재는 Synology DS718+에서 본 블로그가 구동중이다.

일단 왜 PHP 7.2인가?

복잡한 이유는 필요없다. 워드프레스에서 권장하고 있는 PHP의 버전이 7.2 이상으로 상향조정되었기 때문이다. 이는 Wordpress.org 공식 홈페이지에서도 나타나 있으며, 여러가지 원인이 있겠지만 공식적으로는 “보안” 때문이라고 한다.

To run WordPress we recommend your host supports:

  • PHP version 7.2 or greater.
  • MySQL version 5.6 or greater OR MariaDB version 10.0 or greater.
  • HTTPS support

구축하는데 필요한 것들

본 글에서 설치할 워드프레스 환경은 다음과 같다. 본 글에서는 독자가 Docker에 대한 지식은 있다고 간주하고 진행하도록 한다.

필요한 패키지 설치

패키지 센터에서 Web Station과 Docker, MariaDB 10, 로그센터를 설치하도록 한다. PHP 패키지는 이번에는 필요하지 않다. Nginx기반으로 구동되는 Web Station에서 user.conf 설정을 통해 Docker에 설치될 php-fpm 모듈과 연동되도록 하는 것이 목표이다.

Wordpress 공식 컨테이너 이미지 설치하기

본래라면 DSM에서 Docker 패키지를 실행하여 작업해야하겠지만 이렇게 하면 제대로 설치하기가 힘들다. Docker 패키지는 잘 만들긴 했지만 Docker의 모든 기능을 제대로 활용하기에는 솔직히 역부족인 것이 사실이다. 특히나 이번 글의 목표를 달성하기 위해서는 SSH에서 Docker 명령어를 직접 사용해야한다. 고로, 우선 SSH를 통해 접속하고 다음의 명령어를 입력한다.

sudo docker run -d \
    -p 32901:9000 \
    --name wordpress \
    --user 1023:1023 \
    --restart always \
    --volume /etc/passwd:/etc/passwd:ro \
    --volume /etc/group:/etc/group:ro \
    --volume /volume1/web:/var/www/html \
    wordpress:php7.2-fpm-alpine

혹은 인라인으로 다음과 같이 입력한다.

sudo docker run -d -p 32901:9000 --name wordpress --user 1023:1023 --restart always --volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro --volume /volume1/web:/var/www/html wordpress:php7.2-fpm-alpine

이 명령어에서 가장 중요한 부분은 --user 1023:1023 부분이다. Synology NAS가 가지고 있는 기본 System User 중, Web Station을 담당하고 있는 것이 http 유저인데, 이 유저의 UID와 GID가 1023이다. 컨테이너에 호스트(여기서는 Synology NAS)가 가지고 있는 id 정보를 주고(--volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro), http에 해당하는 UID와 GID를 지정하여 줌으로써 (--user 1023:1023) 컨테이너의 PHP-FPM 프로세서가 호스트에 설치되어 있는 Web Station과 파일 권한 상태를 공유할 수 있도록 해주는 것이다.

두번째로, --volume /volume1/web:/var/www/html 부분을 보자. 이는 호스트의 웹 폴더(/volume1/web)를 컨테이너의 웹 기본 폴더(/var/www/html)과 연결해 주는 것이다. Docker Hub에서 제공하는 기본 wordpress 컨테이너는 /var/www/html에 워드프레스가 설치되도록 설정되어 있으므로, 호스트의 웹폴더를 해당 경로로 매칭시켜준 것이다. 만약 Synology NAS에서 다른 경로로 Wordpress를 설치하였다면, 예를 들어 /volume1/web/wordpress에 설치하였다면 위 명령어에서 해당부분을 --volume /volume1/web/wordpress:/var/www/html과 같이 변경하면 된다.

명령어를 실행한 후, 컨테이너가 정상적으로 실행되었다면 다음 단계로 진행하자.

Web Station(Nginx)과 연동하기

DSM에서 Web Station을 실행하고, 가상호스트에서 생성을 클릭하여 설정을 진행한다. 워드프레스가 설치된 폴더 - 이는 위에서 컨테이너 실행 시에 설정해주었던 웹폴더와 일치해야 한다 - 를 문서루트로 설정하고, HSTS나 HTTP/2 등을 입맛에 맞게 설정한 뒤, HTTP 백엔드 서버는 Nginx로, PHP는 구성되지 않음을 선택한다. PHP 모듈을 패키지를 설치하여 사용하는 것이 아니라 Docker 컨테이너로써 사용하는 것이기 때문에 PHP 7.2가 애초에 목록에 존재하지도 않을 뿐더러 여기서 패키지와 연동해버리면 제대로 작동하지 않는다.

가상호스트 설정이 완료되었다면 SSH로 접속하여 user.conf 설정을 진행한다. user.conf 설정이 무엇을 뜻하는지는 본 블로그의 지난 포스트를 참고하자.

/etc/nginx/conf.d 폴더 내부의 가상호스트 설정 폴더 안에 user.conf.php-fpm를 만들고 다음과 같이 입력 후 저장한다.

location / {
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass localhost:32901;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}

보통 Nginx를 PHP와 연동할 때는 SCRIPT_FILENAME$document_root$fastcgi_script_name으로 설정하는 경우가 많은데, 이는 Nginx와 PHP-FPM이 동일한 환경에 있기 때문에 상위의 설정을 그대로 받아와도 되는 것이고, 여기서는 컨테이너 내부의 웹폴더 위치를 호스트에서는 알 수 있는 방법이 없기 때문에 직접 /var/www/html$fastcgi_script_name으로 지정해주는 것이다.

여기까지 무사히 설정이 되었다면 다음의 명령어로 Nginx에 설정을 적용시킨다.

sudo nginx -s reload

이제 PHP 연동 설정은 완료되었다.

MariaDB 권한 설정

예전에 작성했던 워드프레스 설치글을 확인해보면 MariaDB에서 권한을 설정하는 부분이 있다.

/* create user '계정아이디'@'접속위치' identified by '패스워드';
 * grant all privileges on wordpress.* to '계정아이디'@'접속위치'; */

create user 'wordpress'@'localhost' identified by 'p@ssword!';
grant all privileges on wordpress.* to 'wordpress'@'localhost';

그런데 이걸 이대로 따라하면 안된다. PHP-FPM 프로세스는 Docker 컨테이너 내부에서 실행 중인 상태인데, 컨테이너에 접속해서 IP를 확인해보면 알겠지만 Docker 컨테이너는 다른 서브넷의 IP주소를 부여받는다. 따라서 접속위치를 localhost로 설정해서는 안되고, 다음과 같이 설정해준다.

create user 'wordpress'@'172.17.%' identified by 'p@ssword!';
grant all privileges on wordpress.* to 'wordpress'@'172.17.%';

만약 Docker에서 새로운 네트워크 환경을 추가했다면 해당 설정을 따라가면 된다. MariaDB 권한 설정 후에는 꼭 다음의 명령어를 통해 권한을 업데이트해주도록 하자.

FLUSH PRIVILEGES;

wp-config.php 수정하기

아직 워드프레스를 설치한 상황이 아니라면 데이터베이스 주소를 반드시 172.17.0.1:3307로 설정해주어야 한다. 앞에서도 말했지만 다른 인터넷 환경을 부여받게 되기 때문에 컨테이너 입장에서 호스트(Synology NAS)를 가리키는 주소인 172.17.0.1을 입력해주어야 한다. 만약 Docker 네트워크를 변경했다면 그에 맞게 진행해주면 된다.

만약 이미 워드프레스를 설치한 상황에서 위와 같이 진행했다면 wp-config.php 파일을 다음과 같이 수정해주어야 한다.

define('DB_HOST', '172.17.0.1:3307' );

완료!

이제 설정은 끝났다. Synology NAS의 웹서버 주소를 입력하여보면 익숙한 워드프레스 화면을 만날 수 있을 것이며, Health Check & Troubleshooting 플러그인 등 시스템 정보를 보여주는 플러그인이나 테마를 이용한다면 PHP 7.2 환경에서 구동되고 있음을 확인해 볼 수 있다.

Synology NAS에서 Web Station과 Wordpress PHP 7.2 Docker 컨테이너로 워드프레스를 구동한 결과. PHP 7.2 환경임을 확인할 수 있다.

또한 Web Station과 연동되어 있기 때문에 DSM 제어판 > 보안에서 설정하는 SSL도 그대로 사용할 수 있다. 커스텀을 하더라도 이렇게 원래 있는 기능은 그대로 사용할 수 있도록, 제대로 커스텀해서 사용하도록 하자!

댓글 6

님께 답글 취소
댓글 등록 요청
스팸 댓글을 줄이기 위해 Akismet을 사용하고 있습니다.