Nginx进阶实用配置:压缩、代理、限流、请求合并

Nginx是个性能很强的Web服务器和反向代理工具,配置灵活、功能多,能优化网站速度、稳住服务稳定性。这篇文章就聚焦四个最常用的场景——GZIP压缩、免备案反向代理、流量限流、请求合并。

Nginx是个性能很强的Web服务器和反向代理工具,配置灵活、功能多,能优化网站速度、稳住服务稳定性。这篇文章就聚焦四个最常用的场景——GZIP压缩、免备案反向代理、流量限流请求合并

Nginx进阶实用配置:压缩、代理、限流、请求合并

一、开GZIP压缩:让资源变小,加载更快


1.1 为啥要开压缩?

网站里的HTML、CSS、JS这些文件,默认体积不算小,传输到用户浏览器要花时间。GZIP能把这些文件“压小”,一般能压到原来的30%-50%,传得快了,网页加载自然就快,用户体验也更好。

1.2 两种配置方案

下面给两套配置,一套简单基础,一套优化到位适合生产环境,根据自己服务器性能选就行。

基础配置

http {
    # 开启GZIP压缩功能
    gzip on;
    # 文件小于1KB就不压缩了,压完变化不大,还浪费服务器资源
    gzip_min_length 1k;
    # 压缩等级1-10,数字越大压得越狠,但越费服务器CPU
    gzip_comp_level 2;
    # 指定要压缩的文件类型,涵盖常用的文本、脚本、图片
    gzip_types text/bash application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    # 开启这个响应头,让代理服务器能识别是否已压缩(建议开)
    gzip_vary on;
}

生产环境优化配置

这套配置在压缩效果和服务器CPU消耗之间找了平衡,还加了兼容老浏览器、减少损耗的设置,适合正式上线的网站用。

http {
    # ===== GZIP 核心配置 =====
    # 开启GZIP压缩
    gzip on;
    # 小于1KB的文件不压缩
    gzip_min_length 1k;
    # 压缩等级设为6,性价比最高(既压得小,又不怎么费CPU)
    gzip_comp_level 6;
    # 要压缩的文件类型,覆盖几乎所有常用文本资源
    gzip_types 
        text/plain 
        text/css 
        text/xml 
        text/javascript 
        application/javascript 
        application/x-javascript 
        application/json 
        application/xml 
        application/xml+rss 
        image/jpeg 
        image/gif 
        image/png;
    # 开启响应头,适配代理服务器
    gzip_vary on;
    # 最低支持HTTP 1.1协议的压缩(不用改,默认就是这个)
    gzip_http_version 1.1;
    # 设置压缩缓冲区大小(2个4KB缓冲区,适配大多数场景)
    gzip_buffers 2 4k;
    # 优先用提前压好的.gz文件(比如自己手动压的CSS.gz),减少服务器实时压缩的损耗
    gzip_static on;
    # 不给IE6浏览器开压缩(老浏览器兼容差,开了可能页面乱码)
    gzip_disable "MSIE [1-6].";
}

二、反向代理实现免备案访问


2.1 原理很简单

国内服务器搭网站,必须先备案,没备案的域名会被防火墙挡住,用户打不开。想绕开这个限制,就找一台已备案的服务器(或者香港、海外的免备案服务器,叫它服务器A),用户访问服务器A的合法域名,A再把请求转发到国内没备案的服务器(服务器B),这样用户就能正常打开B上的网站了。

2.2 服务器A的配置示例

下面是服务器A上的Nginx配置,核心就是把A的域名请求,转发到国内没备案的服务器B。

server {
    listen 80;
    server_name 免备案域名; # 换成服务器A的合法域名(已备案/免备案均可)
    location / {
        proxy_pass 服务器B的IP:端口; # 换成国内未备案服务器B的IP和端口(比如192.168.1.100:8080)
    }
}

提示:配置完要重启Nginx才生效,另外要确保服务器A和B能正常通信,没有被防火墙拦截端口。

三、流量限流:防止服务被冲垮

Nginx有两种限流方式,一种是控制单位时间内的请求次数,一种是控制同时连接的数量,根据需求选,也能一起用,避免网站被突发流量或恶意请求搞崩。


