2GB RAM E6500 CPU에서 하루 10K 이상의 워드 프레스보기를 위해 아파치를 최적화


10

우분투에 apache / php가있는 전용 서버가 하루에 약 10K + 페이지 뷰로 Wordpress 블로그를 제공합니다. APC에 W3TC 플러그가 설치되어 있습니다.

그러나 매번 서버가 응답을 멈추거나 느리게 돌아 가면 아파치를 다시 시작하여 다시 가져와야합니다.

여기 내 구성이 내가 뭘 잘못하고 있니?

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/

답변:


23

내 WordPress 성능 및 캐싱 스택

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

상자에서 시간당 10K 이상의 페이지 조회수를 제공 할 수 있습니다.

서버 스택

  • 리눅스-데비안 레니 또는 우분투
  • 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 가상 호스팅을 설정해야합니다. sites-available 디렉토리의 파일에 연결된 각 v 호스트 sym과 함께 sites-enabled 메소드를 사용하고 싶습니다.

$ 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/

대체 텍스트


nginx가 정적 파일을 처리하고 아파치가 PHP 파일을 처리한다고 언급하지만 정적 파일 블록에는 "proxy_pass wordpressapache ;"가 있습니다. 아파치가 정적 파일을 처리하고 있다는 의미는 아닙니까?
srchulo

0

HTML처럼 보이기 때문에 일부가 제거 된 것처럼 보이지만 표준 Apache 구성처럼 보입니다.

서버가 느리게 응답 할 때 발생하는 상황을 조사해야합니다. 서버의 사양을 말하지는 않지만 전용 및 10k / day를 쉽게 처리해야한다고 언급했습니다.

  • 상단은 무엇을 보여줍니까?
  • 병목 현상은 어디에 있습니까? CPU, 메모리, I / O 대기?
  • 몇 개의 Apache 프로세스가 실행되고 있습니까?
  • netstat에 몇 개의 연결이 표시됩니까?

추측하면 CPU는 아마도 PHP로 인한 병목 현상 일 것입니다. APC와 WP 캐싱 플러그인을 사용하면이 문제를 완화 할 수 있습니다. "Prefork"대신 Apache의 "MPM"프로세스 모델을 사용해 볼 수도 있습니다. PHP 스크립트를 캐시하고 '누락'하지 않도록 APC에 충분한 메모리가 할당되어 있는지 확인하십시오.

그것은 또한 MySQL 일 수 있습니다-그것이 CPU 나 디스크를 호깅하는지 확인하십시오.

활성화 된 경우 mod_deflate를 끄는 것이 좋습니다.로드 시간에 이점이 있지만 CPU로드가 증가 할 수 있습니다. 시도해 볼 가치가 있습니다.

'siege'또는 'ab'와 같은 도구를 사용하여 서버를 벤치마킹하고 서버가 느려지는 지점을 파악하십시오.

다음은 웹 서버 성능 조정의 책갈피 중 일부입니다. 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/

그러나 내 원래 조언은 동일하게 유지됩니다. 병목 현상이 무엇인지 먼저 확인하십시오! 그렇지 않으면 맹목적으로 성능을 향상 시키려고 노력하고 있으며 (성능을 향상시키는 것이 항상 좋습니다)주의를 집중해야 할 영역을 모릅니다.


0

또한 서버 상태 모듈을 활성화 한 후 방문하여 무슨 일이 일어나고 있는지 확인하십시오.

교환 할 수 있습니다. 이런 일이 발생하는 동안 vmstat를 체크 아웃 했습니까? 80 개의 MaxClient에 대한 2GB RAM은 각 상자 당 25MB에 불과합니다 (상자가 다른 작업을 수행하지 않는다고 가정). MaxClient가 너무 높을 수 있습니다. 이에 대한 해결책은 분명합니다. RAM을 더 추가하거나 MaxClient를 낮추십시오. 아파치를 다시 시작할 때 명령 행이 느리게 응답하는 경우이 상황이 표시됩니다.

또한 '큰'파일로 일부 모바일 클라이언트 (또는 느린 연결의 다른 클라이언트)에 숟가락을 공급하여 사용 가능한 모든 아파치 슬롯을 소비 할 수도 있습니다. MaxClient가 너무 적을 수 있습니다. 서버 상태를 확인하면 해당 클라이언트 각각이 당시에 수행 한 작업을 알 수 있습니다. 이 상황에 대한 한 가지 해결책은 MaxClients를 늘리는 것입니다 (그러나 위 상황으로 바뀔 수도 있습니다). 더 나은 해결책은 아파치 앞에 HTTP 가속기를 설치하는 것입니다 (하나의 무료 옵션은 perlbal입니다). 명령 행이 정상인 경우 아파치를 다시 시작할 때의 속도는이 상황을 나타냅니다.


0

mod_status를 사용 하면 여러 Apache 인스턴스에서 무슨 일이 일어나고 있는지 확인할 수 있지만 실제로 성능이 저하 될 수 있습니다. 메모리를 먹는 것처럼 보였으며 어떤 경우에는 직접 제공되지 않은 리버스 프록시 전용 설정에서 단일 프로세스 잠금의 원인인지 진단 할 수 없었습니다. 물론 이것은 사용자가 "페이지를로드하는 데 시간이 오래 걸린다"고보고합니다. 그들은 "10 초 이상 기다렸다"와 "완료되지 않을 것"의 차이를 이해하지 못합니다. 보통 몇 초 (<10) 초 후에 브라우저에서 중지를 누르기 때문입니다.

또한 올바른 장소를 구성하고 있는지 확인하십시오 (인스턴스 / 프로세스의 양이 표시되므로 mod_status를 사용하는 것이 쉽습니다). 적어도 우분투 아래의 스톡 구성에는 MPM 모드 당 ifdef'ed 섹션이 있으며 prefork를 실행할 때 작업자 모드를 쉽게 편집 할 수 있습니다 (PHP는 스레드 안전하지 않다는 퍼지 느낌에서 일반적인 지식으로 제 안됨).

아, 그리고 무엇보다도 : 실행 꼭대기 끝나가는 능숙에 대한 루트 및 시계 등. 메모리, 디스크, CPU-당신은 볼 수 있습니다.

한 가지 더 : mod_deflate를 비활성화하는 아이디어는 설정이 잘못된 Content-Length 정보의 오류가 발생하지 않아서 브라우저가 데이터를 "영원히"기다렸다가 "dead slow"에 대한 "response"가 표시되는 오류를 일으키지 않을 수 있습니다.

BTW : 하루에 10K 전달 된 페이지와이 시스템의 미디어 파일은 모두 한 시간 안에 방문하는 경우에만 문제가됩니다.


0

특히 많은 미디어 파일을 호스팅하는 경우 몇 가지 조언이 있습니다.

  • 미디어를 전용 Apache (또는 nginx) 인스턴스로 옮기십시오. PHP 나 모듈도없고 가능한 한 빨리 미디어를 제공하는 베어 http 서버 만 있습니다.
  • 캐시, 캐시, 캐시! 워드 프레스에서 수퍼 캐시 플러그인을 사용하십시오. 많은 도움이됩니다.
  • 헤더에서 아파치 구성을 확인하십시오. 이미지 및 기타 "안정적인"매체의 만료 시간이 먼 날짜로 설정되어 있고 클라이언트가 요청할 때 Apache가 HTTP 304 코드를 리턴하는지 확인하십시오.
  • mod_deflate를 활성화하십시오. 클라이언트의 성능이 저하 될 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.