How to optimize vBulletin 3.x and 4.x for less server load and provide fast loading site experience to members as well as guests.
Couple of months back, I started working for a client who had more than two million posts in his vBulletin forum. He had issues of very slow forum experience for users. I did a long list of to-do stuff to optimize vBulletin for better user experience as well as reduce the server load. A couple of months down the line he has no complaints from a user on forum speed now.
Let me share the same list in detail here. It not only will help optimize vBulletin on your own but will also help me in making the list of things to be done for optimizing large forums for future clients as well.
1. Move Attachments and Images to File System
By Default vBulletin have Attachments / Images / Avatars all are stored into Database. You need to make sure you move them to files.
- Admin CP > Attachments > Attachment Storage Type
- Admin CP > User Albums > Album Picture Storage Type
- Admin CP > Avatars > User Picture Storage Type
2. Store CSS StyleSheets as Files
vBulletin by default renders the CSS as inline in the head part of HTML. It, in turn, increases the size of each page and eliminates the option for caching.
Storing the CSS as a file not only reduces the code from each page but also allows caching of the CSS file by browsers.
Apart from the editable CSS vBulletin also adds an extra CSS file clientscript/vbulletin_important.css. Copy the content of the file into your vBulletin CSS editor to make sure you have only one CSS file to save an additional server request.
You can even go one step forward and copy the content of the CSS file generated from your vBulletin interface and minimize CSS. Upload the file and use the CSS file instead of the CSS front end interface in vBulletin admin.
Note if you are using the CSS file, make sure your developers are aware of where to make the changes. Editing the CSS inside the admin will not work. Moreover, removing the CSS file from the “headinclude” template can mean it can impact the addition of editor CSS on a new thread and new post pages.
3. Reduce HTML for guest (or otherwise)
A lot of HTML can be avoided to render your pages much faster and reduce server load. Let me get into each of them one by one.
- Disable Forum Jump Menu – I have Forum Jump Menu disabled for guests using vbSEO. However, if you are not using vbSEO, you can disable the forum jump completely from Admin CP. I am sure not many of your forum users use the forum jump menu. The best thing is to try and turn it off and see if anybody reports that they are missing it. If no one reports, you can safely assume no one cared about using it either. Forum jump causes the server to work harder to generate the menu and then uses the bandwidth to display it on each page load. You can change forum jump options from Admin CP > vBulletin Options -> General Settings -> Use Forum Jump Menu.
- Disable Posting Rules – Posting rules at the bottom of every thread and forum pages does not help much to anybody. It only adds to the final HTML. There is no option in vBulletin to disable it, and so you need to edit one single template to disable the posting rules. I disabled it for guests, but you can even disable it completely. To disable posting rules for guests edit the “forumrules” template and add the following at the top. <if condition=”$show[member]”> And at the end of the template add </if>. Posting rules will only show to members and not to guests. You can delete the content of the template, and it will not show.
- Disable username menu for guests on thread pages – Showthread page shows posts. Each post has a username, but when you click on those usernames, it loads a popup menu. The menu is rarely of any use to guests because by default, “email to members” option is off. PM is an option only for members. So if you want, you can turn those menus off for guests. vBSEO provides it as an option.
- Disable who is online for guests – Edit the usergroup ( Admin CP > Usergroups > Usergroup Manager ) called “Unregistered / Not Logged In” and Set “Can View Who’s Online” to off.
- Disable Template Name in HTML Comments– More comments in HTML means more time browser will need to download the HTML. Ideally, on a live server, you should turn off the template name in HTML. Admin CP > vBulletin Options > vBulletin options > General Settings > and select No for Add Template Name in HTML Comments.
4. Limit Spider Activity
If you want to save on your bandwidth, you should have robots.txt file to restrict areas of forums you don’t have much for spiders.
User-agent: * Disallow: /admincp/ Disallow: /images/ Disallow: /modcp/ Disallow: /attachment.php Disallow: /search.php Disallow: /newreply.php Disallow: /newthread.php Disallow: /editpost.php Disallow: /profile.php Disallow: /register.php Disallow: /login.php Disallow: /subscription.php Disallow: /private.php Disallow: /report.php Disallow: /sendmessage.php Disallow: /memberlist.php Disallow: /misc.php Disallow: /moderator.php Disallow: /postings.php Disallow: /sendtofriend.php Disallow: /threadrate.php Disallow: /usercp.php Disallow: /showgroups.php
5. Compress Output (GZIP)
vBulletin provides compression for HTML output, but I prefer to get it done through Apache via mod_deflate. Disable Zipped output in vBulletin. vBulletin Options -> Cookies and HTTP Header Options -> GZIP HTML Output And add the following lines to your httpd.conf file in Apache.
<IfModule mod_deflate.c> | |
SetOutputFilter DEFLATE | |
# file-types indicated will not be compressed | |
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|rar|zip|pdf)$ no-gzip dont-vary | |
<IfModule mod_headers.c> | |
Header append Vary User-Agent | |
</IfModule> | |
</IfModule> |
Restart Apache webserver. Additionally, you should also use Apache to cache static content. Refer article by coderzone on How to Decrease Web Page Loading Time especially caching of static content.
6. Install APC/XCache/eAccelerator on your server
I prefer CentOS on my server and vBulletin recommends APC for CentOS vBulletin combo. Refer an article by Floris about how to install APC on CentOS.
7. Full-Text Search Type
If you have MySQL 4.0.x, you can use this option to reduce server load significantly when a search query is used on your server. Admin CP > vBulletin Options > Search Type. Remember, the change itself is a server-heavy process as it needs to alter the vBulletin post and thread table. If you don’t have many searches avoid such a big query right at this moment.
8. Optimal vBulletin Options
- Enable All AJAX features – Make sure that this is set to allow all AJAX Features. Ajax helps reduce the server load by not reloading a page where AJAX can be used. (Quick Reply for instance) > General Settings -> Disable AJAX Features and select Enable All Ajax Features.
- Cookies and HTTP Header Options > Remove Redirection Message Pages – Put it off to save on unneeded page loads and bandwidth.
- Cookies and HTTP Header Options > Add No-Cache HTTP Headers – Make sure you don’t opt for No-Cache setting and so set this to No.
- Server Settings and Optimization Options > Cached Posts Lifespan – If you have no issues with space on your server setting this to a higher value is recommended. I have this set to 10 days and once you turn this on rebuilding your Post Cache under Maintenance > Update Counters
- Server Settings and Optimization Options > Update Thread Views Immediately – Set this to No. It will update thread views via a cron every 1 hour by default. If you wish to change this, you can do so by editing the Scheduled Task for Thread Views to a different time.
- Server Settings and Optimization Options > Update Attachment Views Immediately – Set to No.
- User Listing & Profile Viewing > Show the Last Post on Profile Page – This is a very server intensive process and so set this to No.
- Message Posting and Editing Options > Quick Reply – Not only does it make posting faster, which leads to more posts being made. It also more use of Ajax, which means you do not have to load another page to make a post.
- Message Posting and Editing Options > Quick Edit – Turn this on to reduce the need for a new page reload when someone wants to edit a post.
- Message Searching Options > Minimum Time Between Searches – Set this to some value mainly to avoid an attempt to use the search to harm your server.
- Forums Home Page Options > Display Logged in Users? – I have mine set to Yes, but if you have issues with server load, you can turn this feature off.
- Forum Display Options > Show Users Browsing Forums – Mine is set to No, and if you have issues with server load, you can turn it off.
- Thread Display Options > Show Users Browsing Threads – I have mine set to No for similar reasons as above.
- Forum Display Options > Maximum Displayed Threads Before Page Split – Having too many threads on a single page makes the page load slowly. Ideally, you should have a value between 20 and 40. I have it set to 20.
9. Use vbOptimize
I have not used vbOptimize Pro because it is untested on 3.7.x/3.6.x but had experienced a lot of good things about vbOptimize when it was a free mod at vbulletin.org
10. Use CDN
You can move static content like images, CSS, and JavaScript’s over to CDN and reduce your server load and speed up your vBulletin performance. See How to Integrate CDN With vBulletin
11. More …
If you still have issues with your server ideally, you should hire me :D. Opt for MySQL post table partitioning. Partitioning your post table should be based on the threadid. Partition is introduced in MySQL version 5.1+, and you cannot use vBulletin’s FULLTEXT Search option on a partitioned table. Check out how to Partition MySQL table based on Range. Before you opt for partition, do read the Limitations.