搞定 WordPress 网站的 Nginx 配置,看这篇就够了!


嘿,各位站长朋友们!是不是觉得自己的 WordPress 网站有时候像“老牛拉破车”,慢吞吞的?别急,今天就带大家来一波 Nginx 的“骚操作”,给你的网站来一次全方位的性能大保健。本文会用最通俗易懂的大白话,带你一步步优化 Nginx 配置,让你的 WordPress 网站快到飞起!

为啥要折腾 Nginx?

咱们先来唠唠,为啥非得跟 Nginx 的配置文件过不去。简单来说,Nginx 就像是你网站的“保安”兼“接待员”,负责处理用户的各种请求。一个优秀的“保安”不仅能保证网站安全,还能高效地引导流量,让用户访问如丝般顺滑。而默认的 Nginx 配置,就像个刚上岗的“实习保安”,虽然能干活,但效率和安全性都差点意思。所以,咱们的目标就是把他培养成“金牌保安”!

基础篇:让 WordPress 在 Nginx 上跑起来

首先,咱们得确保 WordPress 能在 Nginx 上正常运行。一个最基础的 Nginx 配置文件大概长这样:

server {
    listen 80;
    server_name your_domain.com; # 把这里换成你的域名
    root /var/www/wordpress; # 你的 WordPress 网站根目录
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 注意检查你的 PHP-FPM 版本和路径
    }
}

代码解析:

  • listen 80;: 监听 80 端口,也就是处理 HTTP 请求。
  • server_name your_domain.com;: 绑定你的网站域名。
  • root /var/www/wordpress;: 指定你存放 WordPress 文件的根目录。
  • location / { ... }: 这个 location 块处理网站的所有常规请求。try_files 是个很关键的指令,它会依次尝试寻找用户请求的文件($uri)、目录($uri/),如果都找不到,就把请求交给 /index.php 来处理。这正是 WordPress 伪静态(Permalink)能正常工作的核心。
  • location ~ \.php$ { ... }: 这个 location 块使用正则表达式来匹配所有以 .php 结尾的请求。一旦匹配成功,Nginx 就会把这个请求转给 PHP-FPM(PHP FastCGI Process Manager)去处理,让 PHP 代码能够被执行。

案例:

小明的博客 xiaoming-blog.com 部署在 /var/www/wordpress 目录下,PHP 版本是 8.1。那么他只需要把 server_name 改成 xiaoming-blog.com,确认 fastcgi_pass 的路径正确,他的博客就能正常访问了。

进阶篇:性能优化,让网站“飞”起来

基础配置只是让网站跑起来,接下来才是重头戏——性能优化。

1. 开启 Gzip 压缩,给你的网站“瘦瘦身”

想象一下,你下载一个 10MB 的文件和下载一个被压缩到 2MB 的文件,哪个更快?答案显而易见。Gzip 就是这样一个神奇的工具,它能在服务器把网页内容发送给用户浏览器之前,先进行压缩,从而大大减少传输的数据量,加快网页加载速度。

代码示例:

在你的 nginx.conf 文件的 http 块中,或者在你的网站配置文件的 server 块中加入以下代码:

# 开启 Gzip
gzip on;

# 压缩级别,1-9,级别越高压缩率越高,但越消耗 CPU,6 是个体面的选择
gzip_comp_level 6;

# 告诉代理服务器也缓存 Gzip 压缩过的文件
gzip_vary on;

# 压缩的最小文件大小,小于这个大小的文件不会被压缩
gzip_min_length 256;

# 禁用 IE6 的 Gzip 功能,老古董浏览器可能会有兼容问题
gzip_disable "msie6";

# 指定需要被压缩的文件类型
gzip_types
    application/atom+xml
    application/geo+json
    application/javascript
    application/x-javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rdf+xml
    application/rss+xml
    application/vnd.ms-fontobject
    application/wasm
    application/x-font-ttf
    application/xml
    font/otf
    image/svg+xml
    text/css
    text/javascript
    text/plain
    text/xml;

代码解析:

  • gzip on;: Gzip 功能的总开关。
  • gzip_comp_level 6;: 设置压缩等级,这是一个在压缩率和 CPU 消耗之间的平衡点。
  • gzip_min_length 256;: 避免压缩过小的文件,因为压缩本身也有开销,得不偿失。
  • gzip_types ...;: 定义了哪些类型的文件需要被压缩,主要是文本类文件,如 HTML、CSS、JS 等。

案例:

小红的摄影网站,首页有很多 CSS 和 JS 文件,总大小达到了 1.5MB。开启 Gzip 压缩后,这些文件被压缩到了 400KB 左右,网站首页的加载速度肉眼可见地变快了。

2. 浏览器缓存,让回头客“秒开”网站

