一、简介
Nginx (engine x) 是一款轻量级的、高性能的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)和 SMTP服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表 现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
二、特点
- 开源免费,安装简单,配置简洁,服务器本身的Bugs非常少;
- 稳定的性能,丰富的功能集、示例配置文件和低系统资源的消耗;
- 占有内存少,并发能力强 (能够支持高达 50,000 个并发连接数的响应 )。
三、简单使用
-
下载资源:Nginx和Jmeter资源
-
解压所下载文件到指定的盘符,nginx目录结构如下:
-
启动服务器,步骤如下:
- 打开dos命令窗口,切换到nginx的目录下。
- 输入启动命令:
- 启动服务器:start nginx
- 停止服务器: nginx.exe -s stop
- 重启服务器:nginx.exe -s reload
- 启动不成功检查服务器: nginx.exe -t
-
打开浏览器输入网址:http://localhost:80(80端口可以省略),如看到下图信息,说明服务器已启动成功!:
四、nginx运行原理
-
打开nginx目录下的conf目录下的nginx.conf
(注:此文件非常重要,以后学习的 nginx代理,负载均衡等都会修改该配置文件) -
服务器地址和端口配置,如下:
server { listen 80; #端口号(注:80端口经常会被其他程序占用,所以在启动服务器之前建议大家 换个端口号,如:8086) server_name localhost;#服务器地址,localhost表示本机地址相当于127.0.0.1 ... }
-
静态资源配置,如下:
server{ ... location / { root html; #nginx目录下的html目录,可修改 index index.html index.htm;#访问的默认资源文件,可修改 } ... }
五、nginx代理
1、正向代理
正向代理:是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请 求并指定目标(目标服务器),然后代理向目标服务器转交请求并将获得的内容返回给客户端。客户端必须要进行 一些特别的设置才能使用正向代理。(例如:我们访问谷歌网站,由于其他原因无法访问到,但是我们通过访问其 它的服务器最终访问到谷歌网站了,此时就是一个正向代理的过程)
2、反向代理
反向代理:在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥 而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相 同的服务,对于用户来说,根本感觉不到任何差别。实际上是通过反向代理服务器接受客户端的请求,然后把请求 分发给具体的服务器进行处理,然后再将服务器的响应结果返回给代理服务器,由代理服务器反馈给客户端。 (例如:拨打10086客服电话,一个省的10086客服估计有成千上万个,实际上我们并不关心有多个客服,我们关心 的是只要拨通了10086 的号码能够有客服为我们提供服务就可以了。其实10086总机号码就是我们说的反向代理)
3、反向代理示例
-
我们创建一个简单的springboot项目,端口为8080,编写一个简单的请求测试
-
启动效果为:
-
现在,我们通过nginx来代理访问该项目。我们只需要修改配置文件
conf -> nginx.conf
文件即可,具体修改如下:server { listen 9999;#修改nginx服务器的端口号 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #请求localhost:8086/hello/ 被转发到 http://localhost:8080/hello location /hello/ { proxy_pass http://localhost:8080/hello/; #被代理的服务器 index index.html index.htm; } }
-
修改完配置完配置文件后,我们需要重启nginx
-
然后我们访问
localhost:9999/hello
即可看到和刚才访问网址: http://localhost:8080/hello 是一样的效果。
4、代理用法之一:解决跨域
同域
简单的解释就是相同域名、端口号和协议。
跨域问题
跨域问题的产生是因为浏览器对于javascript的同源策略的限制导致的,例如a.com下面的js不能 调用b.com中的 js、对象或数据,因为a.com和b.com是不同域,所以想要调用就出现了跨域问题。
同源策略
请求的url地址必须与浏览器上url地址处于同域上,也就是域名、端口号、协议相同。配置如下:
server {
listen 8086;
server_name 192.168.10.1;
#代理服务器1
location /hello1/ {
proxy_pass http://192.168.20.2:8881/world1/;
index index.html index.htm;#默认项目首页
}
#代理服务器2
location /hello2/ {
proxy_pass http://192.168.30.3:8882/world2/;
index index.html index.htm;#默认项目首页
}
}
这样 http://192.168.20.2:8881/world1/ 和 http://192.168.30.3:8882/world2/ 两个服务器上的数据就全都出现在了192.168.10.1:8086服务器上,从而解决了跨域的问题。
六、nginx负载均衡
1、什么是负载均衡
当一台服务器在单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩 溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器中。如此以来,用户的每次 访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
2、负载均衡的配置
-
我们模仿集群的样子,创建两个springboot项目,一个端口为8080,一个端口为8081,编写一样的请求名为:hello,进行测试。
-
打开nginx/conf目录下的nginx.conf文件进行编辑,编辑内容举例如下:
-
http配置中添加如下代码:
http { upstream mytomcat123 {#集群的名称 server localhost:8080 max_fails=1 weight=1 fail_timeout=10s; server localhost:8081 max_fails=1 weight=1 fail_timeout=10s; #weight权重,设置相同时则是轮询访问,也可以设置不同的权重,则按对应的比例进行访问 #max_fails 最大请求失败次数,默认值为1 #fail_timeout 请求失败之后,等待多久后继续访问的时间,默认值为10s #server 10.0.0.11:7070 backup; backup备用,其它所有服务器宕机时才启用 #ip_hash; IP策略,每个请求按访问ip的hash结果分配,可以解决session共享的问题 #fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 } }
-
server的默认路径配置中改为如下代码:
#配置集群代理 location / { proxy_pass http://mytomcat123; #集群的名称,和上面设置要保持一致 index index.html index.htm; }
-
如果有一样的请求的话,就删除掉上面的,比如我这个
-
-
编辑完成后保存文件,重启nginx服务器,将localhost:8081和localhost:8082对应的服务器启动,在浏览器 运行http://localhost:9999/hello,则可看到两个服务器在轮询响应客户端请求。
-
可以修改集群配置,自己进行测试。
-
比如我这里给第一台服务器权重设置了2
-
重启nginx,然后回到页面进行刷新,可以发现,刷新5次,访问第一台服务器访问了四次,才访问第二胎两次。
3、故障转移
在使用负载均衡时,假如集群中的某台服务器挂掉了,那么当访问到该服务器时会有很长的响应超时时间, 响应失败后才会去访问集群中正常的服务器,这样的话用户的体验就非常差了,那么如何来解决这个问题 呢,实际上可以通过在nginx服务器上配置故障转移来解决这个问题。
nginx默认是配置了故障转移的,当我们关闭一台服务器,然后多次刷新可以发现,当它该向那台服务器发请求的时候,会加载一会,当我们刷新多次的时候,nginx就不会向那个服务器发送请求了。
七、nginx限流
1、Jmeter使用入门
Apache Jmeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web应用测试,但后来扩展到其他测试领域。它可以用于对静态的和动态的资源的性能进行测试。也可以用 于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你还可以使用它做性能的图形分析或在大并发下负载测试你的服务器/脚本/对象。
jmeter资源下载:Nginx和Jmeter资源
jmeter使用参考如下:
-
运行Jmeter: 安装JDK环境 打开文件夹运行bin目录下的 jmeter.bat即可进入jmeter的主界面 启动不了主界面尝试直接启动bin目录下的ApacheJMeter.jar
-
创建一个线程组 点击测试计划,右键添加Threads,选择线程组
- 设置线程组参数 线程数:用户数量,100线程就模拟100个用户访问 Ramp-Up Period(in seconds): 每个线程用户执行间隔,0代表并发访问 循环次数:每个用户请求的次数,永远就是不停的请求
- 创建HTTP请求 右键线程组-Sampler-HTTP请求
- 配置HTTP请求 服务器IP 端口号 路径是端口号后面的,例如 /xxx.html
- 添加运行结果分析监听器 右键线程组-添加-监听器-图形结果,聚合报告,查看结果树(有用)
-
点击工具栏的运行按钮,运行
-
保存一下配置,随便保存下
-
保存完后会自动执行,然后我们点击查看结果树,查看结果:
2、限制某一IP每秒访问次数
nginx限制每个IP每秒访问1次,选择nginx.conf配置文件进行配置
在http配置里添加如下代码:
http {
# 限制时间段请求次数,开辟了一块allips内存来统计每秒ip访问次数
limit_req_zone $binary_remote_addr zone=allips:10m rate=1r/s;
#1r/s表示每秒访问1次
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
}
在配置的集群请求里添加如下代码:
server {
location / {
limit_req zone=allips burst=5 nodelay;#每秒每IP限制访问1次,缓存值为5
proxy_pass http://mytomcat123; #集群的名称,和上面设置要保持一致
index index.html index.htm;
}
}
配置完毕以后,重启nginx,然后再次运行Jmeter进行测试
记得先清除一下结果:
结果如下,可以发现成功了6个请求,其他请求均被拦截了:
3、限制某一IP瞬间并发量
nginx限制某一IP瞬间并发量为1
1、在http配置里添加如下代码:
# 限制并发量,开辟了一块addr内存来统计IP并发量
limit_conn_zone $binary_remote_addr zone=addr:10m;
2、在配置的路径中添加如下代码:
location / {
limit_conn addr 1; #连接数限制
limit_req zone=allips burst=5 nodelay;#每秒每IP限制访问1次,缓存值为5
proxy_pass http://mytomcat123; #集群的名称,和上面设置要保持一致
index index.html index.htm;
}
3、保存,重启nginx
4、这时候我们修改线程组,把间隔时间设置为0,实现模拟大并发
5、清空结果,运行,查看结果,可以发现只有一个请求运行成功了: