Nginx从入门到精通2
目录
- 反向代理
- 一、反向代理原理
- 二、反向代理实现
- 下载限速
- 一、限速介绍
- 二、应用场景
- 三、限速原理
- 四、限速实现
- Nginx url 重写
- 一、URL重写介绍
- 二、应用场景
- 三、URL重写原理
- 四、URL重写
- URL 模块语法
- set指令 自定义变量
- if 指令 负责判断
- return 指令 定义返回数据
- break 指令 停止执行当前虚拟主机的后续rewrite指令集
- rewrite指令 实现重写url
- Nginx优化
- 一、调优的必要性
- 二、调优的维度和见解分歧
- Nginx跳跃
- 1、并发优化
- 2、长连接
- 3、压缩
- 4、静态缓存
反向代理
一、反向代理原理
\1) 客户端通过浏览器 发起请求 代理服务器
2)代理服务器 接受请求
\3) 代理服务器 发起请求 业务服务器
4)业务服务器 接受请求
5)业务服务器 处理请求
\6) 业务服务器 响应请求 代理服务器
7)代理服务器 响应请求 客户端
8)客户端通过浏览器渲染请求并展示给用户
二、反向代理实现
proxy_pass: nginx反向代理指令
反向代理实现
location / {
index index.php index.html index.htm; #定义首页索引文件的名称
proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表
}
反向代理优化
proxy_set_header Host $host; #修改请求头,添加Host字段proxy_set_header X-Real-IP $remote_addr; #修改请求头,添加X-Real-IP字段proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #修改请求头,添加X-Forwarded-For字段client_max_body_size 10m; #允许客户端请求的最大单文件字节数client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间\(代理连接超时\)proxy_send_timeout 90; #后端服务器数据回传时间\(代理发送超时\)proxy_read_timeout 90; #连接成功后,后端服务器响应时间\(代理接收超时\)proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
下载限速
一、限速介绍
在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配。
限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一访问请求限速。该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数。请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求。用于安全目的上,比如减慢暴力密码破解攻击。通过限制进来的请求速率,并且(结合日志)标记出目标URLs来帮助防范DDoS攻击。一般地说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没
限速说的很笼统,其实限速分为很多种限速方法:
1)下载速度限速
2)单位时间内请求数限制
3)基于客户端的并发连接限速
nginx限速模块
Nginx官方版本限制IP的连接和并发分别有两个模块:
limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”。
limit_req_conn 用来限制同一时间连接数,即并发限制。
二、应用场景
下载限速:限制现在速度及并发连接数,应用在下载服务器中,保护带宽及服务器的IO资源。
请求限速:限制单位时间内用户访问请求,防止恶意攻击,保护服务器及资源安全。
三、限速原理
漏桶原理

算法思想是:水(请求)从上方倒入水桶,从水桶下方流出(被处理);来不及流出的水存在水桶中(缓冲),以固定速率流出;水桶满后水溢出(丢弃)。这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。
四、限速实现
1)单位时间内请求数限制
#基于IP对下载速率做限制 限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区
http {limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s;server {location /abc {limit_req zone=baism burst=5 nodelay;}
}
limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s;
第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数:zone=baism:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。limit_req zone=baism burst=5 nodelay;
第一个参数:zone=baism 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
2)限制并发连接数
#基于IP做连接限制 限制同一IP并发为1
limit_conn_zone $binary_remote_addr zone=addr:10m;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /abc {limit_conn addr 1;}}}
3)限制下载速度
下载速度为100k
server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /abc {limit_rate 100k;}}}
4)综合案例
限制web服务器请求处理为1秒一个,触发值为5;
限制并发连接数为4;
限制下载速度为100.
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;
#基于IP做连接限制 限制同一IP并发为1 下载速度为100K
limit_conn_zone $binary_remote_addr zone=addr:10m;
#基于IP对下载速率做限制 限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /abc {limit_req zone=one burst=5 nodelay;limit_conn addr 4;limit_rate 100k;}}}
Nginx url 重写
一、URL重写介绍
和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。
Rewrite功功能是Nginx服务器提供的一个重要功能。几乎是所有的web产品必备技能,用于实现URL重写。URL重写是非常有用的功能,比如它可以在我们在改变网站结构后,不需要客户端修改原来的书签,也不需要其他网站修改对我们网站的友情链接,还可以在一定程度上提高网站的安全性,能够让我们的网站显得更专业。
二、应用场景
域名变更 (京东)
用户跳转 (从某个连接跳到另一个连接)
伪静态场景 (便于CDN缓存动态页面数据)
三、URL重写原理

