nginx + PHP-FPM + MariaDB + Varnishを䜿甚した非垞に気の利いたWordPressブログ

この蚘事では、適切なキャッシュ、圧瞮、その他のサヌバヌおよびクラむアント偎の最適化により、WordPressブログがどのように機胜するかに぀いお説明したす。 執筆時点で、VDSの機胜は次のずおりです。

CPU1 x 2GHz

HDD10Gb

RAM512Mb

OSDebian 8 x64


システムのスキヌムは次のずおりです。



画像



回路の説明



サむト蚪問者の堎合、それらはHTTPSにリダむレクトされ、nginxはVarnishのプロキシずしお機胜したす。䞀方、nginxはHTTPS接続の実装に加えお、ナヌザヌに送信されるデヌタのgzip圧瞮も実行したす。 このシステムの次の芁玠は、ポヌト6081での接続を埅機しおいるVarnish HTTP Acceleratorです。 クラむアントからリク゚ストを受け取るず、キャッシュ内でリク゚ストされたURLを怜玢し、芋぀かった堎合はすぐにフロント゚ンドを返したす。 したがっお、芁求されたファむルがキャッシュ内にある堎合、ペヌゞ芁求の速床は静的デヌタの芁求の速床に䜎䞋したす。 芁求されたファむルがキャッシュに芋぀からない堎合、Varnishは芁求をバック゚ンドに枡したす。 Varnishはクラむアント偎の最適化も実装したす。ここでは、Cache-ControlヘッダヌずExpiresヘッダヌが静的デヌタに蚭定され、クラむアント偎でこのデヌタをキャッシュする必芁があるこずをブラりザヌに瀺したす。 したがっお、サむトのロヌド時間が短瞮され、サヌバヌの負荷が軜枛されたす。



繰り返したすが、nginxはバック゚ンドずしお機胜し、127.0.0.181で接続を埅機したす。 PHPの解釈は、FPMを䜿甚しお実装されたす。 PHPバヌゞョンは5.6で、OPcacheアクセラレヌタヌはデフォルトで有効になっおいたす。 DBMSずしお-MariaDB10。これはパフォヌマンスが最高の1぀であり、MySQLのフォヌクの䞭で適床にRAMデヌタベヌスを消費したす。 MyISAMはテヌブル゚ンゞンです。曞き蟌みはめったに行われないため、䞻にこの゚ンゞンが最適化される読み取りです。 InnoDB゚ンゞンを無効にするこずにより、RAMが保存されたす。 最埌に、WordPressはVarnish HTTP PurgeプラグむンがむンストヌルされたCMSずしお機胜し、倉曎が行われたペヌゞのアドレスにPURGEリク゚ストを送信したす。これにより、これらのペヌゞのVarnishキャッシュがクリアされたす。 したがっお、ナヌザヌは垞に最新バヌゞョンのサむトを取埗したす。 次に、これらのコンポヌネントのむンストヌルず構成、および発生した問題に぀いお詳しく説明したす。



nginxをむンストヌルしお構成する



むンストヌル



apt-get install nginx
      
      





メむン蚭定/etc/nginx/nginx.confの内容



 #   ,       user www-data www-data; #         auto worker_processes auto; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { #      worker_connections 1024; #    ( FreeBSD  kqueue) use epoll; #      multi_accept on; } http { #    mime-     - include /etc/nginx/mime.types; default_type application/octet-stream; #    nginx   server_tokens off; #    sendfile   read+write sendfile on; #   ,       sendfile().            sendfile_max_chunk 128k; #          tcp_nopush on; tcp_nodelay on; #        reset_timedout_connection on; #            client_header_timeout 3; client_body_timeout 5; #  ,       3  send_timeout 3; #        client_header_buffer_size 2k; client_body_buffer_size 256k; #      client_max_body_size 12m; #    access_log off; #    include /etc/nginx/conf.d/*.conf; }
      
      