对于网站中的图片、CSS、JS 这些不经常变动的文件,我们完全可以让用户的浏览器“记住”它们。这样,用户第一次访问后,再访问你的网站时,就不用重新下载这些静态资源了,直接从本地缓存读取,速度自然快得惊人。

代码示例:

在你的网站配置文件的 server 块中加入:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|webp|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

代码解析:

  • location ~* \.(...)$: 这个 location 块匹配所有以上述静态文件后缀结尾的请求。
  • expires 30d;: 设置这些文件在用户浏览器中的缓存过期时间为 30 天。
  • add_header Cache-Control "public, no-transform";: 添加一个 HTTP 头部,告诉浏览器和中间的代理服务器,这个内容是公开的,可以被缓存。

案例:

小李的电商网站,商品图片和样式文件很多。设置了浏览器缓存后,老顾客反馈说现在网站“秒开”,用户体验大大提升。

3. FastCGI 缓存,给动态内容来点“兴奋剂”

WordPress 的页面是动态生成的,每次访问都需要 PHP 查询数据库,然后渲染成 HTML。这个过程其实挺耗资源的。FastCGI 缓存就是把这个最终生成的 HTML 页面缓存起来,在一段时间内,后续的相同请求直接返回缓存的页面,不再需要 PHP 和数据库的参与,极大地降低了服务器负载,提升响应速度。

代码示例:

首先,在 nginx.confhttp 块中定义缓存区域:

fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

然后,在你网站配置文件的 server 块中修改 location ~ \.php$ 部分:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;

    # 缓存设置
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m; # 对 200 状态码的请求缓存 60 分钟
    fastcgi_cache_use_stale error timeout updating http_500 http_503;
    fastcgi_cache_revalidate on;
    add_header X-FastCGI-Cache $upstream_cache_status; # 添加一个头部,方便调试缓存是否命中
}

代码解析:

  • fastcgi_cache_path ...: 定义了一个名为 WORDPRESS 的缓存区域,路径在 /var/run/nginx-cache,设置了内存中 key 的大小和磁盘上缓存文件的失效时间。
  • fastcgi_cache_key ...: 定义了缓存的 key,通常是请求的协议、方法、域名和 URI 的组合。
  • fastcgi_cache WORDPRESS;: 在 PHP 的 location 块中启用名为 WORDPRESS 的缓存。
  • fastcgi_cache_valid 200 60m;: 指定对返回状态码为 200 的请求缓存 60 分钟。
  • add_header X-FastCGI-Cache $upstream_cache_status;: 这个头部会在响应中显示缓存状态(HIT, MISS, BYPASS),非常适合用来检查缓存是否生效。

案例:

一个新闻门户网站,在发布重大新闻时流量激增,服务器不堪重负。开启 FastCGI 缓存后,绝大多数对新闻页面的请求都由缓存直接响应,服务器负载瞬间下降,平稳度过了流量高峰。

安全篇:加固防线,让网站固若金汤

性能上去了,安全也不能落下。Nginx 同样是我们的安全利器。

1. 禁止访问敏感文件

WordPress 的一些文件,比如 wp-config.php 包含了数据库连接信息,是绝对不能暴露给外界的。

代码示例:

location ~* /(?:wp-config\.php|xmlrpc\.php) {
    deny all;
}

location ~ /\.ht {
    deny all;
}

代码解析:

  • deny all;: 这条指令简单粗暴,直接拒绝所有对匹配路径的访问。我们用它来保护 wp-config.phpxmlrpc.php(如果你不用它的话),以及 Apache 的 .htaccess 文件。

2. 限制后台登录

wp-login.php 是黑客暴力破解的重灾区。我们可以限制只有特定的 IP 地址才能访问这个页面。

代码示例:

location = /wp-login.php {
    allow 1.2.3.4; # 你的 IP 地址
    allow 5.6.7.8; # 团队其他人的 IP 地址
    deny all;

    # 别忘了还是要处理 PHP
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}

代码解析:

  • allow 1.2.3.4;: 允许这个 IP 访问。
  • deny all;: 拒绝其他所有 IP 的访问。

3. 禁止在上传目录执行 PHP 脚本

黑客常常会想办法在上传目录(/wp-content/uploads/)里上传恶意的 PHP 脚本并执行。我们必须杜绝这种可能。

代码示例:

location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}

代码解析:

  • 这条规则匹配了 uploads 目录下的所有 PHP 文件,并禁止了对它们的访问,从而防止了恶意脚本的执行。

总结

优化 Nginx 配置是一个持续的过程,但以上这些配置已经能让你的 WordPress 网站在性能和安全上有一个质的飞跃。记住,每次修改完配置文件后,一定要先用 nginx -t 命令检查语法是否正确,然后再用 systemctl reload nginx 来平滑地加载新配置。

希望这篇通俗易懂的指南能帮助你打造一个更快、更安全的 WordPress 网站。快去动手试试吧!


  目录