经常搭建网站和部署服务器的都知道NGINX的反向代理这东西,配置好了能让你的博客网站访问速度提升不止一个档次。但是这个也不是所有人都了,比如我,我就不会弄,所以抱着学习的态度查找相关的资料,一起来聊聊怎么使用nginx的反向代码提升自己博客网站的速度。
为啥要用反向代理?
很多刚建站的朋友问我:自己的博客网站直接跑在服务器上不行吗?为啥非要整个 Nginx 反向代理啊?这么说吧,你让服务器直接对外服务,就像让一个厨子既炒菜又端盘子又收银——不是不行,但效率低啊。Nginx 就是那个专业的服务员,它专门处理静态资源、SSL 加密、请求分发这些活儿,让 ZBlog 专心写文章、处理动态内容,专业的事专业干,决定访问速度的还得是服务器的。我实测过,加上反向代理后,博客的首屏加载时间从 2.3 秒降到了 0.8 秒。这还是在没上 CDN 的情况下。所以可以尝试接入下,毕竟这么好的资源不用属实有些浪费了。
基础配置
先说最简单的场景,假如你有一台自己的物理服务器,ZBlog 跑在 8080 端口,为什么不是80端口,因为家用宽带不允许开放80端口,部分运营商8080都不允许,只能是非常用端口,当然专线和企业宽带除非哈,然后呢,你想让外面通过 80 端口访问怎么办?这时候就可以考虑使用nginx的反向代理。
server {
listen 80;
server_name itlaoli.com www.itlaoli.com;
location / {
proxy_pass http://127.0.0.1:8080;
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 $scheme;
}
}
就这几行,保存,nginx -t 测试一下,没问题就 nginx -s reload。完事。你看,你又着急,等等,这才哪到哪?毕竟这只是一道开胃菜,压轴的还在后面。
进阶配置
静态资源缓存
博客里的图片、CSS、JS 这些静态文件,没必要每次都让 ZBlog 处理。Nginx 可以直接缓存,下次访问直接返回。
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
proxy_pass http://127.0.0.1:8080;
proxy_cache_valid 200 30d;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
# 浏览器缓存
expires 30d;
add_header Cache-Control "public, immutable";
}
这个配置做了两件事:
效果?一个 500KB 的图片,第一次访问要 200ms,后面 99 次都是 0ms(直接从浏览器缓存读),不走服务器了。
开启 Gzip 压缩
现在谁还不开个 Gzip?毕竟Brotli压缩都已经出来好久了,如果连Gzip都没启用有点说不过去了,像文本类资源压缩后能省 60-70% 的流量。
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/xml+rss
application/json;
gzip_comp_level 6;
注意 gzip_min_length 1024,小于 1KB 的文件别压缩了,压缩完可能更大,还浪费 CPU。
连接复用与超时优化
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version1.1;
proxy_set_header Connection "";
# 超时设置
proxy_connect_timeout60s;
proxy_send_timeout60s;
proxy_read_timeout60s;
# 缓冲区
proxy_buffer_size128k;
proxy_buffers4256k;
proxy_busy_buffers_size256k;
}
proxy_set_header Connection "" 这行很关键,它启用了 HTTP/1.1 的长连接,避免每次请求都重新握手。
安全配置
隐藏真实 IP 和端口
刚才的基础配置里已经有 proxy_set_header X-Real-IP $remote_addr,这样 ZBlog 拿到的就是真实访客 IP,不是 Nginx 的 127.0.0.1。但还要在 ZBlog 那边配置一下,让它信任这些 header。ZBlog 1.7 之后在 include/c_config.php 里加:
$_SERVER['HTTP_X_FORWARDED_FOR'] = $_SERVER['REMOTE_ADDR'];
限制请求频率
防止有人搞你,加个限流:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
proxy_pass http://127.0.0.1:8080;
}
}
}
意思是:每个 IP 每秒最多 10 个请求,允许突发 20 个,超过的直接拒绝,根据博客网站的实际访问量去设置,不要照搬。
屏蔽恶意
有些扫描器、爬虫特别烦人,可以直接屏蔽:
if ($http_user_agent ~* (Scrapy|curl|wget|Python-urllib)) {
return 403;
}
更多的爬虫可以百度,这是指举例几个。
实战案例
最后给你们看看我博客上实际用的配置(简化版):
server {
listen80;
listen [::]:80;
server_name itlaoli.com www.itlaoli.com;
# HTTP 强制跳转 HTTPS
return301 https://$server_name$request_uri;
}
server {
listen443 ssl http2;
listen [::]:443 ssl http2;
server_name itlaoli.com www.itlaoli.com;
# SSL 证书
ssl_certificate /etc/letsencrypt/live/itlaoli.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/itlaoli.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 静态资源缓存
location~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
proxy_pass http://127.0.0.1:8080;
proxy_cache_valid20030d;
expires30d;
add_header Cache-Control "public, immutable";
}
# 动态请求
location / {
proxy_pass http://127.0.0.1:8080;
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 $scheme;
proxy_http_version1.1;
proxy_set_header Connection "";
# 限流
limit_req zone=one burst=20 nodelay;
}
}
当然我博客还开启了Brotli压缩,之前博客写过相关教程《宝塔面板Nginx环境下部署Brotli压缩功能图文详解》,感兴趣的参考【阅读全文】
常见问题
Q:配置完 Nginx 报 502 Bad Gateway
A:99% 是网站项目内容配置出错,可以先恢复之前的配置再看,毕竟配置文件错了一个字符都不能正常使用,看看 PHP-FPM 在不在,不在就 systemctl start php-fpm。
Q:图片显示不出来,全是叉
A:检查 proxy_set_header Host $host 这行有没有。ZBlog 网站博客生成图片 URL 时用 Host header,没有的话会生成错误的地址。
反向代理这东西,配置一次,受益很久。我这套配置跑了几年了,目前博客没出过任何大的问题,访问速度也一直稳定。如果在配饰CDN使用那简直就是锦上添花。
该文章在 2026/4/13 13:02:21 编辑过