Blog >> Linux >> whitepapers.

워드프레스 캐시 및 업데이트 관리 150 150 phobe

워드프레스 캐시 및 업데이트 관리

워드프레스 사이트 건강 부분에서 양호 하다는 결과를 받지 못하는 항목에서
1. 백그라운드 업데이트가 예상대로 작동하지 않는다는 문제.
2. 캐시가 감지되지 않는다는 문제.
3. OP캐시 문제(‘오퍼코드 캐시’ 로 리포팅 하네요).

일단 백그라운드 업데이트 문제
이건 selinux 적용 문제로 사이트 전체가 http 방식으로 쓰기가 허용 되지 않기 때문. 물론 FTP를 열고 FTP 관련 컨택스트 를 적용한다면 문제가 해결 될 수도 있지만, FTP를 열어두지 않았음. 그래서 터미널에서 wp cli 를 이용하기로 함.
보안과 마이너 업데이트에는 메이저 업데이트를 쓰지 않기로 함. 메이저 업데이트는 –major 옵션을 추가함.

먼저 업데이트 쉘 스크립트 작성

~]# wp --version # 먼저 버전확인 후 wp-cli 유무 확인
WP-CLI 2.12.0

# 시스템 타이머를 이용한 워드프레스 업데이트 쉘스크립트 생성
# 로그는 내계정의 logs폴더에 저장 7일 이전의 로그는 삭제
~]# vi /usr/local/bin/update_wp_core.sh
#!/bin/bash

# 인자 확인
DOMAIN=$1
if [ -z "$DOMAIN" ]; then
    echo "도메인 이름이 필요합니다."
    exit 1
fi

# 로그 설정 (요청하신 하이픈 형식)
LOG_DIR="/home/phobe/logs"
DATE=$(date +%Y-%m-%d)
LOG_FILE="$LOG_DIR/wp-update_${DOMAIN}_${DATE}.log"

# 스크립트 내에서 로그를 직접 출력
exec >> "$LOG_FILE" 2>&1

echo "=== $(date) 보안/마이너 업데이트 시작: $DOMAIN ==="

# 업데이트 수행
/usr/local/bin/wp core update --path="/host/$DOMAIN/public_html" --force

if [ $? -eq 0 ]; then
    echo "Success: $DOMAIN"
else
    echo "Failed: $DOMAIN"
fi

echo "=== $(date) 업데이트 종료 ==="

# 로그 정리 (해당 도메인의 7일 지난 로그 삭제)
find "$LOG_DIR" -name "wp-update_${DOMAIN}_*.log" -type f -mtime +7 -delete

echo "로그 정리 완료 (7일 이상 경과된 파일 삭제)" >> $LOG_FILE

서비스 탬플릿 파일 및 타이머 탬플릿 파일 생성

~]# vi /etc/systemd/system/custom-update-wp-core\@.service
[Unit]
Description=Custom WordPress Core Update Service for %i
After=network.target

[Service]
Type=oneshot
User=phobe # 요 부분이 매우 중요. 호스트 디렉토리 소유자 일반 유저로 타이머 실행.
# root 소유 스크립트를 phobe가 실행(711 권한)
ExecStart=/usr/local/bin/update_wp_core.sh %i
# 스크립트 내부에서 로그를 처리하므로 여기는 비워두거나 간단히 지정
StandardOutput=null
StandardError=journal

[Install]
WantedBy=multi-user.target

########## 이상 서비스 파일 템플릿 ##########

~]# vi /etc/systemd/system/custom-update-wp-core\@.timer
[Unit]
Description=Weekly WordPress Update Timer for %i

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

########## 이상 타이머 파일 템플릿 ##########

그리고, 적용을 위한 데몬 리로드

~]# systemctl daemon-reload

그리고 가상 호스트 사이트가 추가 될 때마다, 호스트를 위한 서비스 활성화 심볼릭 링크를 생성스케줄 확인

~]# systemctl enable --now custom-update-wp-core@[호스트명].timer
Created symlink '/etc/systemd/system/timers.target.wants/custom-update-wp-core@[호스트명].timer'  '/etc/systemd/system/custom-update-wp-core@.timer'.

