Nginx反向代理配置实战:提升博客访问速度的完整教程

刘波

Nginx 反向代理配置实战:让你的博客访问速度飞起来


经常搭建网站和部署服务器的都知道,Nginx 的反向代理配置好了,能让博客网站访问速度提升不止一个档次。

但是这个也不是所有人都懂,比如我,我就不会弄,所以抱着学习的态度查找相关资料,一起来聊聊怎么使用 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";
}

这个配置做了两件事:

  • Nginx 自己缓存 30 天
  • 告诉浏览器也缓存 30 天

效果?一个 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_version 1.1;
    proxy_set_header Connection "";

    # 超时设置
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    # 缓冲区
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
}

proxy_set_header Connection "" 这行很关键,它启用了 HTTP/1.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'];

2. 限制请求频率

防止有人搞你,加个限流:

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 个,超过的直接拒绝。根据博客网站的实际访问量去设置,不要照搬。

3. 屏蔽恶意扫描

有些扫描器、爬虫特别烦人,可以直接屏蔽:

if ($http_user_agent ~* (Scrapy|curl|wget|Python-urllib)) {
    return 403;
}

更多的爬虫可以百度,这是举例几个。


七、实战案例

Nginx反向代理配置实战:提升博客访问速度的完整教程

最后给你们看看我博客上实际用的配置(简化版):

server {
    listen 80;
    listen [::]:80;
    server_name itlaoli.com www.itlaoli.com;

    # HTTP 强制跳转 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 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_valid 200 30d;
        expires 30d;
        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_version 1.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 使用,那简直就是锦上添花。好了,设置完成了,有问题留言反馈吧。

文章版权声明:文章内容均来源于各大短视频平台搜集以及修改和删减新增,如有侵权或者违规,请联系站长进行删除,如需转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,26人围观)

还没有评论,来说两句吧...

目录[+]