DSM 6.2에서 PHP 8 쓰기 – 도커로 워드프레스 PHP 8.3 전환

제 NAS는 DSM 6.2라서 패키지 센터로 설치할 수 있는 PHP가 7.4에서 멈춰 있습니다. 워드프레스는 아직 7.4를 지원하지만, PHP 8.1 이상이 필요한 플러그인이 늘고 있어서 도커 컨테이너로 PHP 8.3을 올렸습니다. 핵심은 DSM과 Web Station은 그대로 두고, nginx가 요청을 넘기는 곳 한 줄만 바꾸는 것입니다. 문제가 생기면 명령 하나로 7.4로 돌아갈 수 있습니다.

한눈에 보기

  • 문제: DSM 6.2 패키지 센터의 PHP는 7.4가 마지막 (PHP 7.4는 2022년 11월 보안 지원 종료)
  • 방법: wordpress:php8.3-apache 이미지에 NAS의 워드프레스 폴더와 MariaDB를 그대로 연결
  • 바꾸는 것: DSM nginx 설정의 proxy_pass 한 줄 (Web Station → 컨테이너)
  • 주의: Web Station이 nginx 설정을 다시 만들면 7.4로 돌아감 → 작업 스케줄러로 10분마다 다시 맞춤
  • 되돌리기: 명령 하나로 PHP 7.4 복귀, 사이트는 계속 열려 있음

PHP 8이 필요했던 이유

워드프레스 7.x의 최소 PHP 버전이 7.4입니다. 지금은 문제없지만, 다음에 최소 버전이 올라가면 블로그 업데이트 자체가 막힙니다. 실제로 사진을 크게 보여 주는 라이트박스 플러그인(Meow Lightbox)이 PHP 8.1 이상을 요구해서 설치가 안 됐습니다. 정품 시놀로지라면 DSM 7로 올리면 되지만, 제 NAS는 사정상 DSM 6.2에 머물러야 해서 도커로 우회했습니다.

구조: nginx가 보내는 곳만 바꾼다

DSM nginx가 도커 컨테이너(PHP 8.3)와 Web Station(PHP 7.4) 중 한 곳으로 요청을 보내는 구조도
평소에는 컨테이너로, 문제가 생기면 Web Station으로 보냅니다.
  • HTTPS와 인증서는 지금처럼 DSM nginx가 맡습니다.
  • 워드프레스 파일(/volume1/web/wordpress)과 데이터베이스(MariaDB 10)는 그대로 두고, 컨테이너가 같은 경로로 마운트해서 씁니다.
  • Web Station(PHP 7.4)은 지우지 않고 비상용으로 남겨 둡니다.

준비물

  • DSM 6.2 + 패키지 센터의 Docker 패키지
  • SSH 접속과 관리자(sudo) 권한
  • 지금 Web Station에서 돌고 있는 워드프레스
  • 바꾸기 전 백업: DB, wp-config.php, .htaccess, nginx 설정 파일

설정 파일

docker-compose.yml

이미지의 워드프레스 설치 과정은 건너뛰고(entrypoint 지정), NAS에 있는 워드프레스 폴더를 그대로 서비스합니다. 포트는 NAS 안에서만 열리도록 127.0.0.1에 묶었습니다.

services:
  web:
    image: wordpress:php8.3-apache
    container_name: lavient-php83
    restart: unless-stopped
    # 이미지의 워드프레스 복사·설치 단계는 건너뛰고 NAS의 파일을 그대로 서비스
    entrypoint: ["docker-php-entrypoint"]
    command: ["apache2-foreground"]
    # Web Station의 웹 사용자(http, 1023)로 실행 → 파일 소유자가 바뀌지 않음
    user: "1023:1023"
    environment:
      APACHE_RUN_DIR: /tmp/apache2/run
      APACHE_LOCK_DIR: /tmp/apache2/lock
      APACHE_PID_FILE: /tmp/apache2/apache2.pid
      TZ: Asia/Seoul
    ports:
      - "127.0.0.1:8083:8080"   # NAS 안에서만 접근
    volumes:
      - /volume1/web/wordpress:/volume1/web/wordpress   # 같은 경로로 마운트
      - /run/mysqld:/run/mysqld                         # MariaDB 10 소켓
      - ./php/zz-lavient.ini:/usr/local/etc/php/conf.d/zz-lavient.ini:ro
      - ./apache/ports.conf:/etc/apache2/ports.conf:ro
      - ./apache/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro
      - ./apache/remoteip.conf:/etc/apache2/conf-available/remoteip.conf:ro