3.1 限制请求频率(比如每秒最多10个请求)

用Nginx自带的模块,按IP来限制请求速度,比如限制同一个IP每秒最多发10个请求,多了就拒绝。核心是两个配置指令,一个定规则,一个用规则。

http {
    # 定义限流规则:按客户端IP算,分配10MB内存存访问记录,每秒最多10个请求
    limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s;
 
    server {
        listen 80;
        server_name 你的域名; # 换成自己的域名或服务器IP
 
        location / {
            # 应用上面定义的限流规则
            limit_req zone=serviceRateLimit;
            # 把请求转发到后端服务(换成自己的后端地址,没有后端就删掉这句)
            proxy_pass http://upstream_cluster1;
        }
    }
}

参数说明:

  • binary_remote_addr:按用户IP限流,加个binary_是为了节省服务器内存;
  • zone=serviceRateLimit:10m:开辟一块10MB的内存,名字叫serviceRateLimit,专门存IP访问记录,10MB大概能存16万个IP的信息;
  • rate=10r/s:每秒最多10个请求,实际是每100毫秒处理1个,超过这个速度的请求直接拒绝。

3.2 处理突发流量(比如突然多20个请求)

上面的基础配置太死板,比如突然来了20个请求,超过每秒10个的部分都会被拒,体验不好。可以加两个参数,允许临时多处理几个请求,还不耽误速度。

http {
    # 定义限流规则:按客户端IP,10MB内存,每秒10个请求
    limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s;
 
    server {
        listen 80;
        server_name 你的域名; # 换成自己的域名/IP
 
        location / {
            # 允许额外20个突发请求,且这20个请求立即处理,不延迟
            limit_req zone=serviceRateLimit burst=20 nodelay;
            # 转发到后端服务(换成自己的后端地址)
            proxy_pass http://upstream_cluster1;
        }
    }
}

说明:burst=20就是允许临时多来20个请求,相当于留了20个“备用名额”;nodelay表示这20个请求不用排队,立马处理。但备用名额用完后,后续请求还是要按每秒10个的速度来,保证服务器不被压垮。

3.3 限制并发连接数(比如同一IP最多20个连接)

除了限制请求频率,还能限制同时连接的数量,比如同一个IP最多同时连20个,整个服务器最多同时连100个,避免单个用户或整体流量占满资源。

http {
    # 按IP限制连接数:10MB内存存记录
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    # 按服务器限制总连接数:10MB内存存记录
    limit_conn_zone $server_name zone=perserver:10m;
 
    server {
        listen 80;
        server_name 你的域名; # 换成自己的域名/IP
 
        # 单个IP最多同时20个连接
        limit_conn perip 20;
        # 整个服务器最多同时100个连接
        limit_conn perserver 100;
 
        location / {
            # 转发到后端服务(换成自己的后端地址)
            proxy_pass http://upstream_cluster1;
        }
    }
}

注意:只有后端服务器处理完请求头后,才会算一个连接数,避免无效连接占用名额。

四、请求合并:减少请求次数,加载更快

浏览器对同一个域名,同时只能发6个左右的请求,要是网页有十几个CSS、JS文件,就得排队加载,很慢。用Nginx的concat模块,能把多个CSS或JS文件合并成一个,减少请求次数,加载速度就快了。


4.1 安装concat模块(必须编译安装)

这个模块不是Nginx自带的,得手动下载源码,和Nginx一起编译安装,步骤如下(以Nginx 1.4.2版本为例,跟着敲命令就行):

# 进入源码存放目录
cd /usr/local/src/
# 下载Nginx和concat模块的源码
wget http://nginx.org/download/nginx-1.4.2.tar.gz
wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip
# 解压下载的文件
unzip nginx-http-concat-master.zip
tar -xzvf nginx-1.4.2.tar.gz
# 进入Nginx源码目录,配置编译参数
cd nginx-1.4.2
./configure --prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module \
--add-module=../nginx-http-concat-master
# 编译并安装
make
make install

验证:安装完后,Nginx源码目录下会出现objs文件夹,就说明安装成功了。

