1 Nginx 介绍篇
1.1 Nginx 应用场景
- HTTP 服务器
- FTP 服务器
- 反向代理
- 负载均衡
1.2 Nginx 优点
- 高并发支持
- 内存消耗低
- 高拓展性
- 高可靠性
2 环境准备 & 安装搭建
CentOS7
参考:如何在 CentOS 7 上安装 Nginx - 开发指南 - 博客园 (cnblogs.com)
安装 nginx:
sudo yum install nginx
安装后,配置文件路径:/etc/nginx/
html 路径:/usr/share/nginx/html
这里 nginx 被 centOS 做了一些修改,导致初始页面变成了 CentOS 而不是 Nginx 的那个原生的。不过不影响使用。
设置 Nginx 开机启动:
sudo systemctl enable nginx
启动 Nginx:
sudo systemctl start nginx
检查 Nginx 的运行状态:
sudo systemctl status nginx
查看 Nginx 版本
nginx -v
查看配置文件是否正确:
nginx -t
关闭 nginx:
nginx -s stop
#或:
nginx -s quit #更优雅,防止正在连接的请求直接失败
nginx 启动后,直接在访问 http://your_ip 即可访问初始页面。
这里的 “your_ip” 是你服务器的 ip
3 Nginx 开启 GZIP 压缩
Nginx
的 gzip
功能是用于压缩HTTP响应内容的功能。当启用gzip
时,在发送给客户端之前,Nginx
会将响应内容压缩以减小其大小。这样可以减少数据传输的带宽消耗和响应时间,提高网站的性能和速度。
3.1 常用配置项
名称 | 参考参数 | 详解 |
---|---|---|
gzip | on | 是否开启 gzip 压缩(on:开启;off:关闭) |
gzip_min_length | 1k | 最小压缩单位,小于 1k 时,压缩意义不大 |
gzip_comp_level | 6 | 压缩级别,1-9 可选,数字越大,压缩效果越好,但是会加大 CPU 压力,高并发场景不宜调的太高 |
gzip_types | js、css、test、json 等 | 压缩类型,取自 application/type,文本文件的压缩效果最好 |
gzip_very | on | 用在响应头添加 very:accept-encoding,让代理服务器根据请求头识别是否启用了gzip压缩 |
gzip_http_version | 1.1 | 启用 gzip 压缩的最低 http 协议版本,这里也可以不填,默认就是1.1 |
gzip_buffers | 2 4k | 设置压缩所需要的缓冲区大小,以 4k 为单位,如果文件为 7k 则申请 2*4k 的缓冲区 |
gzip_static | on | 静态压缩,提前准备好了压缩文件,在同目录下会有一个 .gz 的压缩包,避免动态压缩,性能更好 |
gzip_disable | MSIE[1-6]\. | 设置禁用浏览器进行 GZIP 压缩,IE6 的某些版本对 gzip 的压缩支持很不好,会造成页面假死 |
3.2 使用示例
使用前配置:
server {
listen 80;
listen [::]:80;
server_name www.xxx.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
使用 gzip 前 js 请求:
这里截取了最大的一个 js 文件,3.4MB ,这一个文件的请求用了 7.16 秒 ,可见是非常耗时的。
使用 gzip 配置:
server {
# gzip 相关配置
gzip on;
gzip_types application/javascript;
gzip_min_length 1k;
gzip_comp_level 9;
listen 80;
listen [::]:80;
server_name www.xxx.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
使用 gzip 后 js 请求:
可以看到,使用 gzip 后,请求 js 文件大小变成了 1.1MB ,请求时间更是达到了 1.97 秒 ,可见优化效率之高,文件大小压缩率达到了 67.6% , 请求速度提升了 72.5% 。
gzip 还有其它参数,这里就不一一演示了,总之从数据上已经证明了其对文件的请求优化效率之高。
4 Nginx 开启限流
Nginx 的限流主要是两种方式:限制访问频率 和 限制并发连接数 。
通过两个配置型实现:
- limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法
leaky bucket
。 - limit_conn_zone:用来限制同一时间连接数,即并发限制。
4.1 限制访问频率
配置项: limit_req_zone
该配置项有三个参数:
- key:限流对象。binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。
- zone:存储访问信息的共享内存区大小。1M 能储存 16000 个 IP 地址,rateLimit:10m 表示一个大小为 10M,名字为 rateLimit 的内存区域。
- rate:最大访问速率。rate=10r/s 表示 1s 最多处理 10 次请求。
配置实战:
这里只展示该配置项相关配置,无关配置已省略
nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s;
server {
listen 80;
listen [::]:80;
server_name www.xxx.com;
location / {
# 使用限流策略,burst=2,burst 爆发的意思,相当于提供了一个待处理请求缓存区。
# nodelay 的作用是在缓存区满了的时候,新请求直接返回 503,不加这个参数就会继续排队。
limit_req zone=rateLimit burst=2 nodelay;
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
效果展示:
可以看到,许多请求失败。
4.2 限制并发数量
配置项: limit_conn_zone
该配置项有两个参数:
- key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。
- zone:存储访问信息的共享内存区大小。1M 能储存 16000 个 IP 地址,rateLimit:10m 表示一个大小为 10M,名字为 rateLimit 的内存区域。
配置实战:
这里只展示该配置项相关配置,无关配置已省略
nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
listen [::]:80;
server_name www.xxx.com;
location / {
# 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。
limit_conn perip 1;
# 对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,只有当 request header 被后端 server 处理后,这个连接才进行计数。
limit_conn perserver 10 ;
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
效果展示: