Table of Contents

LSCache + IP Board

In order for LSCache and IP Board to work together, IP Board needs to be modified to send out a ‘Cache-Control: Private’ response header to logged-in users. LSWS will take care of the rest.

Procedures

Here are the steps that will enable LSWS to work with IP Board:

Modify IP Board code

File admin/sources/classes/output/formats/html/htmlOutput.php needs to be modified to send out a ‘cache-control: private’ response header to logged-in users. Essentially, the response header is a flag that notifies LSWS what kind of cache to serve, which is the only information LSWS needs to know in order to work with IP Board.

Below changes are for IPB v3.1.4 as an example:

# diff -Naur a/htmlOutput.php b/htmlOutput.php
—-- a/htmlOutput.php    2011-03-16 15:39:09.000000000 -0400
+++ b/htmlOutput.php    2011-06-27 00:39:38.000000000 -0400
@@ -73,6 +73,17 @@
        public function printHeader()
        {
                //—————————————–
+               // Add "cache-control: private" header
+               //      for logged in users
+               // this is for LiteSpeed cache requirement
+               //—————————————–
+               if ( $this->memberData['member_id'] )
+               {
+                       header( "cache-control: private" );
+               }
+
+
+               //—————————————–
                // Start GZIP compression
         //—————————————–
       
@@ -1062,4 +1073,4 @@
 
                return $texts[ array_rand($texts) ];
        }
#

Note: To verify, check the response header when you log in. Server response header “Cache-Control: private” should be seen:

HTTP/1.1 200 OK
Content-Encoding: gzip
Vary: Accept-Encoding
Transfer-Encoding: chunked
Date: Wed, 20 Jul 2011 16:59:30 GMT
Server: LiteSpeed
Connection: close
...
Cache-Control: private  <==== this is the header
...

Set up Cache Policy

In LiteSpeed (v4.1.2 or later) Admin CP → Configuration → Server → Cache

Storage Path: /dev/shm/diskcache
Max Object Size: 1024000

Cache Policy
Enable Cache:    No
Cache Expire Time (seconds):    Not Set
Cache Request with Query String:    No
Cache Request with Cookie:    Yes
Cache Response with Cookie:    Yes
Ignore Request Cache-Control:    Yes
Ignore Response Cache-Control:    No
Enable Private Cache:    Yes
Private Cache Expire Time (seconds):    60

Do-Not-Cache URL(s):

/index.php?app=forums&module=post&section=post&do=edit_post
/index.php?app=forums&module=post&section=post&do=reply_post
/index.php?app=forums&module=moderate&section=moderate&do=postchoice

Note: Do-Not-Cache URL box holds all of the URL(s) that should NOT be cached.

Create Rewrite Rules for guest/public caching

Input the following rules into .htaccess in front of existing Rewrite rules.

RewriteEngine On
###########################################
# For LiteSpeed public cache (guest user)
###########################################
RewriteCond %{REQUEST_METHOD} ^HEAD|GET$
RewriteCond %{HTTP_COOKIE} !member_id= [OR]
RewriteCond %{HTTP_COOKIE} member_id=0
RewriteCond %{REQUEST_URI} !^/admin
RewriteCond %{REQUEST_URI} !(css|js|png|gif)$
RewriteRule .* - [E=Cache-Control:max-age=360]

Note:

  1. Above rules are for guest user (the cookie does not contain ‘member_id’ at all or contains ‘member_id=0’).
  2. Do NOT cache for admin user.
  3. Do NOT cache static objects.
  4. Cache for 6 minutes.
  5. For public cache, “X-LiteSpeed-Cache: hit” response header should be seen.
  6. For private cache, “X-LiteSpeed-Cache: private,hit” response header should be seen.

Create cronjob code to clean up stale cache

0 */2 * * * find /dev/shm/diskcache -type f -mmin 120 –delete

Add entries to /etc/rc.local

   echo "mkdir /dev/shm/diskcache && chmod nobody.lsadm" >> /etc/rc.local
   echo "/dev/shm/diskcache && chmod 770 /dev/shm/diskcache" >> /etc/rc.local
  

Note: this is to make sure cache directory gets created when server is booted up.