4.2 核心配置指令

  • 开启/关闭合并:concat on | off,默认是off(关闭),可以在全局、单个服务器或单个路径下设置;
  • 可合并的文件类型:concat_types MIME types,默认只能合并CSS和JS,需要其他类型可以自己加;
  • 其他参数:比如最多合并多少个文件、合并后用什么分隔符,后面配置示例里会讲,按需调整就行。

4.3 配置示例和使用方法

server {
    listen       80;
    server_name localhost;
    index index.html index.htm;
    root  /html; # 网站文件存放目录,换成自己的路径
 
    location /static/css/ {
        concat on;    // 开启文件合并功能
        concat_max_files 20; // 最多合并20个文件,太多了反而不方便维护
        concat_delimiter /* 自定义分隔符 */;  // 合并后用这个符号区分不同文件内容
        concat_unique off; // 允许合并不同类型的资源(默认只允许同类型合并)
        concat_types text/css application/javascript; // 允许合并CSS和JS
    }
 
    location /status {
        stub_status on;
        access_log   off;
    }
 
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js)$ {
        expires      off;
    }
}

前端怎么用:在网页里引用文件时,用??把多个文件路径连起来就行,示例如下:

<link rel="stylesheet" href="/static/css/??a.css,b.css,c.css">

生效方法:配置完执行命令/usr/local/nginx/sbin/nginx -s reload重启Nginx,就能实现文件合并了。

转载作品,原作者:小Ti客栈,文章来源:https://mp.weixin.qq.com/s/DhOb-LFr8MiRPbNYqbK9XA

(0)
SSH安全优化建议:端口 + 配置
上一篇 2025-12-22 13:40
dockerui一款好看好用的全中文docker管理工具
下一篇 2024-02-26 16:38

相关推荐

  • Nginx、ElasticSearch、RocketMQ生产环境配置

    Nginx、ElasticSearch、RocketMQ生产环境配置

    2023-04-18
    1.5K0
  • nginx安全配置

    隐藏版本号 http { server_tokens off; } 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及…

    Linux 2022-01-05
    1.9K0
  • 如何用Nginx实现对城市以及指定IP的访问限制?

    如何用Nginx实现对城市以及指定IP的访问限制?如何用Nginx实现对城市以及指定IP的访问限制?如何用Nginx实现对城市以及指定IP的访问限制?如何用Nginx实现对城市以及指定IP的访问限制?

    如何用Nginx实现对城市以及指定IP的访问限制?

    2023-05-21 Linux
    1.6K0
  • 你的网站正在裸奔!被开发者忽略的Nginx配置漏洞

    你的网站正在裸奔!被开发者忽略的Nginx配置漏洞你的网站正在裸奔!被开发者忽略的Nginx配置漏洞你的网站正在裸奔!被开发者忽略的Nginx配置漏洞你的网站正在裸奔!被开发者忽略的Nginx配置漏洞

    “您的服务器已被攻陷,数据库正在导出”——当这条告警弹出时,老王正在茶水间泡咖啡。从黑客发起攻击到拿到核心数据,总共耗时4.7秒,比他点的奶茶送到还快。更讽…

    2025-07-07 Linux
    1.1K0
  • Nginx常用的基础配置(前端相关方面)

    Nginx 常用的基础配置(前端相关方面),nginx现在几乎是众多大型网站的必用技术,大多数情况下,我们不需要亲自去配置它,但是了解它在应用程序中所担任的角色,以及如何解决这些问题是非常必要的。
    下面我将从nginx在企业中的真实应用来解释nginx在应用程序中起到的作用。

    2024-11-04
    1.7K0
  • nginx站点开启http/3 提升网站速度与安全性

    HTTP/3作为最新的网络协议,通过采用QUIC传输层协议,进一步提升了网页传输的效率和安全性。相比HTTP/2,HTTP/3在网络连接速度、可靠性和安全性方面具有显著优势。因此,开启HTTP/3成为许多站长优化网站性能的重要步骤。本文将介绍HTTP/3的基本概念、优势,以及如何在NGINX站点上开启HTTP/3以提升网站的速度与安全性。

    2024-10-29
    2.0K0

发表回复

登录后才能评论
扫码了解
扫码了解
反馈建议
分享本页
返回顶部