비공유 호스팅에서 WordPress 멀티 사이트에 가장 적합한 캐싱 옵션은 무엇입니까?


13

어떤 캐싱 플러그인 구성을 권장하며 다음 가정하에 이유는 무엇입니까?

  • 서버 구성의 모든 권한
  • 다중 사이트 / 다중 도메인 모드에서 WordPress 실행
  • 대부분의 도메인은 www.접두사 (쿠키)를 사용하지 않습니다
  • 캐싱이 필요없는 사이트를 변경할 때 특정 IP에 대한 캐싱을 비활성화하거나 쿠키를 기반으로 캐싱을 비활성화 할 수 있습니다.

세부 정보 : Firefox Google Page Speed ​​플러그인을 사용하여 웹 사이트의 속도를 최적화하려고합니다.

또한 작은 이미지와 같은 일반적인 지침을 따르지 마십시오.

공정하게합시다. 둘 이상의 캐싱 플러그인을 사용하면 해결하는 것보다 더 많은 문제가 발생하므로 간단한 접근 방식을 시도하십시오.

답변:


4

"what plugin"에 대한 기본 답변은 W3 Total Cache 일 것입니다 . 현재 가장 기능적이고 적극적으로 개발 된 플러그인 중 하나입니다. 그러나 완전한 성능 체인은 WordPress 플러그인만으로 처리 할 수있는 시간보다 훨씬 깁니다.

  1. 웹 서버 (Apache 또는 다른 것) 구성 (응답 시간, 첫 바이트 시간, 헤더)
  2. 데이터베이스 (쿼리 처리에 소요 된 시간)
  3. PHP / WordPress (페이지 생성 시간, 메모리 소비).
  4. 프론트 엔드 성능 (HTTP 요청 량, 대역폭)

좋은 시작은 APC 와 같은 opcode 메모리 기반 캐시를 사용하는 정적 캐싱 플러그인 (예 : W3)입니다 .

그러나 컨텐츠 분배 네트워크, 대체 웹 서버 등과 같이 더 많은 (그리고 더 복잡한) 작업이 가능합니다.


wp가 가장 빠른 캐시 는 객체 캐시가 없어도 총 캐시 3 개를 능가합니다.
Ярослав Рахматуллин

19

내 WordPress 성능 및 캐싱 스택

이것은 중저역 단일 서버 또는 VPS에 가장 적합한 WordPress 성능 스택입니다. 나는 약 1G의 메모리와 상당히 빠른 드라이브로 미드 레인지를 단일 코어로 분류하고 있습니다.

서버 스택

  • 리눅스-데비안 레니 또는 우분투
  • Nginx-리버스 프록시 정적 파일 캐시로 구성
  • Apache-Apache는 대체 포트에서 Nginx가 오프로드 한 PHP를 처리합니다.
  • MySql-WP에 필요합니다. 최신 안정 버전을 실행하십시오.
  • PHP-최신 안정 버전 5.2 또는 5.3 분기

PHP 캐시

  • APC-mmap 메모리 및 최소 128M의 shm 크기로 구성

워드 프레스 성능 플러그인 스택

  • Nginx 프록시 캐시 통합 기
  • W3 Total Cache-페이지 캐시를 디스크 향상, 디스크로 축소, 개체 및 db를 APC로 설정
    • 자체 호스팅 CDN-정적 파일을 제공하도록 설정된 서버에서 도메인을 가리키는 4 개의 cname 별명 작성

W3 Total Cache에서는 Nginx가 정적 파일을 매우 빠르게 제공하기 때문에 페이지 캐시에 디스크를 사용하고 축소합니다.

정적 파일을 제공하고 PHP를 Apache로 전달하도록 Nginx를 구성하는 방법

Apache 만 사용하는 경우의 문제점은 연결을 열고 정적 파일에 대한 모든 요청에서 PHP를 공격한다는 것입니다. 아파치는 연결 상태를 유지하고 많은 트래픽이 발생하면 연결을 사용하지 않더라도 연결이 끊어지기 때문에 연결이 낭비됩니다.

