Kinerja WordPress dan Caching Stack saya
Ini adalah tumpukan kinerja WordPress yang hebat untuk server tunggal atau VPS rendah kisaran menengah. Saya mengklasifikasikan kisaran menengah sebagai inti tunggal dengan memori sekitar 1G dan drive yang cukup cepat.
Di komputer Anda, ini akan mampu melayani lebih dari 10 ribu tampilan halaman per jam
Stack Server
- Linux - Baik Debian Lenny atau Ubuntu
- Nginx - Dikonfigurasi sebagai cache file statis proksi terbalik
- Apache - Apache akan menangani PHP yang diturunkan oleh Nginx pada port alternatif
- MySql - Diperlukan oleh WP, pastikan Anda menjalankan versi stabil terbaru
- PHP - Versi stabil terbaru dari cabang 5.2 atau 5.3
Cache PHP
- APC - Konfigurasikan dengan memori mmap dan ukuran shm minimal 128M
Stack Plugin Kinerja WordPress
- Nginx proxy cache integrator
- W3 Total Cache - Atur cache halaman ke disk yang ditingkatkan, minify ke disk, dan objek dan db ke APC.
- Self Hosted CDN - Buat 4 alias cname yang mengarah ke domain pada server yang disiapkan hanya untuk melayani file statis
Dengan W3 Total Cache kami menggunakan disk untuk cache halaman dan memperkecil karena Nginx akan melayani file statis kami dengan sangat cepat.
Cara mengkonfigurasi Nginx untuk menyajikan file statis dan meneruskan PHP ke Apache
Masalah dengan menggunakan Apache saja adalah bahwa ia membuka koneksi dan mengenai php pada setiap permintaan bahkan untuk file statis. Ini membuang-buang koneksi karena Apache akan membuatnya tetap terbuka dan ketika Anda memiliki banyak lalu lintas koneksi Anda akan macet bahkan jika mereka tidak digunakan.
Secara default, Apache mendengarkan permintaan pada port 80 yang merupakan port web default. Pertama-tama kita akan membuat perubahan pada Apache conf dan file host virtual untuk mendengarkan pada port 8080.
Konfigurasi Apache
httpd.conf
nonaktifkan KeepAlive
ports.conf
NameVirtualHost *:8080
Listen 8080
Host Virtual Per Situs
<VirtualHost 127.0.0.1:8080>
ServerAdmin [email protected]
ServerName yoursite.com
ServerAlias www.yoursite.com
DocumentRoot /srv/www/yoursite.com/public_html/
ErrorLog /srv/www/yoursite.com/logs/error.log
CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>
Anda juga harus menginstal mod_rpaf sehingga log Anda akan berisi alamat ip asli pengunjung Anda. Jika tidak, log Anda akan memiliki 127.0.0.1 sebagai alamat ip yang berasal.
Konfigurasi Nginx
Pada Debian Anda dapat menggunakan repositori untuk menginstal tetapi mereka hanya berisi versi 0.6.33. Untuk menginstal versi yang lebih baru Anda harus menambahkan paket backports lenny
$ nano /etc/apt/sources.list
Tambahkan baris ini ke file deb http://www.backports.org/debian lenny-backports main
$ nano /etc/apt/preferences
Tambahkan yang berikut ke file:
Package: nginx
Pin: release a=lenny-backports
Pin-Priority: 999
Keluarkan perintah berikut untuk mengimpor kunci dari backports.org untuk memverifikasi paket dan memperbarui basis data paket sistem Anda:
$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update
Sekarang instal dengan apt-get
apt-get install nginx
Ini jauh lebih mudah daripada kompilasi dari sumber.
Konfigurasi nginx dan file server konfigurasi
nginx.conf
user www-data;
worker_processes 4;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
client_body_temp_path /var/lib/nginx/body 1 2;
gzip_buffers 32 8k;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_comp_level 6;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/html text/css image/x-icon
application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Sekarang Anda perlu mengatur hosting virtual Nginx Anda. Saya suka menggunakan metode yang diaktifkan situs dengan setiap sym host v ditautkan ke file di direktori yang tersedia situs.
$ mkdir /etc/nginx/sites-available
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf
default.conf
catatan:
Pengaturan cache statis dalam file berikut ini hanya akan berfungsi jika plugin integrator cache proxy Nginx diaktifkan.
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=staticfilecache:180m max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;
#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";
upstream wordpressapache {
#The upstream apache server. You can have many of these and weight them accordingly,
#allowing nginx to function as a caching load balancer
server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}
Per konfigurasi situs WordPress (Untuk multi situs, Anda hanya perlu satu vhost)
server {
#Only cache 200 responses, and for a default of 20 minutes.
proxy_cache_valid 200 20m;
#Listen to your public IP
listen 80;
#Probably not needed, as the proxy will pass back the host in "proxy_set_header"
server_name www.yoursite.com yoursite.com;
access_log /var/log/nginx/yoursite.proxied.log;
# "combined" matches apache's concept of "combined". Neat.
access_log /var/log/apache2/nginx-access.log combined;
# Set the real IP.
proxy_set_header X-Real-IP $remote_addr;
# Set the hostname
proxy_set_header Host $host;
#Set the forwarded-for header.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
# If logged in, don't cache.
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
}
location ~* wp\-.*\.php|wp\-admin {
# Don't static file cache admin-looking things.
proxy_pass http://wordpressapache;
}
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
# Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
# whether logged in or not (may be too heavy-handed).
proxy_cache_valid 200 120m;
expires 864000;
proxy_pass http://wordpressapache;
proxy_cache staticfilecache;
}
location ~* \/[^\/]+\/(feed|\.xml)\/? {
# Cache RSS looking feeds for 45 minutes unless logged in.
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
proxy_cache_valid 200 45m;
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
}
location = /50x.html {
root /var/www/nginx-default;
}
# No access to .htaccess files.
location ~ /\.ht {
deny all;
}
}
Konfigurasi CDN yang Diinangi Sendiri
Untuk conf CDN yang dihosting sendiri, Anda hanya perlu mengaturnya untuk menyajikan file statis tanpa izin proxy
server {
proxy_cache_valid 200 20m;
listen 80;
server_name yourcdndomain.com;
access_log /srv/www/yourcdndomain.com/logs/access.log;
root /srv/www/yourcdndomain.com/public_html/;
proxy_set_header X-Real-IP $remote_addr;
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
# Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
# whether logged in or not (may be too heavy-handed).
proxy_cache_valid 200 120m;
expires 7776000;
proxy_cache staticfilecache;
}
location = /50x.html {
root /var/www/nginx-default;
}
# No access to .htaccess files.
location ~ /\.ht {
deny all;
}
}
Sekarang mulai server
$ /etc/init.d/apache2 restart
$/etc/init.d/nginx start
Hasil Benchmark
Di Apache Bench, pengaturan ini secara teoritis dapat melayani 1833,56 permintaan per detik
$ ab -n 1000 -c 20 http://yoursite.com/
Itu terlihat seperti konfigurasi standar Apache walaupun tampaknya beberapa di antaranya telah dihapus karena terlihat seperti HTML.
Anda perlu menyelidiki apa yang terjadi ketika server Anda merespons dengan lambat. Anda tidak mengatakan spesifikasi server Anda tetapi Anda menyebutkannya berdedikasi dan 10k / hari harus mudah ditangani.
Menebak, CPU mungkin adalah hambatan yang disebabkan oleh PHP. Menggunakan APC dan plugin caching WP adalah metode yang baik untuk meringankan ini, yang telah Anda lakukan. Anda juga dapat mencoba model proses "MPM" dari Apache alih-alih "Prefork". Pastikan Anda memiliki cukup memori yang dialokasikan untuk APC sehingga dapat men-cache skrip PHP Anda dan tidak 'ketinggalan'.
Bisa juga MySQL - lihat apakah itu memonopoli CPU atau disk.
Pertimbangkan untuk mematikan mod_deflate jika Anda mengaktifkannya - ini memang memberikan manfaat untuk memuat kali, tetapi dapat meningkatkan beban CPU. Mungkin patut dicoba.
Gunakan alat seperti 'pengepungan' atau 'ab' untuk membandingkan server Anda dan mencari tahu di mana server Anda melambat.
Inilah beberapa bookmark saya dari penyetelan kinerja server web: http://articles.slicehost.com/2010/5/19/configuring-the-apache-mpm-on-ubuntu
http://www.thebuzzmedia.com/increase-wordpress-performance-on-apache-with-worker-mpm-php-and-mod_fcgid/
http://www.devside.net/articles/apache-performance-tuning
http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/
Tapi saran asli saya tetap sama - cari tahu apa yang menjadi hambatan pertama! Kalau tidak, Anda secara membabi buta mencoba untuk meningkatkan kinerja (dan tentu saja, meningkatkan kinerja selalu baik) tetapi tanpa mengetahui area mana yang menjadi fokus perhatian Anda.
sumber
Juga aktifkan modul status server dan kunjungi untuk mengetahui apa yang terjadi.
Anda mungkin bertukar. Sudahkah Anda memeriksa vmstat saat ini sedang terjadi? 2GB RAM untuk 80 MaxClients hanya 25 MB untuk masing-masing (dengan asumsi kotak tidak melakukan hal lain.) MaxClients Anda mungkin terlalu tinggi. Solusi untuk ini sudah jelas: tambahkan lebih banyak RAM atau MaxClients yang lebih rendah. Jika baris perintah lambat merespons ketika Anda me-restart apache, itu salah satu indikasi situasi ini.
Mungkin juga Anda sendok memberi makan beberapa klien seluler (atau klien lain pada koneksi lambat) dengan file 'besar' sehingga mengkonsumsi semua slot apache yang tersedia. Mungkin Anda memiliki terlalu sedikit MaxClients. Memeriksa status server akan memberi tahu Anda apa yang masing-masing klien lakukan pada saat itu. Salah satu solusi untuk situasi ini adalah dengan meningkatkan MaxClients (tetapi itu mungkin juga berubah menjadi situasi di atas.) Solusi yang lebih baik untuk ini adalah dengan menginstal akselerator HTTP di depan apache (satu opsi bebas adalah perlbal.) Jika baris perintah Anda normal mempercepat ketika Anda me-restart apache, itu salah satu indikasi situasi ini.
sumber
Menggunakan mod_status adalah cara untuk melihat apa yang terjadi di dalam beberapa instance Apache tetapi harap dicatat bahwa itu benar-benar akan mengganggu kinerja. Tampaknya memakan memori dan dalam satu kasus saya tidak dapat mendiagnosis apakah itu penyebab penguncian proses tunggal dalam pengaturan hanya-proxy-saja di mana tidak ada yang dilayani secara langsung. Ini tentu saja dilaporkan oleh pengguna sebagai "dibutuhkan selamanya untuk memuat halaman". Mereka bahkan tidak mengerti perbedaan antara "menunggu 10 detik" dan "tidak akan pernah selesai" karena mereka biasanya menekan Stop di browser mereka setelah beberapa (<10) detik.
Juga periksa apakah Anda mengkonfigurasi tempat yang benar (mudah dilihat menggunakan mod_status karena Anda melihat jumlah instance / proses). Konfigurasi stok setidaknya di bawah ubuntu memiliki bagian ifdefed per mode MPM dan mudah untuk mengedit mode pekerja ketika Anda menjalankan prefork (seperti yang disarankan oleh kebijaksanaan konvensional dari perasaan kabur bahwa PHP bukan threadsafe).
Oh dan yang paling penting: Jalankan di atas sebagai root dan perhatikan sumber daya yang maksimal. Memori, disk, CPU - Anda akan melihat.
Satu lagi: Gagasan untuk menonaktifkan mod_deflate mungkin bagus meskipun pengaturan Anda tidak rentan terhadap kesalahan informasi Panjang Konten yang salah yang menyebabkan peramban menunggu data "selamanya" memberi Anda laporan "mati lambat" untuk "tidak merespons".
BTW: 10K halaman yang dikirim per hari ditambah file media pada mesin ini hanya akan menjadi masalah jika mereka semua mengunjungi dalam satu jam.
sumber
Beberapa saran, terutama jika Anda meng-host banyak file media:
sumber