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에 대한 지식은 있다고 간주하고 진행하도록 한다.
- Synology DSM 6.2
- Web Station
- Docker
- wordpress:fpm-alpine 컨테이너 이미지
- MariaDB 10
- 로그센터
필요한 패키지 설치
패키지 센터에서 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 환경에서 구동되고 있음을 확인해 볼 수 있다.
또한 Web Station과 연동되어 있기 때문에 DSM 제어판 > 보안에서 설정하는 SSL도 그대로 사용할 수 있다. 커스텀을 하더라도 이렇게 원래 있는 기능은 그대로 사용할 수 있도록, 제대로 커스텀해서 사용하도록 하자!
댓글 6
지금 이 블로그도 나스로 운영중이신가요? 저도 나스로 워프를 운영해보고싶은데 트래픽이나 속도에 대한 부분이 궁금합니다. 저는 nas 220+로 운영 생각중입니다.
아닙니다. 현재는 Github Pages + Hugo 조합으로 블로그 운영중입니다. 트래픽은 집에서 사용하시는 인터넷 환경에 따를거고, DS220+ 사용 예정이시면 퍼포먼스는 크게 문제 없습니다. 업데이트가 잦지 않은 개인용 블로그에 워드프레스 같은 큰 솔루션을 사용하는 것도 좀 그렇고, 최근의 워드프레스의 행보가 크게 마음에 들지 않아 현재는 Static Site Generator 툴인 Hugo를 사용하고 있습니다.
안녕하세요 저도 헤놀로지를 이용해 워드프레스를 운용중인데요 도메인 인증문제(https)때문에 이렇게 쪽지를 납깁니다. Lets 인크립트를 이용해 도메인인증을 받아 DSM은 인증문제없이 잘되는데 웹서버내 워드프레스에서는 게속 유효하지 않은 인증서로 문제를 일으킵니다. 혹시 해결 방법이 있을까하여 댓글 납깁니다.
블로그 도메인에 해당하는 인증서를 사용하지 않으신 것 같습니다. 혹시 synology.me 도메인용 인증서를 워드프레스용 도메인에 연동하신 것은 아닌지요? 좀 더 정확한 정보가 있어야 판단이 가능할 것 같습니다.
이거 보고 진행했긴했는데요… 저는 접속하니 index.php 파일 내용이 다 노출이 되네요¿ 이건 어떻게 해야 하나요?
index.php가 노출된다는 것은 Nginx와 PHP가 제대로 연동되지 않았다는 뜻입니다. 글 내용이 사실 초보자를 배려하지 않고 작성한 거라 좀 부족할 수 있으니, 인터넷 검색을 통해 다른 블로그도 찾아보시고 다시한번 잘 따라서 해보세요.