기본적으로 Apache는 기본 웹 포트 인 포트 80에서 요청을 청취합니다. 먼저 포트 8080에서 수신 대기하도록 Apache conf 및 가상 호스트 파일을 변경합니다.

아파치 설정

httpd.conf

KeepAlive를 해제로 설정

ports.conf

NameVirtualHost *:8080
Listen 8080

사이트 당 가상 호스트

<VirtualHost 127.0.0.1:8080>
     ServerAdmin info@yoursite.com
     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>

또한 로그에 방문자의 실제 IP 주소가 포함되도록 mod_rpaf 를 설치해야 합니다. 그렇지 않으면 로그는 원래 IP 주소로 127.0.0.1이됩니다.

Nginx 구성

데비안에서는 리포지토리를 사용하여 설치할 수 있지만 버전 0.6.33 만 포함되어 있습니다. 이후 버전을 설치하려면 lenny 백 포트 패키지를 추가해야합니다

$ nano /etc/apt/sources.list

이 줄을 파일에 추가 deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

파일에 다음을 추가하십시오.

Package: nginx
Pin: release a=lenny-backports 
Pin-Priority: 999

다음 명령을 실행하여 backports.org에서 키를 가져 와서 패키지를 확인하고 시스템의 패키지 데이터베이스를 업데이트하십시오.

$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update

이제 apt-get으로 설치하십시오.

apt-get install nginx

소스에서 컴파일하는 것보다 훨씬 쉽습니다.

