EAST BAY WORDPRESS MEETUP
HOW TO MAKE WP FLY...
THE ALTERNATIVE TITLE
I could have renamed this presentation
EXPLAINING
THE
SECRETS
BEHIND
MANAGED
HOSTING AND REALLY
Stefan Didak
http://www.stefandidak.com
(“not a web developer”)
The
sound
a WordPress site
should make when your client is
happy to pay you more because
their site is
so fast
that it puts
their competition to
shame
.
LEVELS OF CACHING
all of those make a difference but... NOT ENOUGH
Caching provided by
optimizing
your site
Caching through
plugins
Caching because of
all of the above
Everything I’m going to show today requires you to have full control and access to your server (VM, VPS, Cloud, etc.)
LEVELS OF CACHING
Don’t just optimize your site
Optimize
YOUR SERVER!
and if you have none, build one!
WHAT I’LL BE COVERING
Also known as the Tip of the Iceberg
WordPress Caching
Digital Ocean +
DEMO
OpCode Caching
Apache v.s. Nginx
Varnish
WP CACHING OVERVIEW
WORDPRESS CACHING
Run-Time Cache
Only lasts the
duration of the request
.
After the request the run-time cache no
longer exists.
For example: the global
$post
and
WORDPRESS CACHING
Transient Cache
WordPress has a
“Transient Cache”
API
that allows you to store data in
your MySQL DB.
Ahum... Right...
But it can still be useful...
if used selectively
WORDPRESS CACHING
Object Cache
Is usually
persistent
because it’s stored
“somewhere”.
Somewhere could be in memory through
APC, Memcached, or Redis, but could also
WORDPRESS CACHING
Page Cache - Stored on disk or in memory
Stores
HTML
data representing entire
pages. This is one of the more typical
caching schemes used by most plugins.
Unfortunately, not so useful when you have
highly dynamic pages
where someone does
not always get the same content (i.e.
WORDPRESS CACHING
Fragment Cache
I don’t like the term and it is no different
from the
Object Cache
. Instead of storing
entire HTML pages it stores
parts
of pages.
I like to think of it as just another object
PERSONAL EXPERIENCE
Managed Hosting, however optimized, is still designed to be a version of a “one size fits all” approach
I prefer to have
full control
over my own online servers
because I can have them be
faster
than managed hosting
GREAT PERFORMANCE & COOL PRICES
GREAT(ER) PERFORMANCE & OK PRICES
NICE PERFORMANCE & CAN GET EXPENSIVE SLOW & EXPENSIVE
FIRST DEPLOYMENT
It was really exciting to see my first droplet come online
After running and testing my first
“droplet” on Digital Ocean and after
playing with some deployments on
Linode I knew my shared hosting for
30+ domains would come to an end.
A very
WELCOME
END!
HOSTING, BUT WHERE
The long search has come to an end
If you don’t care much
about the “managed” part
of managed hosting and
really
want things to roar
STEALTH PROJECT
Not to mention, Digital Ocean has a nice evolving API to manage all your “droplets”. Not as mature as Linode, though!
Once my “stealth project” goes live I
expect that within 2 years I will need
around
150
to
500
virtual servers.
(virtual servers of various capacities)
Digital Ocean has the absolute best
price point
I’ve seen. And I’ve been
looking. Really looking.
DEMO TIME ! DEMO TIME !
If this doesn’t convince you I don’t know what will
$20/mo
shared hosting
v.s.
$5/mo
Digital Ocean Droplet
Oakley Chamber of Commerce
WordPress site
TRY IT FOR YOURSELF
anyone with laptops here are encouraged to check it out
http://
oakleychamber.com
YES YOU CAN
Stop whining about the commandline and typing on the
WAS THAT
FAST
OR WAS THAT
FAST
?
Or is it just cool to know
that you can do it
TOO
!?
I can’t show you managed
hosting vs. Digital Ocean at
a
$25-30
/month vs.
$5-10
/
month price point...
I will take
any
bet, for
any
amount of
serious money, that I can setup and
configure servers on Digital Ocean or
Linode that
beat the living daylights
out of any managed hosting in terms
of performance.
And YOU can do it TOO!
So let’s not even talk about
COPY AND PASTE
If you can’t do copy and paste then I’m wasting your time and I am very sorry. If you can, however... new doors will open!
I know what I’m doing and...
may be biased.
I do, however, believe, that if you put
in some time to learn more than what
you copy & paste will serve you to be
even more valuable to your clients!
INSTALLING AND RUNNING
On how to install, configure, and run with all the things I
https://www.digitalocean.com/community
TUTORIALS, GUIDES, AND MORE
OPCODE CACHING
OPCODE CACHING
Yeah, uh, sure, what what does it DO?!
What your server does for
EVERY
page hit
on your site:
Read most (or all) of your PHP files/code
Interpret each line & “compile” it into what the CPU understands
Execute the “compiled” code and render out the page by sending it to the browser.
OPCODE CACHING
What your server does for
EVERY
page hit
on your site:
Read most (or all) of your PHP files/code
Interpret each line & “compile” it into what the CPU understands
Execute the “compiled” code and render out the page by sending it to the browser.
Yeah, uh, sure, what what does it DO?!
Execute the “compiled” code and render out the page by sending it to the browser.
What your server does for
EVERY
page hit
OPCODE CACHING
The simple explanation
PHP PARSE COMPILE EXECUTE SEND
PHP CACHEAPC EXECUTE SEND
WITHOUT OPCODE CACHING
OPCODE CACHING
Speeds up your site much more than “regular” file/data caching
APC
XCache
eAccelerator
Zend OpCache
NuSphere PHPExpress
IonCube Accelerator
BUT PHP 5.5 HAS OPCACHE
Performance between APC, XCache, etc. is all very similar
Because
APC
is going to
be included in
“PHP6”
But as we all know, there is no such thing as PHP6, right?
There is
a book
on PHP6.
But there is
no Beta
of PHP6.
PHP APC
BENCHMARKING APC
Your site without APC sucks donkey balls
Without APC
Req. Per Sec : 85
Time Per Req. : 900ms
Conc. Time Per Req. : 20ms Xfer Rate : 898 Kbytes/s
With “vanilla” APC
Req. Per Sec : 138.5
Time Per Req. : 476ms
Conc. Time Per Req. : 9.5ms
Xfer Rate : 1265 Kbytes/s
Great, but...
BENCHMARKING APC
Your site with APC and apc.stat = off WILL FLY!
Without APC
Req. Per Sec : 85
Time Per Req. : 900ms
Conc. Time Per Req. : 20ms Xfer Rate : 898 Kbytes/s
With “vanilla” APC
Req. Per Sec : 138.5
Time Per Req. : 476ms
Conc. Time Per Req. : 9.5ms
Xfer Rate : 1265 Kbytes/s
Now with apc.stat=off
Req. Per Sec : 317.4
Time Per Req. : 152.1ms
Conc. Time Per Req. : 3.1ms
APC.STAT = OFF
THINK AND PLAN BEFORE YOU TURN IT OFF
Only turn APC.STAT to OFF if:
Your PHP code on the server
does not
change
and you are willing to
restart
the web server if it does.
WP or Plugin
updates
=
CHANGE OF PHP CODE
RESTARTING? SO WHAT?
There are other ways to deal with this but those are for another time when we get real deep into server stuff
# /etc/init.d/apache2 restart
It’s just one line. Maybe not exactly
the same as this one, though.
INSTALLING APC
Because it might be different for your flavor of server I’m not
Ensure your server has:
php-pear, php5-dev, make, apache2-prefork-dev
# pecl install apc
Then add the extension to your php.ini (or other)
CONFIGURING APC
You should tweak it as much as needed
And there’s a lot more you can tweak in APC
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128M (or 1G, etc.)
apc.ttl=3600
apc.user_ttl=7200
apc.gc_ttl=3600
apc.max_file_size=1M
apc.stat=1 (or 0)
WORTH KNOWING
APC will also extend PHP with new functions
With APC installed you can use PHP
function calls to...
Manage
the APC cache
Interrogate the APC cache
Load/Dump Binary cache data
START OPTIMIZING YOUR CODE
Integrate it selectively in your plugins
APC WITH A WP PLUGIN
Your mileage may vary
http://wordpress.org/plugins/apc/
APC Object Cache Backend
Place the object-cache.php in your wp-content directory.
Optionally you can also install the
APACHE V.S. NGINX
Because you might get a lot of visitors... all at the same time!
Apache = Process Based
Nginx = Event Based
A FEW ADVANTAGES
On sites with light traffic you will not see much difference in performance between event vs. processed based servers
Asynchronous
Asynchronous =
Scalability
Fewer Server Resources
(i.e. much less memory)
ALSO A COST DIFFERENCE
Part of the cost of virtual servers is the amount of memory that
10.000
concurrent
connections
and Nginx still uses only
a few MB
of
memory
Apache... 100’s of MB’s
WORDPRESS.COM
Big servers and big sites prefer Nginx... and now you know why
Back in 2008...
8000
live traffic requests per second
Apache would have fallen over
GAME OVER
Big servers and big sites prefer Nginx... and now you know why
15MB of RAM and
10% of CPU resources
Apache and a pound load balancer
would
freak
out at the 1000th
process, using
400+MB
RAM and
“leaking”
20MB
RAM
per hour
WORDPRESS & NGINX
Not quite a match made in heaven
You’ll have to do some marriage counseling
WP development is “intertwined”
with the Apache world.
Support is “limited but growing”.
http://codex.wordpress.org/Nginx
http://wiki.nginx.org/WordPress
WORDPRESS & NGINX
WHERE THE HECK DID MY .HTACCESS FILE GO?!
Nginx has no conceptual notion of
this thing called an
.htaccess
file
http://wordpress.org/plugins/nginx-helper/
Proxy Servers are not just “the thing you set in your browser”
VARNISH
And it really is... really really, really, REALLY FAST!
BROWSER SERVERPROXY WEBSITE
VARNISH WEBSITE
BROWSER
With Varnish
YOU
control the caching
VARNISH
You control the proxy and you control the resources
Cache on Disk
Cache in Memory
Control through
VCL
VARNISH SAME SERVER
Change the web server port to something else because
APACHE OR NGINX PORT 8080 http://mysite.com:8080 VARNISH PORT 80 http://mysite.com
Varnish points to a “backend” server
which happens to be itself but with
VARNISH DIFFERENT SERVERS
You can do the setup in whatever way you like
APACHE OR NGINX PORT 8080 http://mysite.com:8080 http://wowy.com:8080 VARNISH PORT 80 http://mysite.com http://somesite.com http://wowy.com
http://admin.com APACHE OR NGINX PORT 8081
http://somesite.com:8081 http://admin.com:8081
WP AND VARNISH
BEWARE OF COOKIES
# Drop any cookies sent to Wordpress. sub vcl_recv {
! if (!(req.url ~ "wp-(login|admin)")) { ! ! unset req.http.cookie;
! } }
# Drop any cookies Wordpress
# tries to send back to the client. sub vcl_fetch {
! if (!(req.url ~ "wp-(login|admin)")) { ! ! unset beresp.http.set-cookie;
! } }
MEMCACHED
AND IT DOES WHAT?
It manages cache and memory... for more than one server
The “for dummies” version:
Make better use of memory
Cache data in memory on
other servers
that aren’t
DISTRIBUTED, I SAID
WORDPRESS.COM
Yes, wordpress.com uses memcached. As do Twitter, Flickr,
System interconnects on servers
(depending on how you plan and set
them up) can still get more
performance over TCP/IP and
memory than a local server faced
with only its limited resources.
MEMCACHED PHP
When installed Memcached will provide you a lot of PHP functionality to have full control over your caching
$mc = new Memcache;
$mc->connect(‘10.0.1.20’, 11211); $data = “cache this!”;
$mc->set(‘mydata’, $data, false, 100); $result = $mc->get(‘mydata’);
“MEMCACHED PLUGIN”
Your mileage may vary
http://wordpress.org/plugins/batcache/
BATCACHE
Place the advanced-cache.php in your wp-content directory
LIFE IN THE SLOW LANE
If all this server and site performance is getting to you! :-)
Single Malt Scotch
Hi Stefan! Tequila Hi Kelly! Bourbon Hi Mitch! Beer Hi Andrei!
DOWNLOAD THE SLIDES
Because this MAY have gone WAY too FAST for you!
http://eastbaywp.com/
THINGS MENTIONED
In case you want to go look stuff up for yourself
Digital Ocean https://www.digitalocean.com/ Linode https://www.linode.com/ Rackspace http://www.rackspace.com/ Amazon VPC http://aws.amazon.com/vpc/ APC http://php.net/manual/en/book.apc.php XCache http://xcache.lighttpd.net/ eAccelerator http://eaccelerator.net/ Zend OpCache/Optimizer/Platform http://en.wikipedia.org/wiki/Zend_Technologies Nginx http://nginx.org/ Varnish https://www.varnish-cache.org/ Redis http://redis.io/ Memcached http://memcached.org/ WordPress Batcache http://wordpress.org/plugins/batcache/ WordPress APC Object Backend http://wordpress.org/plugins/apc/ And finally, a “real developer’s” home office because everyone keeps asking... :-) http://www.stefandidak.com/office/ http://www.flickr.com/photos/didak/sets/72157633152434208/ http://www.flickr.com/photos/didak/sets/72157632343719954/ http://www.flickr.com/photos/didak/sets/72157632244753177/