Nginx配置优化:让博客访问速度快到飞起的实战指南
说个真事儿。我一朋友博客用的是1核1G的垃圾小鸡配置,按理说应该卡成PPT。但他的博客打开只要0.8秒,PageSpeed评分常年在90分以上。我问他怎么调的,他就说了三个字:改nginx。
Nginx这东西吧,配好了是小钢炮,配烂了就是拖拉机。今天把我压箱底的Nginx优化方案全抖出来,实测有效,不搞虚的。
先确认你的Nginx版本和当前配置
在动手之前,先看看自己服务器上装的nginx是什么版本:
```bash
nginx -v
nginx -V # 大写的V,能看到编译参数和已加载模块
```
然后查看当前配置文件位置:
```bash
nginx -t # 测试配置语法,同时输出配置文件路径
```
配置文件通常在 `/etc/nginx/nginx.conf` 或者 `/usr/local/nginx/conf/nginx.conf`,取决于你的安装方式。
Gzip压缩:让传输体积砍掉70%
这招是我每次帮人调服务器必做的第一件事。开启Gzip之后,文本文件(HTML、CSS、JS)能被压缩到原来的20%-30%,传输量大幅减少,加载速度肉眼可见地变快。
在nginx.conf的http块里加:
```nginx
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
gzip_disable "MSIE [1-6]\.";
```
解释一下关键参数:
- `gzip_comp_level`:压缩级别,1最快但压缩率低,9最慢但体积最小。6是个平衡点,一般推荐这个。
- `gzip_min_length`:小于这个字节数的文件不压缩,因为压缩本身也有开销。太小的文件压缩反而更慢。
- `gzip_types`:要压缩的文件类型,加上svg和xml,有时候会漏掉。
改完记得测试并重载:
```bash
nginx -t && nginx -s reload
```
浏览器缓存:让回头客秒开页面
用户第一次访问要下载所有资源,第二次访问如果还要重新下载,那就是浪费。设置好缓存策略,用户第二次访问时浏览器直接读本地缓存,根本不用请求服务器。
在server块里加:
```nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
```
`expires 30d`的意思是告诉浏览器:这些资源缓存30天。回头客访问时,浏览器一看,哦,有缓存,直接用,秒开。
注意这个正则排除了.html文件,因为博客文章会更新,不能让用户看到旧内容。
连接复用:减少TCP握手次数
HTTP/1.1默认是不支持连接复用的,每次请求都要重新握手。开启keepalive可以让一个TCP连接处理多个请求,减少握手开销。
```nginx
upstream backend {
server 127.0.0.1:8080;
keepalive 32;
}
server {
# 开启gzip后的keepalive优化
gzip_vary on;
# 开启长连接
keepalive_timeout 65;
keepalive_requests 100;
}
```
如果是PHP-FPM后端(WordPress、Z-Blog都是),记得在fastcgi配置里加上fastcgi_keep_conn:
```nginx
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_keep_conn on;
# 其他fastcgi参数...
}
```
禁用不用的HTTP方法:减少攻击面
一般博客只用到GET和POST,其他方法留着反而是安全隐患。可以在nginx里直接禁用:
```nginx
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
```
这不是必须的,但安全无小事,能关的就关。
worker进程优化:榨干服务器性能
Nginx默认的worker进程数可能不是最优的。看看你的配置:
```nginx
worker_processes auto;
events {
worker_connections 2048;
use epoll;
multi_accept on;
}
```
- `worker_processes auto`:让nginx自动检测CPU核心数,建对应数量的worker进程,物尽其用。
- `worker_connections 2048`:每个worker能同时处理多少连接,2048够大多数博客用了。
- `use epoll`:Linux专用的高效事件处理模型,BSD用kqueue。
- `multi_accept on`:让worker一次尽可能多地接受连接。
静态资源直接由Nginx服务:跳过PHP
很多新手博客的配置是所有请求都丢给PHP处理,包括图片、CSS、JS这些静态文件。PHP处理静态文件效率极低,完全没必要。
确保nginx配置里有这段:
```nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf|eot|pdf)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
```
这样静态文件直接由nginx返回,根本不会走到PHP层,性能提升明显。
Open File Cache:减少文件描述符开销
每次读取文件都要走系统调用,开销不小。开启open_file_cache可以缓存文件元数据,减少重复的系统调用:
```nginx
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
```
这个适合文件比较多的博客,比如有很多图片、附件的。
实战配置模板:照着改就行
这是我目前在用的完整nginx配置片段(博客场景):
```nginx
http {
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
# 文件缓存
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 连接优化
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
server_name yourblog.com www.yourblog.com;
root /var/www/blog;
index index.php index.html;
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
# PHP处理
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_keep_conn on;
# 其他fastcgi参数...
}
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
}
```
优化效果验证
改完配置后,建议用这几个工具验证效果:
| 检测工具 | 网址 | 看什么指标 |
|---|---|---|
| GTmetrix | gtmetrix.com | 页面加载时间、请求数 |
| WebPageTest | webpagetest.org | 瀑布图、各资源加载时序 |
| Chrome DevTools | F12打开 | Network面板,看总耗时 |
我自己的博客用上边这套配置之后,TTFB从300ms降到80ms,页面完全加载时间从2.1秒降到0.8秒。服务器还是那个服务器,就因为nginx配置调了调。
常见坑点
1. 改了配置没生效:一定要nginx -t检查语法,然后nginx -s reload重载。光改文件不行。
2. Gzip不生效:有些CDN会禁用gzip,回源时才开启。如果用了CDN,确认CDN那边也开了gzip。
3. 缓存太狠:文章更新后用户看不到?css/js改了样式不变?可以给文件加版本号,或者缩短缓存时间。
写在最后
nginx优化这事,说难不难,说简单也不简单。关键是要知道原理,知道为什么要这么配。照搬别人的配置没问题,但最好理解每一步是干什么的,出了问题才好排查。
你服务器上nginx是什么版本?现在访问速度怎么样?有问题可以在无双博客留言,大家一起交流。
需要了解更多使用技巧?
扫码加我微信,我来给你详细解答!
微信号:15207283116
(博客来的朋友优先通过!)
—— 本文仅供参考,具体以实际情况为准 ——
还木有评论哦,快来抢沙发吧~