WordPress is an amazingly powerful blog and website content management system. In fact, it is what we use. The only caveat is that it tends to be somewhat bloated and requires a bit of tweaking and custom solutions when the blog or website traffic increases. There have been countless times we have been browsing Digg or Reddit and a linked blog post or WordPress website is down because of the huge increase in traffic.
Our goal, is to provide five essential steps for keeping your WordPress blog and websites up. All of our steps relate specifically to server infrastructure, and don’t hit any of the other ways to optimize Wordprss itself with plugins or code modification; we’ll leave that to another blog post.
Lighttpd Web Server Instead Of Apache
Lighttpd offers a small memory footprint compared to other web-servers, and superior performance when serving static content such as images, css, javascript and plain html files. In addition it has gained a large adoption rate and is used by several popular web 2.0 sites like YouTube, Wikipedia and Meebo. Server side requests such as PHP are passed off to fastCGI for processing. Lighttpd has a extensive library of plugins such as mod_rewrite, mod_redirect, mod_fastcgi, mod_expire, mod_compress, and mod_proxy.
Also, see our blog post (Lighttpd Web Server With WordPress Permalinks) on how to properly configure permalinks (mod_rewrite) on lighttpd for WordPress. It is a bit different than Apache.
XCache PHP Caching
XCache is a fast, stable PHP opcode cacher that has been tried and tested. XCache accelerates the performance of PHP on servers. It optimizes performance by removing the compilation time of PHP scripts by caching the compiled state of PHP scripts into memory and uses the compiled version straight from the RAM. This will increase the rate of page generation time by up to 5 times as it also optimizes many other aspects of php scripts and reduces serverload. We have tried other PHP opcode cachers such as eaccelerator, iconCube, and APC, but have found that XCache delivers the best performance results, and also is the simplest to install and configure.
Enable Gzip Compression Of Static Content
Gzip is a popular and effective compression method. Most modern web browsers support and accept compressed data transfers. By gziping static content such as css, javascript, and html files, response times can be reduced by 60-70%. There is a nice guide on how to configure Gzip on lighttpd at: http://www.cyberciti.biz/tips/lighttpd-mod_compress-gzip-compression-tutorial.html
MySQL Storage Engine InnoDB
Change all WordPress MySQL tables to use InnoDB storage engine instead of MyISAM. InnoDB is transaction-safe meaning data-integrity is maintained throughout the entire query process. InnoDB also provides row level locking, as opposed to table-locking, meaning while one query is busy updating or inserting a row, another query can update a different row at the same time. These features increase multi-user concurrency and performance.
Here is a quick script to update all tables in a database to the InnoDB storage engine.
mysql -p -e "show tables in PUT-DATABASE-NAME-HERE;" | tail --lines=+2 | xargs -i echo "ALTER TABLE {} ENGINE=INNODB;" > alter_table.sql
mysql --database=PUT-DATABASE-NAME-HERE -p < alter_table.sql
Tune MySQL
This is perhaps the most difficult step, because there inst a cut and dry approach. Often times it requires a bit of trial and error, and tweaking various configuration directives. No need to fret though, we have listed a full MySQL configuration file below. The directives in this configuration file are optimized for MySQL5 running WordPress on InnoDB tables. Additionally, the configuration file below is for a dedicated MySQL5 server with at-least 256MB of dedicated memory and four processors.
OBLIGATORY WARNING…Please don’t blindly copy the MySQL configuration file below into your server and restart MySQL without first doing a full backup, and understanding the implications of these changes. The last thing we want, is people hosing their MySQL databases.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # @author 619Cloud <http://www.619cloud.com> <hello@619cloud.com> # @copyright (c) 2010 619Cloud. All Rights Reserved. # Optimized for a dedicated MySQL5 server with at-least 256MB of dedicated # memory, four CPUs, running InnoDB storage engine tables. [mysqld] skip-bdb skip-ndbcluster datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock default-storage-engine=InnoDB long_query_time=2 log-slow-queries=/var/log/mysql_slow.log expire_logs_days=14 max_connections=50 external-locking port=3306 net_retry_count=5 max_connect_errors=50 wait_timeout=3600 connect_timeout=15 open_files_limit=1536 key_buffer_size=64M innodb_buffer_pool_size=128M innodb_additional_mem_pool_size=8M innodb_log_buffer_size=8M group_concat_max_len=16k max_sort_length=16k max_length_for_sort_data=16k query_cache_type=1 query_cache_limit=4M query_cache_size=64M innodb_thread_concurrency=16 thread_concurrency=16 thread_cache=128 thread_stack=1M read_buffer_size=1M join_buffer_size=2M read_rnd_buffer_size=1M table_cache=512 tmp_table_size=256M max_heap_table_size=256M innodb_log_file_size=128M innodb_flush_log_at_trx_commit=1 innodb_file_per_table log-warnings user=mysql old_passwords=1 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid |
If you have any additional questions, please leave comments below and we will reply.












I disagree with the InnoDB part. In the long run InnoDB could actually be more server intensive, and actually slow down processes in the long run, maybe causing you to shell out more on servers to keep up. MyISAM can work well, just need to tune it, that’s all.
Brad,
It is our philosophy that MyISAM is a nice baby step into database storage engines, but InnoDB is a much more mature engine with support for triggers and foreign keys. It also, under various benchmarks has shown to perform better under high levels of concurrency because it is a row level locking engine, instead of a table level locking engine. Currently our recommendation is that all databases should use InnoDB, unless there is a specific reason otherwise.
Both have their advantages. MyIsam is generally faster, but it’s what I would call “quick and dirty”. As soon as you start hitting problems like table level locking that’s causing queries to queue up, you need to look at switching. It’s NOT the solution for everyone, but if you are going to use MySQL on a high-traffic WordPress site, I’d recommend it.
I have to hear just what Ora can do with this.
[...] HostingAdditional ServicesSign UpFAQSupportContact UsBlog Managed DNS Hosting 5 Essential Steps For Hosting A Scalable WordPress Blog Or WebsiteManaged WordPress VPS Solution On Sunday, May 9th 2010, in Technology, by 619Cloud We are happy to [...]
[...] 5 Essential Steps For Hosting A Scalable WordPress Blog Or Website [...]
This blog is simply excellent, I assumed I do know a great deal, but I’m so mistaken, like the prior saying the extra you already know, the extra you find out how little you know. Thanks for the info.
still learning in this cache concept. is it on the hosting itself or just at the blog itself, confused.
скачать бесплатно фильмы торенто скачать игры для детей
Hi guys, thanks so much for taking the time to give these tips!
I’m having a hard time understanding how to run the mysql script to get INNODB setup.
Could I get some quick assistance?!
Всем хорошего времени суток! Кто знает где находится село дебесы?.
[...] 5 Essential Steps For Hosting A Scalable WordPress Blog Or Website | 619Cloud – Personalized C…. Share this:TwitterFacebookLike this:LikeBe the first to like this [...]
I?m no longer positive where you are getting your information, but good topic. I needs to spend a while studying more or figuring out more. Thank you for wonderful info I used to be searching for this info for my mission.
Да, вполне