그누보드에 nginx fastcgi_cache 적용하기 완성 정보
그누보드에 nginx fastcgi_cache 적용하기 완성
관련링크
본문
위 링크에 최종 정리본 올려뒀습니다.
-----------------------------------------------------------
캐시서버는 보통 varnish, redis, memcached 등등이 쓰이는데...
저는 memcached만 세션 핸들러로 사용 중입니다.
nginx 자체 기능 중에 fastcgi_cache라는게 있어 테스트하면서 쓰고 있는데
F5 연타라든지... 기타 속도 향상에 도움이 될 것 같아 글을 써봅니다.
저는 서버 쪽은 완전 초보라 틀린 내용이 많고, 구글링으로 얻은 정보라 불명확한 정보가 많습니다.
서버관리자 모임 여러분께 양해를 구합니다. 그리고 조언도 구합니다.
그누보드를 쓰면서 nginx를 쓰는 분도 많이 계실테니 한번 정립이 되면 쉽게 사용할 수 있지 않을까 싶습니다.
전 2개의 글을 기본으로 적용해봤습니다.
https://thelastcicada.com/2014/microcaching-with-nginx-for-wordpress/
http://blog.naver.com/malloc813/220601538952
첫번째 글은 워드프레스 전용으로 적은 글이고, 두번째 글은 보편적인??? 그런 글입니다.
짜깁기를 해봤는데 어느정도 작동은 하는 것 같습니다.
https://deliciousbrains.com/page-caching-varnish-vs-nginx-fastcgi-cache/
일단 위 글에 있는 캐시파일이 저장될 곳을 memory로 지정해줬습니다.
tmpfs /usr/local/nginx/cache/sites tmpfs defaults,size=100M 0 0
대략 위와 같은 형식으로 넣어줬습니다.
이제 nginx 설정부분입니다.
우선 http { 블록에서
#fastcgi_cache setting
fastcgi_cache_path /usr/local/nginx/cache/sites levels=1:2 keys_zone=cachename:30m inactive=30m max_size=99m;
위와 같이 설정했습니다. 캐시 파일이 들어갈 위치(메모리) 및 용량을 설정하는 곳입니다.
map $request_method $cache_off
{
default 0;
POST 1;
}
map $request_uri $cache_off
{
/bbs/logout.php 1;
/bbs/login.php 1;
/adm 1;
}
map은 nginx에서 if문을 쓰지 말라고 해서... 간단하게 넣어봤는데
일단 글을 적거나 댓글 다는 것은 정상적으로 작동합니다.
하지만 밑에 부분에 있는 로그인, 로그아웃은 아직 어떻게 접근해야될지 모르겠습니다.
저렇게 넣어봤는데 여전히 로그인 로그아웃은 나중에 나오는 fastcgi_cache_valid any 15s; 같은 시간 안에서는 고정이 되더군요...
실제 로그아웃이 되었는데 15초가 지나지 않아 여전히 로그인 되어 있는 것처럼 보이는...
첫번째 글에서 워드프레스는 if 문을 써서
#Cache everything by default
set $no_cache 0;
#Don't cache logged in users or commenters
if ( $http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $no_cache 1;
}
#Don't cache the following URLs
if ($request_uri ~* "/(wp-admin/|wp-login.php)")
{
set $no_cache 1;
}
위와 같이 로그인한 유저나 댓글을 다는 유저, 그리고 관리자모드, 로그인 부분에는 캐시적용을 하지 않는다는 것을 볼 수 있습니다.
if문이거나 map이거나 어쨌든 로그인한 유저는 캐시 해제 및 로그인로그아웃 부분은 캐시 해제가 되면 면 좋겠네요. 이 부분이 제일 문제인데 도와주세요!!!
그리고 server { 블록 안에
#fastcgi_cache setting
fastcgi_cache_key "$scheme$request_method$host$request_uri$cookie_['PHPSESSID']";
fastcgi_cache_valid 30m; #200, 301,302 응답 30분 동안 캐시유지
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
add_header X-Cache $upstream_cache_status;
위와 같이 넣어줬습니다.
fastcgi_cache_key 부분은 아무래도 PHPSESSID를 포함해서 생성하는게 맞는데 저렇게 하는게 맞는지 모르겠네요 -_-;;; 일단 키는 생성이 되는데...
나머지는 무난한 것 같구요. X-Cache 부분은 실제 F12를 눌러 캐시가 HIT인지 EXPIRED인지 구분하는 인자로 쓰입니다.
그리고 location ~ [^/]\.php(/|$) { php 핸들러 블록 안에
fastcgi_cache cachename;
fastcgi_cache_valid any 15s;
fastcgi_cache_use_stale updating error timeout invalid_header http_500;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 10s;
위와 같이 설정해줬습니다. 대략 15초간 캐시를 유지한다는 것만 알고 나머지는 사실 무슨 말인지 모르겠네요. ㅠㅠ
그리고 server 블록 제일 밑에 fastcgi_no_cache $cache_off; 를 추가해줬습니다.
1. 되는 것
1) 로그인 및 로그아웃 - 다만 fastcgi_cache_valid any 15s; 이렇게 설정시 15초 간은 로그인 및 로그아웃이 안되는 것처럼 보임 -> 해결 요망
2) 글을 쓰거나 댓글 쓰는 것은 정상적으로 됩니다.
3) 실제로 캐시가 되어 x-cache HIT이 뜨면 상당히 빠르고 FFTB가 매우 빨라집니다. 대략 노캐시보다 절반 이내로...
2. 안되는 것
1) 위에 적었듯이 로그인 로그아웃 유지되는 것처럼 보임
2) 실제 로그인한 유저 및 댓글 다는 유저는 캐시 해제
3. 장점
x-cache에 hit 뜨면 FFTB가 일반서버의 절반 이내로 매우 빠른 반응 속도, 서버 부하 줄어듬, F5 연타에 의한 서버 부하 방지 (DDOS 방어에 약간 도움될 듯)
로그아웃 유저가 많을 경우 fastcgi_cache_valid 를 늘려 모든 페이지를 캐시된 페이지로 보여줄 수 있음
4. 남은 점
위에 문제들만 해결되면 충분히 범용으로 쓸만할 것 같습니다.
5. 테스트 사이트
임시로 테스트 해볼 수 있는 사이트 만들어봤습니다.
계정 test01 / test01 입니다.
fastcgi_cache_valid any 는 10s로 잡아놔서 10초 동안은 캐시가 고정될겁니다. (로그인 로그아웃 유지되는 것처럼 보임)
그리고 10초 동안은 x-cache hit이 뜨면서 매우 빠름... F5로 인한 서버 부하가 방어 됩니다. ㅎㅎ
궁금하시면 테스트 해보시면 될 듯합니다.
-------------------------------------------------------------------
최종본 올려봅니다.
위 내용은 그냥 맛보기로 보시고요. 핵심만 올려드리겠습니다.
1. 그누보드 로그인시 쿠키 탑재, 로그아웃시 쿠키 해제 - 요건 그누보드 업데이트 할 때마 수정해줘야 합니다.
/bbs/login_check.php안에
// 일반로그인 쿠키 설정 시작------------------
// 쿠키 30일간 저장
set_cookie("login_check", "login", 86400 * 30);
// 일반로그인 쿠키 설정 end ------------------
/bbs/logout.php에
// 일반로그인 쿠키 해제 시작 ----------------------
set_cookie("login_check", '', 0);
// 일반로그인 쿠키 해제 end ----------------------
2. nginx.conf http { 안에 설정 추가
# FastCGI cache settings
fastcgi_cache_path /your/cache/folder levels=1:2 keys_zone=fastcgicache:30m inactive=30m max_size=100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri$mobile_request";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_valid 200 301 302 30m;
fastcgi_cache_valid 404 1m;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
#fastcgi_param SERVER_NAME $http_host;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_keep_conn on;
map $http_user_agent $mobile_request
{
default fullversion;
"~*phone" mobileversion;
"~*samsung" mobileversion;
"~*lgtel" mobileversion;
"~*mobile" mobileversion;
"~*[^A]skt" mobileversion;
"~*nokia" mobileversion;
"~*blackberry" mobileversion;
"~*android" mobileversion;
"~*sony" mobileversion;
"~*iphone" mobileversion;
}
map $request_method $cache_off {
default 0;
POST 1;
}
map $request_uri $cache_off {
default 0;
/bbs/login.php 1;
/bbs/logout.php 1;
/bbs/login_check.php 1;
/bbs/register.php 1;
/bbs/password_lost.php 1;
}
map $http_cookie $cache_off {
default 0;
~bG9naW4%3D 1; # gnuboard custom cookie
}
여기에 핵심이 다 있습니다.
제일 첫줄에 있는 fastcgi_cache_path /your/cache/folder levels=1:2 keys_zone=fastcgicache:30m inactive=30m max_size=100m;
요기는 꼭 수정해줘야 합니다.
nginx 안에 cache 폴더를 넣을지.. 아니면 /var/run에 넣을지.. 램에 넣을지.. 이건 원하시는대로..
그리고
fastcgi_cache_valid 200 301 302 30m;
여기도 꼭 수정해야 합니다.
30m은 30분동안 200 301 302로 오는 것을 캐싱한다는 말인데요.
로그아웃시에 봤을 때 글을 써도 30분 동안 최신글에 안뜰 수 있습니다.
이건 사이트마다 다르니 체크해주세요.
3. 각 서버 설정에 들어가서
server { 안에
# Add PHP handler
location ~ [^/]\.php(/|$) {
위와 같은 php location 안에
fastcgi_cache fastcgicache;
add_header X-Cache $upstream_cache_status;
fastcgi_cache_bypass $cache_off;
fastcgi_no_cache $cache_off;
위 내용 추가하면 끝입니다.
service nginx reload
위 명령어로 리로드 하면 끝!!! 완전 쉽죠?
!-->!-->!-->!-->5
댓글 7개




1. 관리자가 아닌 사람이 로그인하여 댓글을 쓰면 관리자가 댓글 쓴 것처럼 나옴... (IP 빼고 동일... )
이건 캐싱키 문제인 것 같은데.. 웃긴건 제가 다른 계정으로 동시에 로그인해서 댓글달면 문제없이 잘 나옵니다.
하지만 최근에 2명이 댓글 달았는데 2명 전부 관리자인 제가 댓글을 단 것처럼 나오네요 -_-;;;;;;
2. 아미나 위젯 설정값 랜덤 초기화
이건 진짜 특이케이스이긴 한데요... 메인에 최신글 설정해놓았는데.. 심심할 때마다 초기화가 됩니다...;;;
관리자 게시판이 따로 있어서 해당 게시판은 예외로 처리해뒀는데... 설정이 초기화되면서 글이 출력이 됩니다 ;;;;
이건 해결 못해서 포기...
3. 방문자수 급격한 하락... 최근 방문자수 추이를 보니 예전보다 10~20% 하락했더군요 ;;;
캐싱 적용해서 해당 페이지 들어온 사람은 통계처리가 안된 것 같기도 하고...
보이지 않는 에러로 접속 못하는 사람도 어느정도 있는 것 같더군요 ㅠㅠ
아무튼 이런저런 치명적인 문제로 결국 원상복구했습니다. ㅎㅎ