nginx의 fastcgi 캐시가 끝없는 미로, 무한 루프에 빠지게 한다. 홈페이지 캐시가 삭제가 되면 단일 글 캐시가 삭제가 안되고, 단일 글 삭제가 되면 홈페이지 캐시 삭제가 되지 않는 등 케바케였다.
Nginx Helper 플러그인이 Helper가 아닌 disrupter으로 작동하고 있다. 아래는 PURGE CACHE 관련 설정 파일이다.
# PURGE CACHE
location ~ /purge(/.*) {
allow 127.0.0.1;
allow ::1;
deny all;
set $purge_method "GET";
fastcgi_cache_purge WORDPRESS "$scheme$purge_method$host$1";
#fastcgi_cache_purge WORDPRESS "httpsGETnewbinsight.com$1$is_args$args"; -로 대체해도 결과 같음.
add_header X-Cache-Purge "Purged";
return 200 "Cache Purged: $scheme$purge_method$host$1";
}
location / { try_files $uri $uri/ /index.php?$args; }
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|webp|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?\.xml") { set $skip_cache 1; }
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") { set $skip_cache 1; }
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 3d;
fastcgi_cache_use_stale updating error timeout invalid_header http_500;
fastcgi_cache_background_update on;
fastcgi_cache_lock on;
add_header X-FastCGI-Cache $upstream_cache_status;
}
Redis Object Cache도 비활성화했다.
개발자도구에서 /wp-json/wp/v2/posts 요청사항 확인도 하고 뻘 짓을 하고 있다.
드디어 단서를 하나 발견했다. 영어 슬러그는 즉시 반영 되고 한글 슬러그는 안 된다는 것이다.
Helper 플러그인이 한글 슬러그도 인식하기 위해서 아래와 같이 수정하고,
현재:
fastcgi_cache_key "$scheme$request_method$host$request_uri";
↓
fastcgi_cache_key "$scheme$request_method$host$uri";
브라우저를 열어 보면 보여야 할 글은 안 보이고 아래와 같은 엉뚱한 걸 뱉어내서 식겁했다.
User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php Sitemap: https://newbinsight.com/wp-sitemap.xml
그래서 다시 원복했다.
그래도 nginx purge 기능 자체는 정상이라는 것과 “한글 permalink → URL encoding mismatch” 요 문제만 해결하면 된다는 것이다.
그러니까 저장된 key = URL encoded이고 purge 요청 key = raw UTF-8의 불일치 문제를 해결해야 한다.
Helper 플러그인이 /purge/한글슬러그/ 이 형식의 요청을 “/purge/%ED%95%9C%EA%B8%80%EC%8A%AC%EB%9F%AC%EA%B7%B8/” 이런 식으로 바꾸게 하면 된다.
이제 purge URL 생성 시 rawurlencode 적용하면 끝나는 것일까?
Helper 플러그인의 apply_filters( ‘rt_nginx_helper_remote_purge_url’, $url );를 이용하면 purge URL만 안전하게 encode 가능해 진다.
그걸 위해 Twenty Twenty-Five 테마의 functions.php 파일에 아래 내용을 붙여 넣었다.
/* ===== 13. purge URL 중 "한글이 포함된 segment만" encoding===== */
add_filter( 'rt_nginx_helper_remote_purge_url', function( $url ) {
$parts = wp_parse_url( $url );
if ( empty( $parts['path'] ) ) {
return $url;
}
$segments = explode( '/', $parts['path'] );
foreach ( $segments as &$segment ) {
if ( preg_match( '/[^\x20-\x7f]/', $segment ) ) {
$segment = rawurlencode( $segment );
}
}
$path = implode( '/', $segments );
$new_url = $parts['scheme'] . '://' . $parts['host'];
if ( ! empty( $parts['port'] ) ) {
$new_url .= ':' . $parts['port'];
}
$new_url .= $path;
if ( ! empty( $parts['query'] ) ) {
$new_url .= '?' . $parts['query'];
}
return $new_url;
}, 10, 1 );
그리고 짜잔! 드디어 디버깅에 성공했다. nginx purge를 해결하기 위해 2박 3일을 초집중 상태로 보냈다.
이로써 오라클 서버에 안착을 한 느낌이다. 2026년 5월 7일 오라클 계정을 만들고 always-free 인스턴스를 생성해서 서버 이전을 마치고 마침내 캐시 문제도 해결했다.
그런데 또 아니었다. ㅠ 일단 영문 슬러그는 해결 됐으니 장기 과제로 넘기는 수밖에 없겠다.
오늘(2026. 5. 22) 새 글을 하나 발행하고 혹시나 다시 테스트 해봤더니 영문과 한글 슬러그 모두 수정 사항이 잘 반영되었다.
근데, 사이트 건강 화면에서 “사이트는 198.143.164.251의 WordPress.org에 연결할 수 없고, 오류를 반환합니다: cURL error 28: Connection timed out after 10001 milliseconds”와 “워드프레스 7.0에 대한 체크섬의 목록을 가져올 수 없습니다. WordPress.org에 연결에 실패했다는 것을 의미할 수 있습니다.” 라는 경고 메시지가 떴다.
이게 뭔 조화냐? 오늘 워드프레스 7.0 업데이트가 있었는데 그것 때문인가. 업데이트 따라 내 커스텀 “functions.php”과 “nginx default”도 다 업데이트 했는데도 사라지지 않았다. 업데이트가 나오자마자 하는 것이 아니었나?
챗GPT와 제미나이도 엉뚱한 솔루션만 내 놓았다.
이 글은 디버깅을 위해 글을 수정했을 때 캐시가 삭제되는 지 확인하기 위해서 한 줄부터 시작한 글이 여기까지 왔다.
정제되지도 않고 맥락이 얽힌 글이지만, SEO에 부정적인 영향을 주지 않기 위해 글을 삭제하지 않고 그대로 두니 양해 바란다.
드디어 해결했다. 이게 몇 번째인가. 화이트스크린도 몇 번 일어나고.. MAP 추가, 그리고 에러 로그 파일 확인. . 한글 슬러그 퍼지를 소문자를 대문자로 보내고 있었던 것이 불일치의 원인이었다. 2026. 6. 7. 19:48
댓글