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">生效方法:配置完执行命令/usr/local/nginx/sbin/nginx -s reload重启Nginx,就能实现文件合并了。
转载作品,原作者:小Ti客栈,文章来源:https://mp.weixin.qq.com/s/DhOb-LFr8MiRPbNYqbK9XA
微信赞赏
支付宝赞赏