# 그리고 워드프레스 업데이트를 위한 스케줄 확인
~]# systemctl list-timers --all | grep custom-update-wp-core
Sun 2026-06-14 03:00:00 KST   2 days -                                      - custom-update-wp-core@gldigital.co.kr.timer custom-update-wp-core@gldigital.co.kr.service
Sun 2026-06-14 03:00:00 KST   2 days -                                      - custom-update-wp-core@yjco.kr.timer         custom-update-wp-core@yjco.kr.service

# 업데이트 스크립트 실행이 2일 남음. 오늘이 11일 목요일 - 타이머에 일요일 3시에 하라고 했으니, "Sun 2026-06-14 03:00:00 KST" 에 한다고 함.

워드프레스 메이저 업데이트는 3~4개월 마다 있다고 하니 wp-cli 를 직접 실행. 디비 및 플러그인 호환성 고려해서 수동으로 실행 시키는 것으로 결정.

# --major 옵션을 추가
~]$ wp core update --major --path="/host/[가상호스트 디렉토리]/public_html" --force

캐시가 감지 되지 않는다는 문제는 플러그인을 통해 해결하는 것이 일반적 하지만, 플러그인이 맘에 들지 않음.
직접 Redis (고성능 인 메모리 데이터 저장소) 를 활용하기로 함. 레디스에 대한 자료는 구글링 하면 됨. 설치해서 서버에 활성화가 되었다면, wp-config.php 에 라인 추가. 그리고 wp-content 디렉토리 루트에 object-cache.php 파일 추가.

// redis 캐시 작동 추가
define('WP_CACHE', true);
define('WP_USE_REDIS', true); //  이걸 먼저 정의
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', '***********'); // 필요  비밀번호 입력
define('WP_REDIS_DATABASE', 0); // 명시적으로 지정
define('WP_REDIS_PREFIX', 'gld_'); // 캐시  prefix - 사이트마다 별도로 지정
define('WP_REDIS_MAXTTL', 3600); // 캐시 TTL (초)
define('WP_REDIS_DISABLED', false); // Redis 캐시를 임시로 끄고 싶을  true
define('WP_REDIS_GRACEFUL', true);  // Redis 연결 실패  사이트가 죽지 않고 fallback 하도록
define('WP_REDIS_SELECTIVE_FLUSH', true); // prefix가 붙은 키만 flush 하도록 제한

public_html]$ vi wp-content/object-cache.php
<?php

defined( 'ABSPATH' ) || exit;

if ( defined( 'WP_REDIS_DISABLED' ) && WP_REDIS_DISABLED ) {
    return;
}
..... 중략 .....
class WP_Object_Cache {
    private $redis;
    private $connected = false;
    private $fail_gracefully = true;
    private $ignored_groups = []; // 👈 Deprecated 경고 해결: PHP 8.2+에서 동적 속성 생성을 방지합니다.
..... 중략 .....
        $groups = is_array( $groups ) ? $groups : [ $groups ];
        foreach ( $groups as $group ) {
            $this->ignored_groups[] = $group;
        }
    }
}

마지막으로 OPCache 관련 이슈는 무시. – 사이트의 규모에 따라 php-fpm 설정에서 선택적으로 활용 하기로 함.

# opcache 디렉토리 위치 확인
~]# vi /etc/php.d/10-opcache.ini
..... 중략 .....
; 2차 캐시 디렉토리를 활성화하고 설정합니다.
; SHM 메모리가 가득 찼을 때, 서버를 다시 시작하거나
; SHM을 재설정할  성능이 향상되어야 합니다.
; 기본값 "" 파일 기반 캐싱을 비활성화합니다.
; RPM 참고: 파일 캐시 디렉토리는 프로세스 소유자가 소유해야 합니다.
; mod_php  경우 /etc/httpd/conf.d/php.conf  참조
; php-fpm  경우 /etc/php-fpm.d/*conf  참조
; 전역 전용 기본값 ""
opcache.file_cache=/var/lib/php/opcache
..... 중략 .....

~]# vi /etc/php-fpm.d/enabled/gldigital.co.kr.conf
..... 중략 .....
; opcache 사용여부 on/off
php_admin_flag[opcache.enable] = off
; 개발 코드 수정시 0 - 바로 확인
;php_admin_value[opcache.revalidate_freq] = 0
..... 중략 .....
  • 백업 스크립트 – systemd 타이머 등록 150 150 phobe 백업 스크립트 – systemd 타이머 등록