Posts Tagged ‘Tuning’

WordPress – WebServer Tuning

Donnerstag, Juli 29th, 2010

In den letzten Tagen und Wochen habe ich mir immer wieder in einer freien Minute mit dem optimalen Setup eines Web-Servers beschäftigt. Ich denke, mittlerweile ist BestBlog recht performant und bietet dem Nutzer zügige Ladezeiten und schnelle Downloads.

no images were found

BestBlog wird nun schon im sechsten Jahr von mir geschrieben und natürlich auch technisch betreut. Während der ganzen Zeit habe ich natürlich mit den verschiedensten Distributionen Versuche unternommen eine performante Basis für WordPress zu schaffen.

Aus diesen Erfahrungen hat sich für mich irgendwann ergeben, dass als „Grundlage“ für den WebServer CentOS eine gute Wahl ist. Im Moment nutze ich CentOS 5.5 in der 64 Bit Version.

Diese Änderungen sind für euch allerdings nur sinnvoll, wenn ihr einen eigenen Server, virtuell oder dediziert, betreibt. Bei Hosting-Paketen können diese Änderungen von euch nicht ausgeführt werden. Die meisten bekannten Hoster verwenden allerdings genau diese Technologien um einen schnellen Aufbau eurer Seite zu gewährleisten.

Lest euch die folgenden Anleitungen genau durch und versucht euch auch dran zu halten. Die hier angegebenen Werte sind nur Erfahrungswerte und aufeinander abgestimmt. Für meine Konfiguration funktionieren diese super, was aber nicht bedeuten muss, dass ihr das gleich Ergebnis erzielt.

CentOS als WebServer:

Als Grund-Installation ist immer die „minimal Installation“ zu empfehlen. In dieser Installation ist nichts enthalten, was den WebServer nachher unnötig belasten könnte. Um aus seiner Minimal-Installation eine WebServer Installation zu machen bedarf es nur weniger Kommandos.

########################################
## CentOS 5.5 Web-Server Installation ##
##       http://www.bestblog.de       ##
########################################

su -

yum update
yum install httpd mysql mysql-server php php-gd php-mysql php-devel
yum groupinstall 'Development Tools'
/etc/init.d/httpd restart
/etc/init.d/mysqld restart

Mit diesen Kommandos wird die Installation aller für WordPress benötigten Dienste ausgelöst (Apache WebServer, MySQL, PHP mit den entsprechenden Erweiterungen).

Installiert man nun WordPress ist es voll funktionsfähig. Allerdings kommt nach kurzer Zeit bei den meisten Nutzern das Bedürfnis nach Performance-Steigerung auf. Mit ein paar einfachen Anpassungen kann man seinen Blog um einiges schneller machen, wobei eine genaue Angabe in Prozent auch bei mir nur ein Blick in die Glaskugel wäre.

Kommen wir nun zu den Möglichkeiten Apache etwas leistungsfähiger zu machen.

Apache WebServer Tuning:

Um möglichst nutzerfreundlich zu sein, kommt Apache 2 in der Standardinstallation mit einigen Modulen, die für den reinen Betrieb einer Instanz von WordPress aber nicht benötigt werden. Deswegen kann man das Laden einiger Module in der Konfiguration des WebServers unterbinden.

Die Konfiguration findet sich in folgendem Pfad: „/etc/httpd/conf/httpd.conf“

Die Zeilen, die im folgenden Schritt verändert werden beginnen mit „LoadModule“. Öffnet die oben angegebene Datei mit einem Texteditor eurer Wahl. Ich empfehle VI oder VIM. Sorg dafür, dass die Passage in der Konfigurationsdatei folgendermassen aussieht.

########################################
##    CentOS 5.5 WebServer Tuning     ##
##      http://www.bestblog.de        ##
########################################

##    LoadModule-Passage anpassen     ##
##       bis sie so aussieht          ##

# Example:
# LoadModule foo_module modules/mod_foo.so
#
# LoadModule auth_basic_module modules/mod_auth_basic.so
# LoadModule auth_digest_module modules/mod_auth_digest.so
# LoadModule authn_file_module modules/mod_authn_file.so
# LoadModule authn_alias_module modules/mod_authn_alias.so
# LoadModule authn_anon_module modules/mod_authn_anon.so
# LoadModule authn_dbm_module modules/mod_authn_dbm.so
# LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
# LoadModule authz_user_module modules/mod_authz_user.so
# LoadModule authz_owner_module modules/mod_authz_owner.so
# LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
# LoadModule authz_dbm_module modules/mod_authz_dbm.so
# LoadModule authz_default_module modules/mod_authz_default.so
# LoadModule ldap_module modules/mod_ldap.so
# LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
# LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
# LoadModule logio_module modules/mod_logio.so
# LoadModule env_module modules/mod_env.so
# LoadModule ext_filter_module modules/mod_ext_filter.so
# LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
# LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
# LoadModule dav_module modules/mod_dav.so
# LoadModule status_module modules/mod_status.so
# LoadModule autoindex_module modules/mod_autoindex.so
# LoadModule info_module modules/mod_info.so
# LoadModule dav_fs_module modules/mod_dav_fs.so
# LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
# LoadModule actions_module modules/mod_actions.so
# LoadModule speling_module modules/mod_speling.so
# LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
# LoadModule proxy_module modules/mod_proxy.so
# LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
# LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
# LoadModule proxy_http_module modules/mod_proxy_http.so
# LoadModule proxy_connect_module modules/mod_proxy_connect.so
# LoadModule cache_module modules/mod_cache.so
# LoadModule suexec_module modules/mod_suexec.so
# LoadModule disk_cache_module modules/mod_disk_cache.so
# LoadModule file_cache_module modules/mod_file_cache.so
# LoadModule mem_cache_module modules/mod_mem_cache.so
# LoadModule cgi_module modules/mod_cgi.so
# LoadModule version_module modules/mod_version.so

