Log In
Or create an account ->
Imperial Library
Home
About
News
Upload
Forum
Help
Login/SignUp
Index
High Performance Drupal
Dedication
Preface
Does Drupal Scale?
Goals of This Book
Supported Drupal Versions
How This Book Is Organized
Performance Analysis
Application Performance
Infrastructure
Databases
Web Servers and Reverse Proxies
Ongoing Testing
Where to Next?
Conventions Used in This Book
Using Code Examples
Safari® Books Online
How to Contact Us
Acknowledgments
From Jeff
From Narayan
From Nat
1. Beginning a Performance Project
Getting Started with Performance Improvements
Establishing a Performance Baseline
Setting Goals for Website Performance
The Many Aspects of Drupal Performance
Creating a Prioritized List of Improvements
2. Frontend Performance
Limiting HTTP Requests
Audits
Image Requests
Minification
Minification On the Fly
Preminification for Modules/Themes
Minifying During the Build Process
Compression
Cacheable Headers
CDNs
Keep Third-Party Libraries Up to Date
jQuery Update
External Scripts
Single Points of Failure (SPOFs)
3. Drupal Performance Out of the Box
Page Caching
When Should You Use Page Caching?
Internal Page Caching
Reverse Proxy Caching
CSS and JavaScript Aggregation
Logging
The Cache and Other Swappable Storage
Cron
Views
4. Drupal Coding for Optimal Performance
Context Matters
False Optimizations
Listing Entities
entityQuery()
Multiple Entity Loading
Caching
Static Caching
Persistent Caching
Cache chains
Cache bins
getMultiple()/setMultiple()/deleteMultiple()
Cache tags
CacheArray
Render caching
Queues and Workers
Cache Stampedes and Race Conditions
5. Drupal Coding for Abysmal Performance
variable_set() Abuse
External Requests
Sessions
Excessive Cache Granularity
PHP Errors
Debug Code in the Code Base
Development Settings
6. Verifying Changes
Analyzing Frontend Performance
YSlow and Google PageSpeed
Waterfall Charts
Real User Monitoring
Analyzing Application Performance
The Devel Module
Page timing
Memory usage
Query log
Xdebug
XHProf
strace
7. Infrastructure Design and Planning
Horizontal and Vertical Scaling
Service Categorization
Working Well Together
Example Two-Layer Configuration
Example Larger-Scale Infrastructure
Development and Staging Environments
Internal Network Layout
Utility Servers
High Availability and Failover
Hosting Considerations
Summary
8. Service Monitoring
The Importance of Monitoring Services
Monitoring Alerts with Icinga
What to Monitor
How to Tune Monitoring
Graphing Monitoring Data
Internal Versus Remote Monitoring
9. “DevOps”: Breaking Down Barriers Between Development and Operations
Revision Control Systems
Locally Hosted or External Service
Not Just for Code
Configuration Management Systems
Which System to Use
Pulling It Together: In-Depth Example with Puppet and Git
Development Virtual Machines
How to Distribute Development VMs with Vagrant
Deployment Workflow
Example Workflow with Git
Deployment with Jenkins CI
10. File Storage for Multiple Web Servers
rsync
GlusterFS
Example Configuration
Single NFS Server
HA NFS Cluster
Example Configuration
Setting Up DRBD
Setting Up Heartbeat
Setting Up NFS
Testing
Storage Area Networks (SANs)
11. Drupal and Cloud Deployments
What Is the Cloud?
Why Use the Cloud?
Infrastructure Overhead
Prepackaged Clouds
Common Issues with Cloud Deployments and Their Mitigations
12. Failover Configuration
IP Failover Versus DNS Failover
Service-Level Issues
Heartbeat
Installation
Configuration
Usage
13. MySQL
Drupal and MySQL Engines
Versions of MySQL
Oracle MySQL
MariaDB
Percona Server
General Configuration
Global Configuration
Per-Thread Configuration
Storage Engine Configuration
Replication
Virtualized Deployments
14. Tools for Managing and Monitoring MySQL
Percona Toolkit
Openark Kit
mysqlreport
Percona Monitoring Plug-Ins
15. MySQL Query Optimization
Index Basics
Base Tables and Join Order
Common Issues
The ORDER BY on an Unrelated Table
The Useless DISTINCT (“In Case of Accidents!”)
Starfish Syndrome (All LEFT JOINS)
Node Access
16. Alternative Storage and Cache Backends
Cache, Lock, and Session Storage
Memcache In Depth
PHP Extensions for Memcache
Assigning Memcached Servers and Bins
Memcache Locking and Stampede Protection
What to Store in Memcache
Configuring the Memcache Daemon
How to Break Your Site with Memcache
Inconsistent Caching
Constant Evictions
Vanishing Sessions
Entity/Field Storage
EntityFieldQuery/EntityQuery
CRUD
MongoDB
17. Solr Search
Performance and Scalability Considerations
Integrating Solr with Drupal
Solr Configuration
Indexing Content
Infrastructure Considerations
Solr Replication
Drupal Module Installation
18. PHP and httpd Configuration
APC: PHP Opcode Cache
php.ini Settings
PHP Apache Module Versus CGI
Apache MPM Settings
Prefork Thread Settings
KeepAlive
Cache Headers
Logging
Server Signature
Administrative Directory or VirtualHost
Nginx
Why Not Use Nginx Everywhere?
19. Reverse Proxies and Content Delivery Networks
Using a Reverse Proxy with Drupal
Understanding Varnish Configuration Language
Defining a Backend
Directors: Dealing with Multiple Backend Servers
Built-in VCL Subroutines
Customizing Subroutines
Cookies and Varnish
Caching for Authenticated Users
Edge-Side Includes
Serving Expired Content
Error Pages
Memory Allocation
Logging and Monitoring Varnish
Sample VCL for Drupal
Content Delivery Networks
Serving Static Content Through a CDN
When to Use a CDN
Choosing Between a CDN and a Reverse Proxy
20. Load Testing
Different Types of Load Tests
Creating a Valid Test
When to Test
Continuous Integration (CI)
Periodic Testing
Manual Targeted Testing
Interpreting Test Results
Server Monitoring During Load Tests
Where to Test
Example Load Test Using JMeter
Global Test Settings
Thread Groups
Handling Cookies
Login Controller
Browse Controller
Output Configuration
Running a Test
Reading Test Results
21. Where to Next?
Official Book Website
High Performance Drupal Group
Drupal Watchdog
Revision Control with Git
Varnish
Configuration Management
Vagrant
Jenkins
MySQL Performance
InnoDB Index Structures
Index
About the Authors
Colophon
Copyright
← Prev
Back
Next →
← Prev
Back
Next →