워드프레스 폴더를 컨테이너 안에서도 NAS와 같은 경로로 마운트한 게 포인트입니다. 플러그인이 절대 경로를 저장해 둔 경우가 있어서, 경로가 달라지면 엉뚱한 곳에서 오류가 납니다. DB는 wp-config.php에 적힌 소켓 경로(localhost:/run/mysqld/mysqld10.sock)를 그대로 쓰도록 소켓 폴더를 연결했습니다.

Apache: 8080 포트와 가상 호스트

# ports.conf — root가 아니면 80 포트를 못 쓰므로 8080
Listen 8080

# 000-default.conf
<VirtualHost *:8080>
	ServerName lavient.life
	ServerAlias www.lavient.life
	DocumentRoot /volume1/web/wordpress
	<Directory /volume1/web/wordpress>
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>

방문자 IP와 HTTPS 인식 (remoteip.conf)

컨테이너 입장에서는 모든 요청이 NAS의 nginx에서 오기 때문에, 그대로 두면 방문자 IP가 전부 같게 보이고 워드프레스가 https 접속인 것도 모릅니다. Web Station이 쓰던 방식과 똑같이, nginx가 보내 주는 헤더를 도커 내부망에서 온 경우에만 믿도록 했습니다.

RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 172.16.0.0/12
SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on

PHP 설정 (zz-lavient.ini)

memory_limit = 512M
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 120
expose_php = Off
display_errors = Off
log_errors = On
date.timezone = Asia/Seoul

예전 Web Station 프로필은 오류를 화면에 보여 주는 설정과 디버거(xdebug)가 켜져 있었는데, 이번에 정리하면서 껐습니다.

nginx 한 줄 바꾸기

DSM이 만든 Web Station 가상 호스트 설정(/etc/nginx/app.d/server.webstation-vhost.conf)에서 lavient.life와 www로 가는 proxy_pass만 바꿉니다. 바꾼 뒤 설정 검사를 통과할 때만 nginx를 다시 읽고, 실패하면 원래대로 돌립니다.

# Web Station(PHP 7.4) → 컨테이너(PHP 8.3)
sed -i 's|proxy_pass  http://127.0.0.1:915;|proxy_pass  http://127.0.0.1:8083;|g' /etc/nginx/app.d/server.webstation-vhost.conf
nginx -t && nginx -s reload

저는 이 과정을 switch / rollback / status 같은 명령을 가진 셸 스크립트 하나로 묶었습니다. 전환 전에는 컨테이너가 로그인 페이지와 첫 화면에 정상 응답하는지 먼저 확인합니다.

막혔던 문제 3가지

1. 재부팅하면 다시 PHP 7.4로 돌아간다

Web Station은 재부팅, 설정 변경, 인증서 갱신 때 nginx 설정 파일을 새로 만듭니다. 그러면 바꿔 둔 한 줄이 원래대로 돌아가서 조용히 PHP 7.4로 서비스됩니다. 사이트는 계속 열려 있어서 알아채기도 어렵습니다.

그래서 DSM 작업 스케줄러에 root 권한으로 10분마다 도는 작업을 등록했습니다. 설정이 원래대로 돌아가 있으면 다시 컨테이너로 바꾸고, 반대로 컨테이너가 응답하지 않으면 PHP 7.4로 되돌립니다.