四、URL重写
URL 模块语法
- set 设置变量
- if 负责语句中的判断
- return 返回返回值或URL
- break 终止后续的rewrite规则
- rewrite 重定向URL
set指令 自定义变量
Syntax:
set $variable value;
Default:
—
Context:
server, location, if
将http://www.ayitula.com 重写为 http://www.ayitula.com/baism
location / {set $name baism;rewrite ^(.*)$ http://www.ayitula.com/$name;}
if 指令 负责判断
Syntax:
if (condition) { … }
Default:
—
Context:
server, location
条件匹配
#模糊匹配 ~匹配 !~不匹配 ~* 不区分大小写的匹配
#精确匹配 = !=
location / {root html;index index.html index.htm;if ($http_user_agent ~* 'Chrome') {break;return 403;#return http://www.jd.com;}}
return 指令 定义返回数据
Syntax: return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if
location / {root html;index index.html index.htm;if ($http_user_agent ~* 'Chrome') {return 403;#return http://www.jd.com;}}
break 指令 停止执行当前虚拟主机的后续rewrite指令集
Syntax: break;
Default:—
Context:server, location, if
location / {root html;index index.html index.htm;if ($http_user_agent ~* 'Chrome') {break;return 403;}}
rewrite指令 实现重写url
rewrite [flag];
关键字 正则 替代内容 flag标记
flag:
- last #本条规则匹配完成后,继续向下匹配新的location URI规则
- break #本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
重定向就是将网页自动转向重定向,permanent和redirect从定向的区别
301永久性重定向:新网址完全继承旧网址,旧网址的排名等完全清零
301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。
302临时性重定向:对旧网址没有影响,但新网址不会有排名
搜索引擎会抓取新的内容而保留旧的网址
permanent标志:永久重定向
域名跳转
www.ayitula.com 重写为 www.jd.com
server {listen 80;server_name www.ayitula.com;location / {rewrite ^/$ http://www.jd.com permanent;}
}
redirect标志:临时重定向
域名跳转
www.ayitula.com 重写为 www.jd.com
server {listen 80;server_name www.ayitula.com;location / {rewrite ^/$ http://www.jd.com redirect;}
}
break标志: 类似临时重定向
域名跳转
www.ayitula.com 重写为 www.jd.com
server {listen 80;server_name www.ayitula.com;location / {rewrite ^/$ http://www.jd.com break;}
}
last标志:
url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
last 一般出现在server或if中
根据用户浏览器重写访问目录
如果是chrome浏览器 就将
http://192.168.10.42/$URI重写为
http://http://192.168.10.42/chrome/$URI实现 步骤
1)URL重写
2)请求转给本机locationlocation / {
.....
if ($http_user_agent ~* 'chrome'){#^ 以什么开头 ^a#$ 以什么结尾 c$#. 除了回车以外的任意一个字符#* 前面的字符可以出现多次或者不出现#更多内容看正则表达式 rerewrite ^(.*)$ /chrome/$1 last;}location /chrome {root html ;index index.html;}
}
Nginx优化
一、调优的必要性
在聊调优之前,我们先要知道为何调优,业务运行和调优的关系。

业务运行:线上业务正常运行,承载了公司业务。
监控业务:通过监控业务对线上业务进行监控,及时发现问题。
优化业务:通过监控分析,发现业务问题或者瓶颈,及时对业务或者软件就行调整、优化。
测试优化:优化完成后,需要对现有的优化进行测试,保证业务在当前优化模式中稳定、高效,能够解决当前问题。
这就是业务运行的一个流程,也是我们保证业务稳定、高效、高可用的运维之道。
二、调优的维度和见解分歧
调优类的文章是最难写的,因为我只能告诉你调优的选项,无法告诉你具体的阈值,因为不同的业务运行在不同的机器,所消耗的资源是不同的;又因为场景不同,对应的调优项及阈值是千变万化的,就好比你和你上铺的兄弟都是感冒了,去医院看病开的药却是截然不同的。正是如此,才会出现当很多人看到调优的文章,看到了具体的调优项或者阈值就会浮现出两个字,我不好意思说,配个图吧!大家意会就好。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrQ7KPxQ-1635939387925)(https://www.zutuanxue.com:8000/static/media/images/2020/12/6/1607251822347.png)]
Nginx跳跃
1、并发优化
nginx工作模式:主进程+工作进程
启动工作进程数量
worker_processes 4;
#指定运行的核的编号,采用掩码的方式设置编号
worker_cpu_affinity 0001 0010 0100 1000;events {
单个工作进程维护的请求队列长度worker_connections 1024;
}
2、长连接
减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销
keepalive_timeout 0; 0代表关闭
#keepalive_timeout 100;
#keepalive_requests 8192;
3、压缩
降低传输时间,增加用户体验度;降低公司带宽费用。
gzip on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;# 开启gzipgzip off;#Nginx做为反向代理的时候启用:off – 关闭所有的代理结果数据压缩expired – 如果header中包含”Expires”头信息,启用压缩no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩private – 如果header中包含”Cache-Control:private”头信息,启用压缩no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩any – 无条件压缩所有结果数据gzip_proxied any;# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 1k;# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明gzip_comp_level 1;# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;# 增加响应头”Vary: Accept-Encoding”# 是否在http header中添加Vary: Accept-Encoding,建议开启gzip_vary on;# 禁用IE 6 gzipgzip_disable "MSIE [1-6]\.";# 设置压缩所需要的缓冲区大小 gzip_buffers 32 4k;# 设置gzip压缩针对的HTTP协议版本gzip_http_version 1.0;
4、静态缓存
将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。
expires指令:开启缓存并指定静态缓存时间location ~* \.(png|gif)$ {expires 1h;}
果数据
gzip_proxied any;# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 1;# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;# 增加响应头”Vary: Accept-Encoding”
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";# 设置压缩所需要的缓冲区大小
gzip_buffers 32 4k;# 设置gzip压缩针对的HTTP协议版本
gzip_http_version 1.0;
### 4、静态缓存将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。
expires指令:开启缓存并指定静态缓存时间
location ~* .(png|gif)$ {
expires 1h;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
