nginx fastcgi 캐시 테스트 글

수정 2026. 06. 07. 일 19:48

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


댓글