# 제어판 → 작업 스케줄러 → 생성 → 예약된 작업 → 사용자 정의 스크립트
# 사용자: root / 매일 00:00부터 10분마다, 마지막 23:50
/bin/sh /volume1/lavient-ops/php83/lavient-php83.sh ensure

2. 컨테이너가 root로 돌아 파일 소유자가 바뀌었다

처음에는 Apache 프로세스만 웹 사용자로 지정했는데, 컨테이너 자체는 root로 돌고 있었습니다. 사이트는 정상이었지만 그사이 플러그인 설치 등으로 생긴 파일 2,706개가 root 소유가 됐습니다. 컨테이너 전체를 user: "1023:1023"로 바꾸고, root가 아니면 80 포트를 못 쓰니 Apache를 8080에서 듣게 했습니다. 이미 root가 된 파일은 웹 사용자 소유로 되돌렸습니다.

3. WP-CLI는 여전히 PHP 7.4

터미널에서 쓰는 WP-CLI는 NAS의 PHP 7.4로 돕니다. 대부분 문제없지만, PHP 8 이상이 필요한 플러그인은 WP-CLI로 설치가 안 돼서 관리자 화면에서 설치해야 했습니다.

덤으로 하나 더: 워드프레스 메일(문의 알림 등)은 원래부터 NAS의 메일 설정이 비어 있어서 나가지 않고 있었습니다. PHP를 바꿔도 같으니, 필요하면 SMTP 플러그인을 따로 설정해야 합니다.

되돌리는 방법

Web Station과 PHP 7.4는 그대로 남아 있어서, 명령 하나로 nginx가 다시 Web Station을 보게 할 수 있습니다. 되돌린 상태는 다음에 직접 전환할 때까지 유지되도록, 10분 작업이 다시 바꾸지 않게 표시를 남겨 둡니다.

sudo sh /volume1/lavient-ops/php83/lavient-php83.sh rollback   # PHP 7.4로
sudo sh /volume1/lavient-ops/php83/lavient-php83.sh switch     # 다시 PHP 8.3으로
sudo sh /volume1/lavient-ops/php83/lavient-php83.sh update     # PHP 8.3 보안 업데이트 이미지 받기

설치부터 전환, 되돌리기, 10분 점검까지 묶은 스크립트와 설정 파일은 GitHub(dsm6-wordpress-homeserver)에 올려 두었습니다. 다른 NAS에서도 쓸 수 있게 도메인·경로·포트는 스크립트 맨 위 설정으로 뺐고, 공개판 스크립트 이름은 wp-php8.sh입니다. root 권한으로 도는 스크립트라 내용을 읽어 보고, 백업한 뒤에 쓰세요.

자주 묻는 질문

DSM 6.2에 PHP 8 패키지를 설치하는 방법은 없나요?

제 DSM 6.2 패키지 센터에서는 PHP 7.4가 마지막이었습니다. DSM 6을 유지해야 한다면 도커가 가장 현실적인 방법이고, 정품 시놀로지라면 DSM 7로 올리는 게 먼저입니다.

도커로 바꾸면 느려지지 않나요?

따로 성능 측정을 하진 않았지만, 바꾼 뒤에도 국내에서 첫 응답까지 0.3~0.5초로 전과 비슷했습니다. nginx와 컨테이너가 같은 NAS 안에서 통신해서 추가 지연은 거의 없습니다.

사이트 파일이나 DB를 옮겨야 하나요?

아니요. 같은 폴더와 같은 DB를 그대로 씁니다. 그래서 되돌리기도 nginx 한 줄로 끝납니다.

도커는 블로그 말고도 마인크래프트 서버처럼 NAS에서 다른 서비스를 돌릴 때도 유용했습니다. 전체 구성은 집 NAS 블로그 운영기, 보안 설정은 이 글에 정리했습니다.

최종 확인: 2026-10-25

lavient 아바타

글쓴이

lavient

소소한 일상과 관심 있는 분야를 기록하는 공간입니다. 직접 써 보고, 가 보고, 겪어 본 이야기를 솔직하게 남깁니다.

댓글 남기기