San1ty Posted November 28, 2011 Posted November 28, 2011 Hey IPS, This isn't a big seller as a feature, but a great addition nonetheless. Varnish is a good way to speed up any website and the caching of static content helps a lot. What would make IP.Board scale like hell is if Varnish could cache php pages for guests. IP.Board sets cookies for guests for multiple reasons, but maybe there is another way to identify users without the need for cookies. I know you can strip cookies with varnish, but an option in the ACP titled "Varnish compatibility mode" would be great. Any feedback regarding my suggestion would be great!
.Nuno. Posted November 28, 2011 Posted November 28, 2011 I'm with you ... IPB should have integrates suppor to varnish cache. I use it and just need to add some bit's to purge content when someone post a new topic or a reply (except fast reply :( ) This should be set has an option :)
bfarber Posted November 29, 2011 Posted November 29, 2011 I know of companies using Varnish with IPB already. What is it that you would like to see IPB do exactly with a "Varnish compatibility mode" setting? I'm not sure what you are wanting the software itself to do, since Varnish works at the server level regardless of the software in use.
San1ty Posted November 29, 2011 Author Posted November 29, 2011 Hi Bfarber, Thanks for your reply. Well varnish doesn't cache any page that set's a cookie. So right now, if I do a clean install of Varnish it will cache my avatars and skin js/css/images directly. But varnish also has the ability to cache pages that don't set cookies. This could be very interesting if your site get's a sudden spike of guests, it could serve a cached topic view for example without your webserver even having to execute anything. The problem I have right now as that even for guests IP.Board sets cookies, so none of your pages get cached without doing some stripping of the cookies in your varnish config. It would be much easier if IP.Board could have a varnish compatibility option that would just disable cookies for guests so they all can see the same cached page.
blair Posted November 29, 2011 Posted November 29, 2011 Adding a response header would help with Varnish, and other caches like Litespeed, (i.e. 'cache-control: private') once user login which serves as flag for cache serving.
San1ty Posted November 30, 2011 Author Posted November 30, 2011 I think you would still need to have no cookies at all for guests then you can see if a cookie is set and pass the request to the backend server. You can see how big of a performance gain varnish can be. A quick example: If you have a traffic spike on your site and you get 10000 requests per second. If you could just store a cached version that expires 10 seconds later, that would reduce the load on the backed to 1 request per 10 seconds. With varnish you have the possibility to just remove the set cookies and cache a page but to me that seems a very brute way to cache a page.
San1ty Posted December 1, 2011 Author Posted December 1, 2011 Just want to make sure someone at IPS reads my update. Just don't want it to fall on deaf ears.
.Nuno. Posted December 2, 2011 Posted December 2, 2011 I think there are two things that can be done .... 1. Send and header to purge content (this is a must) I've done this in admin/applications/forums/modules_public/post/post.php adding an header like "X-Purge: /topic/123-name-it/" or "X-Purge: /forum/456-name-it/". This way I can setup long ttl's knowing that I can purge the topic or forum when someone posts a new topic/message. I couldn't make this work with fast reply because I don't know where to make changes. 2. For simplicity, IPB (and other apps) could sent an header "X-Cache: nocache" to simply tell us what we should or not cache. I think this is not easy to implement and we can do the same by using the member_id, language and skin cookies.
mat206 Posted December 2, 2011 Posted December 2, 2011 Here's what you guys can do to make this easy for 3.3 - open up the API somewhere so that custom mods can add additional headers in the http response. Then someone can write a Varnish mod with more precise cache control.
bfarber Posted December 2, 2011 Posted December 2, 2011 Custom mods already can add additional headers to the output.@header( "Custom-Header: value" ); ;) We don't output until the end of script execution, so you can call header anywhere throughout your custom code. No special API needed.
.Nuno. Posted December 2, 2011 Posted December 2, 2011 Custom mods already can add additional headers to the output.@header( "Custom-Header: value" ); :wink: We don't output until the end of script execution, so you can call header anywhere throughout your custom code. No special API needed. Ok .. so how difficult is to make a mod to sent an header with the topic or the forum that has new content so we can purge? :D I'm not a programmer, so I just edited the file above to add the header ...
mat206 Posted December 2, 2011 Posted December 2, 2011 Well okay then.. then no changes are necessary for Varnish. The only thing you'd need is a mod developer with some ambition.. I found that 99% of my needs though were met with just a plain old Varnish config with no changes to IPB whatsoever. The mod way would require purging urls from the varnish server and putting a some type of TTL in the header that can be read by the Varnish cache. The mod would have to guess at how long to make the TTL for each page (or allow it to be customized for some pages).http://blog.feryn.eu...-cache-purging/ One of the cooler things Varnish can do though is called ESI, which would allow varnish to cache most of the static parts of the page. It's kind of how IP.Content caches blocks, but this doesn't require any of the overhead of PHP running if you are serving out cached content. An example of this in use might be if you know that most of your frontpage will contain static content.. but only the small login box will be custom for each other, you would have to create some type of custom php script that would provide the output for the login box. e.g.http://en.wikipedia....e_Side_Includes My site only has a few million page views per month, so we're not anywhere near what is needed to warrant all this kind of extra development work though. - Michael
.Nuno. Posted December 10, 2011 Posted December 10, 2011 This is how I purge content: admin/applications/forums/modules_public/post/post.php (search varnish): /** * Save the form * * @param string Type of form to show * @return @e void */ public function saveForm( $type ) { switch( $type ) { case 'reply': try { if ( $this->_postClass->addReply() === FALSE ) { $this->lang->loadLanguageFile( array('public_error'), 'core' ); $this->showForm( $type ); } $topic = $this->_postClass->getTopicData(); $post = $this->_postClass->getPostData(); // varnish purge $purgeurl = "/topic/" .$topic['tid'] ."-" .$topic['title_seo']. "/"; header('X-Purge: ' .$purgeurl); // end varnish purge # Redirect if( $topic['_returnToMove'] ) { ipsRegistry::getClass('output')->silentRedirect( "{$this->settings['base_url']}t={$topic['tid']}&f={$topic['forum_id']}&auth_key={$this->memberData['form_hash']}&app=forums&module=moderate&section=moderate&do=02" ); } else if ( $this->settings['post_order_sort'] == 'desc' ) { ipsRegistry::getClass('output')->silentRedirect( $this->settings['base_url']."showtopic=" . $this->_postClass->getTopicID() . "&#entry" . $this->_postClass->getPostID(), $topic['title_seo'] ); } else { $permissions['softDelete'] = $this->registry->getClass('class_forums')->canSoftDeletePosts( $topic['forum_id'], $topic ); $permissions['softDeleteSee'] = $this->registry->getClass('class_forums')->canSeeSoftDeletedPosts( $topic['forum_id'] ); $posts = $topic['posts'] + 1; if( $this->moderator['post_q'] OR $this->memberData['g_is_supmod'] ) { $posts += $topic['topic_queuedposts']; } if ( $permissions['softDelete'] AND $permissions['softDeleteSee'] ) { $posts += $topic['topic_deleted_posts']; } if( ( $posts % $this->settings['display_max_posts'] ) == 0 ) { $page = ( ($posts) / $this->settings['display_max_posts'] ); } else { $page = ( ($posts) / $this->settings['display_max_posts'] ); $page = ceil($page) - 1; } $page = $page * $this->settings['display_max_posts']; ipsRegistry::getClass('output')->silentRedirect( $this->settings['base_url']."showtopic={$topic['tid']}&st=$page&gopid={$post['pid']}&#entry{$post['pid']}", $topic['title_seo'] ); } } catch( Exception $error ) { if( $this->_postClass->getIsPreview() ) { $this->showForm( $type ); } $this->registry->getClass('output')->showError( $error->getMessage(), 103130, null, null, 403 ); } break; case 'new': try { if ( $this->_postClass->addTopic() === FALSE ) { $this->lang->loadLanguageFile( array('public_error'), 'core' ); $this->showForm( $type ); } $topic = $this->_postClass->getTopicData(); $post = $this->_postClass->getPostData(); // varnish purge $forum = $this->_postClass->getForumData(); $purgeurl = "/forum/" .$forum['id'] ."-" .$forum['name_seo']. "/"; header('X-Purge: ' .$purgeurl); // end varnish # Redirect $this->registry->getClass('output')->silentRedirect( $this->settings['base_url']."showtopic={$topic['tid']}", $topic['title_seo'] ); } catch( Exception $error ) { $language = $this->lang->words[ $error->getMessage() ] ? $this->lang->words[ $error->getMessage() ] : $error->getMessage(); $this->registry->getClass('output')->showError( $language, 103131, null, null, 403 ); } break; case 'edit': try { if ( $this->_postClass->editPost() === FALSE ) { $this->lang->loadLanguageFile( array('public_error'), 'core' ); $this->showForm( $type ); } $topic = $this->_postClass->getTopicData(); $post = $this->_postClass->getPostData(); // varnish purge $purgeurl = "/topic/" .$topic['tid'] ."-" .$topic['title_seo']. "/"; header('X-Purge: ' .$purgeurl); // end varnish purge if( $this->request['return'] ) { $_bits = explode( ':', $this->request['return'] ); if( count($_bits) AND $_bits[0] == 'modcp' ) { $this->registry->output->redirectScreen( $this->lang->words['post_edited'], $this->settings['base_url'] . "app=core&module=modcp&fromapp=forums&tab=" . $_bits[1] . 'posts' ); } } # Redirect ipsRegistry::getClass('output')->redirectScreen( $this->lang->words['post_edited'], $this->settings['base_url'] . "showtopic={$topic['tid']}&st=" . $this->request['st'] . "#entry{$post['pid']}", $topic['title_seo'] ); } catch( Exception $error ) { $this->registry->getClass('output')->showError( $error->getMessage(), 103132, null, null, 403 ); } break; } } Now, in the vcl file I have: sub vcl_fetch { ## == Purge == if (beresp.http.X-Purge) { purge("req.url ~ " beresp.http.X-Purge); purge("req.url ~ /index.php"); purge("req.url ~ /"); } ... The only thing I would like to know is how can I purge content when the user uses the fast reply .... any ideas? Is this a good way to do this? I too use esi to count post and image views.
San1ty Posted January 16, 2012 Author Posted January 16, 2012 Might be interesting if all this ESI work ETC was done as an option in the ACP. Either that or someone would make a varnish compatibility hook.
Elly Posted June 2, 2012 Posted June 2, 2012 Just a bump to this. While IPB works fine with varnish already, it would be great to have some sort of inbuilt purge compatibility and counting guests with ESI(?). Something like the sphinx search options in ACP where vcl settings are generated and an article in the KB.
maddog107_merged Posted June 2, 2012 Posted June 2, 2012 Just a bump to this. While IPB works fine with varnish already, it would be great to have some sort of inbuilt purge compatibility and counting guests with ESI(?). Something like the sphinx search options in ACP where vcl settings are generated and an article in the KB. Were you able to get it running on 3.3.x? I tried setting it up but kept on getting "Miss" on the index as a guest. I would love to see your config for varnish. Thanks
sobrenome Posted August 11, 2012 Posted August 11, 2012 Is there any tutorial to set varnish for ipb?
inkognito23 Posted December 29, 2012 Posted December 29, 2012 as a bigboard admin i recommed any forum software dev company to take care of webpage speed boosting mechanism... - ability to add a cdn network (outsourced or local virtual) for all type of static content in the admincp options. its important to serve static files from cookie-less domains. - ability to cache as most as possibile data (template caches,datastore,etc.) in memcache - nginx rewrite rules (for me and for the most of bigboard admins the best webserver.) in combination with fastcgi + php-fpm ... - option to let serve shared media / attachements from a different server, i dont need disk i/o on my webserver, for that, i would like to use a fileserver, which is optimized for serving files. (hw raid5 + ssd for hotfiles) VARNISH: - set cookie for logged in user like: imloggedin=yes .... delete this cookie, when user logs out. so we can enable easily fullpage caching for non logged users in varnish - varnish esi support -> configuration in IPboard admincp. With that, we will able to cache any dynamic non personilzed content, even for loggedin users - add a new cronjob, which will starts every n minute, for sending purge command to varnish with all new/updated content urls within n minutes. - dont forget to use grace ;) - varnish can even hold files which are requested more often, longer in cache (dynamic TTL) ;) For really BigBoards i prefere setup like this: domain.com 1. Layer: Loadbalancer (only if really needed) 2. Layer: Varnish Cache - cache static content for all users (vcdn.domain.net) <- .net to use a cookie-less domain - cache fullpage for non logged in visitors (delete cookie from object) - cache esi blocks for logged in visitors - use grace for every cached object - use purge or at least a grace hack to set TTL dynamical for refreshed content from backend 3. Layer: nginx + fastcgi + php-fpm + xcache + memcached - if needed, u can set fastcgi on a seperate server, to handle php process - php cache-> i have best experience with xcache - memcache for datastore and other cachable objects 4. Layer: mysql At least,read the docs to tune everything to ur traffic needs.
sobrenome Posted November 26, 2019 Posted November 26, 2019 On 12/2/2011 at 3:14 PM, bfarber said: @header( "Custom-Header: value" ); Can I use this code on Theme Template?
Rhett Posted November 26, 2019 Posted November 26, 2019 This topic was from 2011 and about 100+ versions ago, nothing here would apply to anything today. You can post a new topic if needed with any questions you may have for the current version.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.