当前位置: 代码网 > 服务器>网络>SSL > Nginx进阶实用配置(压缩、代理、限流、请求合并)

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

2026年04月30日 SSL 我要评论
nginx是个性能很强的web服务器和反向代理工具,配置灵活、功能多,能优化网站速度、稳住服务稳定性。这篇文章就聚焦四个最常用的场景——gzip压缩、免备案反向代理、流量限流、

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

一、开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" rel="external nofollow" >

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

五、经验之谈

上面讲的gzip压缩、免备案反向代理、流量限流、请求合并,都是nginx实战中最常用的优化手段。配置的时候不用死记参数,根据自己服务器的性能、网站流量大小来调整就行。每次改完配置,记得用nginx -t检查语法有没有错,再重启nginx生效,把这些配置用好了,网站加载更快、运行更稳,不管是小站点还是高并发服务都适用。

到此这篇关于nginx进阶实用配置(压缩、代理、限流、请求合并)的文章就介绍到这了,更多相关nginx 压缩、代理、限流、请求合并内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com