Optimalkan apache untuk tampilan 10K + wordpress sehari pada 2GB RAM E6500 CPU

10

Saya memiliki server khusus dengan apache / php di ubuntu yang melayani blog Wordpress saya dengan sekitar 10K + tampilan halaman sehari. Saya memiliki plug W3TC diinstal dengan APC.

Tetapi setiap sekarang dan kemudian server berhenti merespons atau mati lambat dan saya harus me-restart apache untuk mendapatkannya kembali.

Inilah konfigurasi saya, apa yang saya lakukan salah?

ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile ${APACHE_PID_FILE}
TimeOut 40
KeepAlive on
MaxKeepAliveRequests 200
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 8
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild 1000
</IfModule>
<IfModule mpm_worker_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
<IfModule mpm_event_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>
DefaultType text/plain
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel error
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
Include /etc/apache2/conf.d/
Include /etc/apache2/sites-enabled/
Patah artis
sumber

Jawaban:

23

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/

teks alternatif

Chris_O
sumber
Anda menyebutkan memiliki nginx menangani file statis dan apache menangani file php, tetapi dalam blok file statis Anda memiliki "proxy_pass wordpressapache ;". Bukankah itu berarti apache menangani file statis?
srchulo
0

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.

  • Apa yang ditampilkan atas?
  • Di mana hambatannya? CPU, Memori, I / O Tunggu?
  • Berapa banyak proses Apache yang berjalan?
  • Berapa banyak koneksi yang ditampilkan di netstat?

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.

Rafiq Maniar
sumber
0

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.

terguling
sumber
0

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.

Paul
sumber
0

Beberapa saran, terutama jika Anda meng-host banyak file media:

  • Pindahkan media Anda ke instance Apache khusus (atau lebih baik: nginx). Tidak ada PHP, tidak ada modul, hanya server http telanjang yang akan mengirimkan media secepat mungkin.
  • Tembolok, tembolok, tembolok! Gunakan plugin super cache di wordpress. Ini sangat membantu.
  • Periksa konfigurasi apache Anda di header. Verifikasi bahwa gambar & media "stabil" lainnya memiliki waktu kedaluwarsa yang ditetapkan ke tanggal yang jauh & bahwa apache Anda mengembalikan kode HTTP 304 ketika diminta oleh klien
  • Aktifkan mod_deflate. Mungkin mengurangi kinerja oleh klien akan lebih cepat dilayani.
Pierre-Yves Gillier
sumber