Bei diesem Schritt müsst Ihr sehr viele Zeilen auskommentieren. Durch das „#“ vor einer Zeile wird diese beim Laden der Konfiguration von Apache nicht gewertet und das Modul damit nicht geladen. Startet den Apache WebServer nun neu, damit die Konfiguration neu geladen wird.

Es gibt auch diverse Einstellungen, die noch angepasst werden sollten. Dazu sucht in eurer Konfiguration folgende Zeilen und ändert diese entsprechend den unten stehenden ab.

########################################
##    CentOS 5.5 WebServer Tuning     ##
##      http://www.bestblog.de        ##
########################################

##   Diverse Einstellungen anpassen   ##

KeepAlive Off

KeepAliveTimeout 2

MaxKeepAliveRequests 200

Timeout 40

#####################################
##     WebServer neu starten       ##
#####################################

su -

/etc/init.d/httpd restart

Sollte ein Fehler Apache am Starten hindern, prüft bitte erneut eure Konfiguration. Kommentiert Zeilen, die Schwierigkeiten machen bitte aus und versucht erneut den WebServer zu starten.

Ist Apache erfolgreich gestartet sollte sich schon eine kleine Steigerung der Performance zeigen, da nur die nötigsten Module geladen sind und die Abarbeitung der Anfragen schneller von Statten geht.

Um noch mehr aus Apache rauszuholen, ist es möglich die „Arbeitsprozesse“ auf seine Umgebung anzupassen. Apache lässt die Anfragen durch zwei „Module“ bearbeiten (Prefork und Worker). Die Grundeinstellungen dieser beiden Module kann man in der oben erwähnten Apache-Konfiguration ändern. Da ich auch hier keine Optimal-Werte nennen kann, die für euch richtig sind, nehme ich die Werte für einen durchschnittlich besuchten Blog.

Sucht die entsprechenden Abschnitte in eurer Konfiguration und ändert Sie wie unten beschrieben ab.

########################################
##    CentOS 5.5 WebServer Tuning     ##
##      http://www.bestblog.de        ##
########################################

##     Preforker / Worker anpassen    ##

###        Preforker Anpassung       ###

StartServers       3
MinSpareServers    3
MaxSpareServers   10
ServerLimit      50
MaxClients       50
MaxRequestsPerChild  2000

###        Worker Anpassung       ###

StartServers         2

MaxClients         150

MinSpareThreads     25

MaxSpareThreads     75

ThreadsPerChild     25

MaxRequestsPerChild  0

#####################################
##     WebServer neu starten       ##
#####################################

su -

/etc/init.d/httpd restart

Ist der WebServer neu gestartet, sind die gerade vorgenommenen Änderungen aktiv. Damit sind die Änderungen, die am Apache notwendig sind abgeschlossen. Probiert ruhig ein bisschen  mit verschiedenen Einstellungen rum, aber macht vorher ein Backup der originalen Konfiguration.

Da WordPress aber nicht nur Apache braucht um zu funktionieren, sondern ebenso auf eine MySQL Datenbank angewiesen ist, die vorher installiert wurde, gibt es auch in diesem Bereich einige Möglichkeiten die Performance zu verbessern.

MySQL Datenbank Tuning:

Auch MySQL bietet vielfältige Einstellungsmöglichkeiten. Für WordPress sind allerdings Basis-Einstellungen schon ausreichend um einen anständigen und schnellen Betrieb zu erreichen.

Die folgenden Schritte ändern nur Einstellungen für den Dienst, der die MySQL-Anfragen bearbeitet. Die Datenbank an sich wird hier nicht verändert. Allerdings habe ich schonmal zusammengefasst, wie man seine WordPress Datenbank aufräumt und optimiert.

Die Konfiguration von MySQL findet sich in folgendem Pfad: „/etc/my.cnf“

Wie schon bei Apache kann ich auch hier nur Richwerte angeben, die bei mir gut funktioniert haben.

Passt die Konfiguration so an, wie im unten stehenden Kasten beschrieben.