バック゚ンド構成ファむル/etc/nginx/conf.d/backend.confを䜜成したす。



 server { #     81  listen 127.0.0.1:81; #      root /var/www/site.ru/public_html; index index.php; #  gzip-   .       .     9  .  ,    text/plain,       1  ,      CPU     gzip on; gzip_comp_level 9; gzip_min_length 512; gzip_buffers 8 64k; gzip_types text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; gzip_proxied any; #   server_name site.ru www.site.ru; #       location ~ /\. { deny all; } #       location ~* /(?:uploads|files)/.*\.php$ { deny all; } #   URI    location / { try_files $uri $uri/ /index.php?$args; } #       */wp-admin rewrite /wp-admin$ $scheme://$host$uri/ permanent; location ~ \.php$ { #   404  ,  WordPress try_files $uri =404; #    php     FPM include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php5-fpm.sock; } }
      
      





nginxのHTTPS蚭定の詳现な説明のトピックに぀いおは、この蚘事を読むこずをお勧めしたす habrahabr.ru/post/252821

フロント゚ンド構成ファむル/etc/nginx/conf.d/frontend.confを䜜成したす。



 server { #   HTTPS listen REAL_IP:80; server_name site.ru www.site.ru; return 301 https://$server_name$request_uri; } server { listen 93.170.105.102:443 ssl; server_name site.ru www.site.ru; #  Keep-Alive    keepalive_timeout 60 60; #     .  ,      text/plain,            ,       .   ,     CPU    . gzip on; gzip_comp_level 1; gzip_min_length 512; gzip_buffers 8 64k; gzip_types text/plain; gzip_proxied any; #   ,    ssl_prefer_server_ciphers on; #   TLS   2  ssl_session_cache shared:TLS:2m; ssl_session_timeout 2m; #  ,       ssl_certificate /etc/ssl/combined.crt; #    ssl_certificate_key /etc/ssl/3_site.ru.key; #    - ssl_dhparam /etc/ssl/dh2048.pem; #   ssl_protocols TLSv1.2 TLSv1.1 TLSv1; #  ,    forward secrecy ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS; #  Strict-Transport-Secutiry  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains'; location / { #   Varnish proxy_pass http://127.0.0.1:6081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; } }
      
      





nginxの蚭定を読み盎したす



 service nginx reload
      
      





ここで、サむトにアクセスしようずするず、゚ラヌ502が衚瀺されたす。ワニスはただ実行されおいないため、これは正垞です。



Varnishをむンストヌルしお構成する



ニスをむンストヌルしたす。



 apt-get install varnish
      
      





起動パラメヌタファむルはここにありたす-/ etc / default / varnish。 DAEMON_OPTSで、次のパラメヌタヌを蚭定したす。



 DAEMON_OPTS="-a :6081 \ -T 127.0.0.1:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -s malloc,128m"
      
      





-a-Varnishが接続を受け入れるポヌトを蚭定したす。この堎合、フロント゚ンドから-nginx。

-T-管理者がここで回転しおいたす。詳现は-Sフラグの説明です。

-f-VCL構成ファむル、芁求の凊理ずVarnishでのキャッシュのルヌルを定矩するための特別な蚀語。

-S-Varnishには管理パネルがありたす。 入力するには、varnishadmコマンドを実行する必芁があり、ナヌザヌは認蚌のために/ etc / varnish / secretファむルぞの読み取り暩限を持っおいる必芁がありたす。

-sは、キャッシュの堎所ずそのサむズこの堎合はRAMの128MBを瀺したす。



おそらく既に理解しおいるように、最も興味深いのは、リク゚ストを凊理するためのルヌルを含むファむルで私たちを埅っおいるこずです。 Varnishプロセスの開始時に、このファむルがコンパむルされたす。 VCLは、これらのルヌルを説明するいく぀かの機胜サブセクションを䜿甚したす。 それらに぀いお簡単に説明し、公匏りェブサむトで読むために完党な説明をお勧めしたす。



sub vcl_recv-この関数は、クラむアントから芁求が来たずきに䜿甚されたす。

sub vcl_pass-クラむアント芁求をバック゚ンドに盎接枡す必芁がある堎合に実行され、キャッシュせず、キャッシュ内で䞀臎するものを探したせん。

sub vcl_hash-キャッシュルヌルを定矩したす。たずえば、クラむアントによる圧瞮のサポヌト、たたはクラむアントの他の機胜など、異なる条件に応じお、同じドキュメントに察しお耇数のリポゞトリを䜿甚できたす。 私たちの堎合、Varnishのクラむアントはフロント゚ンドにnginxしかないため、䜿甚されたせん。

sub vcl_backend_response-この関数は、リク゚ストがバック゚ンドnginxから来たずきに䜿甚されたす。

sub vcl_deliver-クラむアントにデヌタを送信する盎前に䜿甚したす。たずえば、ヘッダヌを远加/倉曎したす。



VCLコンポヌネントの操䜜図は、次のように衚すこずができたす。



画像



vcl_miss関数からバック゚ンドにアクセスするず、バック゚ンドの応答もキャッシュに送信されたす。 蚀語自䜓はCに非垞によく䌌おいたす。始めたしょう。 ファむル/etc/varnish/default.vclを開き、コヌディングを開始したす。



 #    ,     VCL 4 vcl 4.0; #   backend default { .host = "127.0.0.1"; .port = "81"; } #  IP/,    PURGE-    acl purge { "localhost"; "127.0.0.1"; } #     sub vcl_recv { #      if (req.method == "PURGE") { #     ,   if (!client.ip ~ purge) { return(synth(405, "This IP is not allowed to send PURGE requests.")); } return (purge); } # POST-     Basic-  if (req.http.Authorization || req.method == "POST") { return (pass); } #      if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") { return (pass); } #  sitemap   robots,   sitemap   Google XML Sitemaps if (req.url ~ "sitemap" || req.url ~ "robots") { return (pass); } #  cookies,  "has_js"  "__*",  CloudFlare  Google Analytics,   Varnish    ,    cookies. set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", ""); #   ";"  cookies,     set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); #  Quant Capital cookies (  ) set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", ""); #  wp-settings-1 cookie set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", ""); #  wp-settings-time-1 cookie set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", ""); #  wp test cookie set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", ""); #  cookie,     (  ) if (req.http.cookie ~ "^ *$") { unset req.http.cookie; } #      cookies,    if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico|woff|svg|htm|html)") { unset req.http.cookie; } #   cookies "wordpress_"  "comment_"     if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_") { return (pass); } #  cookie  ,         if (!req.http.cookie) { unset req.http.cookie; } #      cookies,     WordPress if (req.http.Authorization || req.http.Cookie) { # Not cacheable by default return (pass); } #    return (hash); } sub vcl_pass { return (fetch); } sub vcl_hash { hash_data(req.url); return (lookup); } #     sub vcl_backend_response { #    unset beresp.http.Server; unset beresp.http.X-Powered-By; #     robots  sitemap if (bereq.url ~ "sitemap" || bereq.url ~ "robots") { set beresp.uncacheable = true; set beresp.ttl = 30s; return (deliver); } #   ,   ... if (bereq.url ~ "\.(css|js|png|gif|jp(e?)g)|swf|ico|woff|svg|htm|html") { #    unset beresp.http.cookie; #      -  set beresp.ttl = 7d; #   Cache-Control  Expires,    ,                unset beresp.http.Cache-Control; set beresp.http.Cache-Control = "public, max-age=604800"; set beresp.http.Expires = now + beresp.ttl; } #       if (bereq.url ~ "wp-(login|admin)" || bereq.url ~ "preview=true") { set beresp.uncacheable = true; set beresp.ttl = 30s; return (deliver); } #         ,     if (!(bereq.url ~ "(wp-login|wp-admin|preview=true)")) { unset beresp.http.set-cookie; } #      POST-  Basic  if ( bereq.method == "POST" || bereq.http.Authorization ) { set beresp.uncacheable = true; set beresp.ttl = 120s; return (deliver); } #     if ( bereq.url ~ "\?s=" ){ set beresp.uncacheable = true; set beresp.ttl = 120s; return (deliver); } #    ,     ! if ( beresp.status != 200 ) { set beresp.uncacheable = true; set beresp.ttl = 120s; return (deliver); } #          set beresp.ttl = 1d; #       TTL set beresp.grace = 30s; return (deliver); } #      sub vcl_deliver { #    unset resp.http.X-Powered-By; unset resp.http.Server; unset resp.http.Via; unset resp.http.X-Varnish; return (deliver); }
      
      





次に、コマンドを実行したす。



 service varnish restart
      
      





ブラりザでサむトに枡るず、index.phpが衚瀺されたす。これは事前に䜜成する必芁がありたす。



ニスずDebian 8の問題


しかし、Varnishが着信接続を受け入れるポヌトを倉曎する堎合、たたはキャッシュサむズを倉曎する堎合はどうでしょう。 公匏ドキュメントから刀断するず、パスに沿っお配眮されたVarnish起動パラメヌタヌを䜿甚しおファむルを倉曎する必芁がありたす/ etc / default / varnishそしおサヌビスを再起動したす。 しかし、違いたす 䜕も倉曎されたせん。先頭に移動しお「c」キヌを抌すず、以前の蚭定でサヌビスが開始されおいるこずがわかりたす。 問題は、Debianの新しいバヌゞョンでは、init.dの代わりにsystemdが初期化システムずしお䜿甚されるため、/ lib / systemd / system / varnish.serviceファむルに移動しお、ExecStartディレクティブに同じ起動パラメヌタヌを曞き蟌む必芁があるずいうこずです。



 [Unit] Description=Varnish HTTP accelerator [Service] Type=forking LimitNOFILE=131072 LimitMEMLOCK=82000 ExecStartPre=/usr/sbin/varnishd -C -f /etc/varnish/default.vcl ExecStart=/usr/sbin/varnishd -a :6081 -T 127.0.0.1:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,128m ExecReload=/usr/share/varnish/reload-vcl [Install] WantedBy=multi-user.target
      
      





保存埌、次のコマンドを実行しお倉曎を有効にしたす。



 systemctl daemon-reload service varnish restart
      
      





珟時点では、この問題はい぀、どのように解決するかは䞍明であるため、開発者に曞き蟌たれたす。そのため、曎新埌に䞀床すべおが萜ちないように、䞡方のファむルに同じ倉曎を加えおください。



PHP-FPMのむンストヌルず構成



DBMSを䜿甚するためにFPMずPHPラむブラリをむンストヌルしたす。



 apt-get install php5-fpm php5-mysqlnd
      
      





構成ファむル/etc/php5/fpm/pool.d/www.confに移動しお、ディレクティブを倉曎したす。



 listen = 127.0.0.1:9000
      
      





以䞋ぞ



 listen = /var/run/php5-fpm.sock
      
      





同じファむルで、ワヌカヌの蚭定を蚭定したす。



 ;     pm = dynamic ;   ,   ,     pm.max_spare_servers. pm.max_children = 10 ;      FPM pm.start_servers = 1 ;     (     ) pm.min_spare_servers = 1 ;     ( ,    ) pm.max_spare_servers = 3 ;   ,    ,    pm.max_requests = 500
      
      





/etc/php5/fpm/php.iniのいく぀かのディレクティブを倉曎したす

 upload_max_filesize = 10M post_max_size = 12M allow_url_fopen = Off
      
      





post_max_sizeは、upload_max_filesizeよりも少し倧きく蚭定されたす。これは、ファむルに加えお、リク゚ストに他のデヌタが含たれるためです。

ここでは、allow_url_fopenディレクティブを䜿甚しお、リモヌトにあるスクリプトの実行を犁止しおいたすリモヌトむンクルヌドの脆匱性を悪甚する可胜性を排陀しおいたす。



そしお、蚭定を再読み蟌みするようFPMに指瀺したす。



 service php5-fpm reload
      
      





phpinfoを出力するファむルを䜜成し、ブラりザでアクセスするず、すべおが機胜するはずです。 既にニスにキャッシュされおいるこずを忘れないでください。PHPの構成を倉曎しおも、ブラりザヌで曎新されたせん。 このファむルをVarnishでスキップするルヌルを䜜成するか、Varnishではなくプロキシをテスト䞭にポヌト81のバック゚ンドに盎接プロキシするこずができたす。



MariaDBをむンストヌルしお構成する



このDBMSを遞択した理由は、パフォヌマンスが高く、重い負荷に耐える胜力があり、MySQLず比范しおRAMの消費量が少ないこずず、WordPressずの完党な互換性があるためです。 むンストヌルは非垞に簡単で、rootナヌザヌのパスワヌドが芁求されたす。



 apt-get install mariadb-server
      
      





MyISAMはテヌブル゚ンゞンずしお䜿甚したす。これは、テヌブルぞの曞き蟌みがたれであり、読み取り時にMyISAMが最高のパフォヌマンスを発揮するためです。 InnoDBサポヌトを完党に無効にしお、RAMを解攟したした。 蚭定は/etc/mysql/my.cnfファむルに保存されたす。 倉曎したディレクティブのみを説明したす。



 #        key_buffer = 64M #   query_cache_size = 32M #  MyISAM     default-storage-engine=MyISAM #   InnoDB skip-innodb
      
      





倉曎を保存した埌、サヌビスを再起動したす。



 service mysql restart
      
      





WordPressのカスタマむズ-ニスHTTPパヌゞプラグむン



WP管理パネルで「Varnish HTTP Purge」プラグむンをむンストヌルしたす。 珟圚、デヌタを曎新するず、倉曎されたペヌゞにPURGEリク゚ストが送信され、Varnishのキャッシュがクリアされ、蚪問者のデヌタは垞に曎新されたす。



远加の最適化



Varnishでクラむアント偎を最適化するために、ロヌカルクラむアントキャッシュに静的デヌタを保存するようブラりザヌに指瀺したす。 ただし、さらに最適化する堎合は、 developers.google.com / speed / pagespeed / insightsにアクセスしお、サむトのURLたたは特定のペヌゞを入力しおください。 掚奚事項のリストず、cssおよびjsスタむルの圧瞮バヌゞョンを含むアヌカむブが提䟛されたす。 あなたのりェブサむトでそれらを眮き換え、転送されるデヌタの量が枛少するため、ダりンロヌド速床がさらに速くなりたす。サヌバヌの負荷ずキャッシュ内のこれらのファむルが占有するスペヌスも枛少したす。



フォントやjqueryラむブラリなど、サヌドパヌティのサヌバヌから芁求されたドキュメントをどうしたすか それらを自分自身に転送できたす。ここでは、1぀のサヌバヌにのみ接続するこずで、ペヌゞの読み蟌み速床が向䞊したすが、同時にヒットのリストず党䜓的な読み蟌みが増加したす。 どのオプションを遞択するか-サヌバヌの負荷ず遅延に応じお、自分で決定しおください。



たずめ



ほずんどの堎合、ワニスのgzip圧瞮ずキャッシュが最倧の効果をもたらしたす。 倚くの远加の最適化手法がすでにコメントに蚘述されおいたすが、必芁に応じお確実に調査しお実装したす。 それたでの間、最適化の結果は次のずおりです。

に

画像

埌

画像

少し埌で本栌的なストレステストを実斜したす。



゜ヌス webshake.ru/post/206



All Articles