使用Nginx緩存加速WordPress站點

轉載想註明文章出處: 使用Nginx緩存加速WordPress站點

博客開通以來,主要記錄學習和使用過程當中遇到的問題及解決方案。文章風格偏向自娛自樂,所以訪問量較少,一臺1核1G的vps足以支撐網站的正常運行。javascript

後來本站引入三個頁面,這三個頁面應該對有上外網需求的網友頗有幫助,也給本站帶來了很大的流量。本站用的WordPress程序,嘗試過安裝各類緩存插件(super cache, w3 total cache等)加速運行,可是低配的vps依然難以支持這麼大的訪問量。經過日誌能夠看到隨着訪問量的增長,php-fpm進程增多,Mysql的鏈接和線程增多,接着出現OOM,而後系統kill掉佔用內存最大的Mysql進程,因而網站進入503宕機模式。php

買更好的vps能解決訪問量大的問題,可是要花更多的錢。作爲一個技術宅,首先想到的固然是如何榨乾現有機器來支撐大流量。作過的嘗試包括切換到比WordPress性能更好的Ghost,參考:嘗試Ghost 。可是相對於WordPress,Ghost的生態遠沒有那麼成熟,最終放棄了。css

冥思苦想下,終極解決辦法是用Nginx緩存,最初的文章可參考:Nginx配置fastcgi cache。fastcgi_cache的好處是大部分用戶的請求不用後端php-fpm打交道,直接發送緩存的靜態頁面,速度上甩各類WordPress插件好幾條街!相比之下wordpress的各類插件還要執行php,也避免不了訪問數據庫,弱爆了!html

自從使用了nginx緩存,網站平穩運行,再也沒有出現過宕機的現象。同時vps的cpu和內存佔用率直線降低,再也無需擔憂vps的配置問題,感受再來10倍流量博客也撐得住!java

由於nginx穩如狗的體驗,因此如今對於博客類讀多寫少的產品都是強推nginx緩存(fastcgi緩存或者proxy緩存)。鑑於可能幫到一些網友,現貼出 /etc/nginx/nginx.conf 配置文件供網友參考(包含ssl設置和gzip部分):node

# 文件: /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';

    access_log  /var/log/nginx/access.log  main buffer=32k flush=30s;

    server_tokens       off;
    client_max_body_size 100m;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # ssl配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    ssl_stapling on; # Requires nginx >= 1.3.7
    ssl_stapling_verify on; # Requires nginx => 1.3.7
    add_header Strict-Transport-Security "max-age=63072000; preload";
    #add_header X-Frame-Options DENY;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # 請按照本身的需求更改
    fastcgi_cache_path /var/cache/nginx/tlanyan levels=1:2 keys_zone=tlanyan:10m inactive=30m use_temp_path=off; 
    fastcgi_cache_key $request_method$scheme$host$request_uri;
    # note: can also use HTTP headers to form the cache key, e.g.
    #fastcgi_cache_key $scheme$request_method$host$request_uri$http_x_custom_header;
    #fastcgi_cache_lock on;
    fastcgi_cache_use_stale error timeout invalid_header updating http_500;
    fastcgi_cache_valid 200 301 302 10h;
    fastcgi_cache_valid 404 10m;
    fastcgi_ignore_headers Expires Set-Cookie Vary;

    # gzip 配置
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_comp_level 7;
    gzip_types
        text/css
        text/plain
        text/javascript
        application/javascript
        application/json
        application/x-javascript
        application/xml
        application/xml+rss
        application/xhtml+xml
        application/x-font-ttf
        application/x-font-opentype
        application/vnd.ms-fontobject
        image/svg+xml
        image/x-icon
        application/rss+xml
        application/atom_xml
        image/jpeg
        image/gif
        image/png
        image/icon
        image/bmp
        image/jpg;
    gzip_vary on;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}

以及用於WordPress站點的網站配置文件(/etc/nginx/conf.d/tlanyan.conf):nginx

server {
    listen 80;
    listen [::]:80;
    server_name www.tlanyan.me tlanyan.me; # 請換成本身的域名
    rewrite ^(.*) https://$server_name$1 permanent;
}

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name www.tlanyan.me tlanyan.me; # 請換成本身的域名
    charset utf-8;
    ssl_certificate /etc/nginx/conf.d/tlanyan.pem;  # 請換成本身的證書和密鑰
    ssl_certificate_key /etc/nginx/conf.d/tlanyan.key;

    set $host_path "/var/www/tlanyan";  # 請改爲本身的路徑
    access_log  /var/log/nginx/tlanyan.access.log  main buffer=32k flush=30s;
    error_log /var/log/nginx/tlanyan.error.log;

    root   $host_path;

    # 緩存標記
    set $skip_cache 0;
    if ($query_string != "") {
        set $skip_cache 1;
    }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml") {
        set $skip_cache 1;
    }
    # 登陸用戶或發表評論者
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location = / {
        index  index.php index.html;
        try_files /index.php?$args /index.php?$args;
    }

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ ^/\.user\.ini {
            deny all;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_index index.php;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_cache tlanyan;
        fastcgi_cache_valid 200 301 302 30m;
        fastcgi_cache_valid 404 10m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache_lock on;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|jpeg)$ {
        expires max;
        access_log off;
        try_files $uri =404;
    }
}

上述配置對最新版的Nginx測試有效,詳細配置指令請參考Nginx官方文檔。sql

相關文章
相關標籤/搜索