########################################
## CentOS 5.5 Web-Server Tuning       ##
##       http://www.bestblog.de       ##
########################################

##    MySQL Konfiguration anpassen    ##

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

key_buffer = 64M
sort_buffer = 1M
join_buffer = 1M
max_allowed_packet = 8M
max_heap_table_size = 16M
table_cache = 1024
sort_buffer_size = 8M
read_buffer_size= 1M
read_rnd_buffer_size = 768K
myisam_sort_buffer_size = 48M
thread_cache_size = 512
query_cache_type = 1
query_cache_limit = 4M
query_cache_size = 64M
tmp_table_size = 16M

## Hier die Anzahl eurer CPU's eintragen ##
thread_concurrency = 4 

max_write_lock_count = 1
low_priority_updates = 1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[isamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

########################################
##           MySQL Neustart           ##
########################################

su -

/etc/init.d/mysqld restart

Nach dem Neustart von MySQL sind die Einstellungen aktiv und werden im laufenden Betrieb verwendet. Bitte passt auf, dass Ihr euch bei diesen Änderungen nicht verschreibt, sonst besteht die Gefahr, dass die Datenbank inkonsistent wird.

Nun sind Apache und MySQL angepasst und euer Blog sollte schon einen Tick schneller sein. Die Basis allerdings folgt jetzt.

WordPress ist in PHP (PHP: Hypertext Preprocessor) geschrieben. PHP bietet wie die beiden Vorgänger die Möglichkeit Fein-Tuning zu betreiben.

PHP Tuning:

Mit den Einstellungen in PHP lässt sich „subjektiv“ der größte Erfolg bei der Geschwindigkeit erzielen. Daher reichen die wenigen Änderungen an der Konfiguration schon aus um sichtbar schnellere Ladezeiten zu erreichen.

Die Konfiguration für PHP befindet sich hier: „/etc/php.ini“

Bitte folgende Zeilen suchen und entsprechend dem unteren Kasten abändern.

########################################
## CentOS 5.5 Web-Server Installation ##
##       http://www.bestblog.de       ##
########################################

##     PHP Konfiguration anpassen     ##

output_buffering = On

output_handler = ob_gzhandler

zlib.output_compression = Off

########################################
##           PHP Neustart             ##
########################################

su -

/etc/init.d/httpd restart

Diese Einstellungen modifizieren in sofern, dass der Output in komprimierter Form übertragen werden kann, was einen Vorteil bietet. Nach dem Neustart von Apache sind die Einstellungen aktiv.

Im letzten Schritt der PHP-Anpassung wird ein Tool installiert, dass sich selbst als Beschleunigung, Optimierung und Cache für dynamischen Inhalt zusammen mit PHP versteht. Das bringt dann letztendlich den größten Geschwindigkeits-Vorteil, da hier die Last von Apache und PHP genommen wird und in einen schnelleren Prozess verlagert werden kann.

Installation Eaccelerator:

Um Eaccelerator zu installieren, könnt ihr die Kommandos im unteren Kasten abschreiben. Deswegen war es wichtig, wie oben erwähnt die „Development Tools“ mit zu installieren.

########################################
##   CentOS 5.5 Web-Server Tuning     ##
##       http://www.bestblog.de       ##
########################################

##      EACCELERATOR Installation     ##

su - 

cd /tmp

wget http://bart.eaccelerator.net/source/0.9.5.2/eaccelerator-0.9.5.2.tar.bz2

tar -xjf eaccelerator-0.9.5.2.tar.bz2

cd eaccelerator-0.9.5.2

phpize

./configure

make

make install

Damit ist eaccelerator auf eurem Server installiert, aber noch nicht aktiv. Dazu muss in den passenden Pfad eine Konfigurations-Datei hinterlegt werden, die Ihr mit einem Texteditor der Wahl erstellen könnt. Ich beschreibe den Vorgang wie immer in VI / VIM.

Den Inhalt dieser Datei bitte aus dem unteren Kasten kopieren.

########################################
##   CentOS 5.5 Web-Server Tuning     ##
##       http://www.bestblog.de       ##
########################################

##     EACCELERATOR Konfiguration     ##
###          Erstellung              ###

su -

vi /etc/php.d/eaccelerator.ini

##     EACCELERATOR Konfiguration     ##
###          Befüllen                ###

extension="eaccelerator.so"
eaccelerator.shm_size="0"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

##     EACCELERATOR Konfiguration     ##
###    Cache-Verzeichnis Erstellen   ###

mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator

#####################################
##     WebServer neu starten       ##
#####################################

su -

/etc/init.d/httpd restart

Der eaccelerator ist nun installiert und aktiviert. Ruft euren Blog auf und bewundert, wie schnell sich die Seiten aufbauen. Ich habe damit eine Steigerung erreicht, die jederzeit den Eindruck vermittelt, die Seite würde aus dem LAN aufgerufen. Allerdings ersetzen all diese Änderungen keine gute Anbindung an’s Internet.

Happy fast-as-hell browsing,

j.klein