Nginx conf 및 서버 파일 설정

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/*;
}

이제 Nginx 가상 호스팅을 설정해야합니다. 사이트 사용 가능 디렉토리의 파일에 연결된 각 v 호스트 sym과 함께 사이트 사용 방법을 사용하고 싶습니다.

$ 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

노트 :

다음 파일의 정적 캐시 설정은 Nginx 프록시 캐시 통합 기 플러그인이 활성화 된 경우에만 작동합니다.

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;
}

워드 프레스 사이트 conf 당 (여러 사이트의 경우 하나의 가상 호스트 만 필요)

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;
        }

        }

자체 호스팅 CDN conf

자체 호스팅 CDN conf의 경우 프록시 패스없이 정적 파일을 제공하도록 설정하기 만하면됩니다.

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;
        }

    }

이제 서버를 시작하십시오

$ /etc/init.d/apache2 restart  
$/etc/init.d/nginx start

벤치 마크 결과

Apache Bench에서이 설정은 이론적으로 초당 1833.56 요청을 처리 할 수 ​​있습니다.

$ ab -n 1000 -c 20 http://yoursite.com/

대체 텍스트


1
+ 와우, 이것은 인상적이지만 지금은 서버 설정을 너무 복잡하게 만들기 때문에 nginx 설정을 건너 뛰는 것을 선호합니다.
sorin

VPS 호스팅에 대한 지침을 따르고 싶지만 문제가 발생할 경우 문제가 생길 경우 두렵습니다. 이전에 수행하지 않았습니다.
user391

1
감사. 정말 유용합니다. 나는 이것을 시도 할 것입니다. 나는 이것을 한 번 이상 수정할 수 있기를 바란다 :)
Nasir

4

멀티 사이트에 최소 64MB Ram의 웹 공간을 사용하고 Apache에서 APC 및 Memcached를 사용하십시오. 캐시는 정적이지 않으므로 모든 WP 기능을 문제없이 사용할 수 있습니다. PageSpeed를 통해 스캔하면 다른 옵션도 읽을 수 있으며 테마에 코딩되어 있습니다. 캐시는 훌륭한 작업을 수행 할 수 있지만 나쁜 테마 나 플러그인은 복구 할 수 없습니다. 또 다른 해결책은 쿠키없이 하위 도메인을 WordPress에서 CDN으로 사용하는 것입니다. 하위 도메인이 아닌 도메인의 쿠키에 대해서만 wp-config.php에 추가하십시오.

define( 'COOKIE_DOMAIN', 'example.com' );

이제 테마의 functions.php에서 새 함수를 설정하거나 경로 형식 정적 컨텐츠를 서브 도메인 인 사용자 정의 CDN으로 바꾸는 플러그인을 작성하십시오.

// replace for CDN on bloginfo
if ( !function_exists('fb_add_static_wpurl') ) {
    function fb_add_static_wpurl($info, $show) {

        if ( is_admin() )
            return $info;

        $keys = array(
            'url',
            'wpurl',
            'stylesheet_url',
            'stylesheet_directory',
            'template_url',
            'template_directory',
            );

        if ( in_array( $show, $keys ) ) {

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );

            return str_replace( $search, $replace, $info );

        } else {
            return $info;
        }
    }
    add_filter( 'bloginfo_url', 'fb_add_static_wpurl', 9999, 2 );
}

이제 템플릿 및 스타일 시트 경로에 대한 함수

function fb_add_static_stylesheet_uri($uri) {

            if ( is_admin() )
                return $uri;

            $wpurl = get_bloginfo('wpurl');

            $search = array(
                $wpurl . '/wp-content/images/',
                $wpurl . '/wp-content/download/',
                $wpurl . '/wp-content/themes/',
                $wpurl . '/wp-content/plugins/',
            );

            $replace = array(
                'http://cdn1.example.com/',
                'http://cdn2.example.com/',
                'http://cdn3.example.com/',
                'http://cdn4.example.com/',
            );
            return str_replace( $search, $replace, $uri );

}
add_filter ( 'template_directory_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_uri', 'fb_add_static_stylesheet_uri' );
add_filter ( 'stylesheet_directory_uri', 'fb_add_static_stylesheet_uri' );

이제 쿠키없이 프론트 엔드 정적 CDN URL에서 Page Speed를 읽으십시오.

또한 중복 콘텐츠 차단을 위해 .htaccess에 다음 소스를 추가하십시오.

##
# Explicitly send a 404 header if a file on cdn[0-9].example.org is not
# found. This will prevent the start page (empty URL) from being loaded.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* - [R=404,L]

##
# Do not dispatch dynamic resources via cdn[0-9].example.org.
##
RewriteCond %{HTTP_HOST} ^cdn[0-9]\.example\.org [NC]
RewriteCond %{REQUEST_FILENAME} \.(php|html)$
RewriteRule .* - [R=404,L]

함수를 사용하십시오. 또한 예제이며 내 아이디어로 솔루션을 작성할 수 있습니다.


0

웹 서버 스택

기본적으로 모든 작업을 메모리에 보관하십시오!

  • 최신 CPU, WordPress로 높은 메모리 대역폭은 주로 메모리 복사, msec 미만의 디스크 액세스 시간이며 UpCloud를 사용해보십시오!
  • 씬 가상화 레이어, UpCloud를 사용해보십시오! 기업이 아닌 인기있는 공급 업체로부터 멀리하십시오.
  • 빠른 운영 체제 : 시스템 없음, 충분한 엔트로피, IRQ 균형, 낮은 메모리 사용
  • 망치 공격자 차단 : Fail2ban, 섀도우 네트를 영구적으로 차단
  • 애니 캐스트 DNS
  • 빠른 웹 서버 : Apache Event MPM
  • RAM과 비슷한 속도의 병렬 연결 CDN (Amazon CloudFront)
  • 고속 SSL : ECDSA 인증서, 엔트로피 소스, TLS1.2, AES-NI 암호 모음, SSL 세션 캐시, OCSP 스테이플 링, HTTP / 2
  • FastCGI를 통해 연결된 OPcache가있는 최신 PHP
  • 린 워드 프레스 설치 : 최소한의 감사 된 플러그인 만
  • Redis 메모리 내 오브젝트 캐시
  • TokuDB (프랙탈 트리) MariaDB 엔진
  • 자원 최적화
  • 자바 스크립트 차단
  • 지속적인 모니터링 : Pingdom, HetrixTools

내 모든 지식은 오픈 소스입니다 https://github.com/szepeviktor/debian-server-tools

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.