七层负载均衡-------nginx

nginx简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯人编写,第一个版本在2004年10月发布。
其特点是占有内存少,并发能力强,但是只能处理静态页面。

http服务器的发展

早期,最流行的http服务器当然是Apache,但是随着互联网的快速增长,用户的日益增多,服务器的压力就会变大。起初的做法就是对服务器进行优化,增加服务器配置。
但是,因为摩尔定律,在等倍的增加服务器配置的同时,能够处理的请求却不会跟着配置做等倍增加,且增加的越来越少。
对于此问题,nginx横空出世。

nginx的优点

nginx特点为高并发,高性能,稳定性高。且有良好的可拓展性,内存消耗少。官方的数据为3万个并发连接,10个eginx进程,消耗的内存为150M。较apache有更强的重写规则。内置后端健康检查功能。节省带宽等…

nginx应用场景

  • 静态资源(html页面)
  • 反向代理(能够实现缓存,负载均衡)
  • 可作为API(应用程序接口),通常使用openresty,可添加支持nginx的一些插件

nginx下载及安装

可以在nginx官网nginx.org下载nginx:

在这里插入图片描述
在这里插入图片描述
下载完成后,进行安装:
(nginx有源码包,也有rpm包。但是建议使用源码编译的方式进行有选择的安装,可以选择自己要用到的模块)

对下载好的源码包进行解压:
在这里插入图片描述

安装包内的目录及文件的介绍

auto

在这里插入图片描述
其中有四个子目录:cc、type 、lib、os
cc:编译时需要用的工具
os:对操作系统进行判断
type 和 lib 辅助configure进行编译

CHANGES

CHANGES中存放各版本更新修复的信息:
在这里插入图片描述

CHANGES.ru

nginx的作者为俄罗斯人,因此CHANGES.ru为俄罗斯版的CHANGES
在这里插入图片描述

conf

conf内存放着nginx的配置文件,方便管理人员进行配置(不用手动去写)
在这里插入图片描述

configure

编译需要用到的二进制文件

contrib

提供nginx语法检测的字体
在这里插入图片描述
首先使用vim打开nginx.conf配置文件:
在这里插入图片描述
可以看到配置文件中字体只有两种颜色,生效的为黑色,不生效的为蓝色。
此时,在家目录下新建.vim文件,并将contrib内的所有文件复制到.vim文件中:
在这里插入图片描述
此时再次打开配置文件nginx.conf:
在这里插入图片描述
可以看到有了彩色的字体进行语法检测,当输入正确时,会变色。

html

html和apache相同,为默认布目录
在这里插入图片描述
其中50x.html为报错页面(报错5xx一般是服务器的问题),index.hrml为默认发布页

LICENSE

存放证书

man

nginx的文档
在这里插入图片描述

README

关于nginx的一些说明

src

nginx的源码目录
在这里插入图片描述

nginx的编译和安装:
预编译:
添加http-ssl模块,使其支持https访问

 ./configure --prefix=/usr/local/nginx --with-http_ssl_module

在这里插入图片描述
预编译完成后,会产生objs目录(用来存放预编译的中间产物)
在这里插入图片描述
其中,Makefile的作用是组织c文件之间的相互调用

编译和安装:

编译

make 

在这里插入图片描述
make过程也会向objs目录中添加文件:
在这里插入图片描述
其中,‘nginx’目录为nginx的主程序
ngx_modules.c里存放nginx的目录(编译时添加的模块)
在这里插入图片描述

安装

make install

在这里插入图片描述
在指定的安装目录中进行查看:
在这里插入图片描述

nginx的运行:

进入sbin目录,使用脚本方式运行nginx:

./nginx

在这里插入图片描述
80端口被成功打开!

访问测试:
在这里插入图片描述
成功访问到nginx默认页面!
默认发布页面的测试:

 vim /usr/local/nginx/html/index.html ##编辑默认发布页

在这里插入图片描述
访问结果:
在这里插入图片描述

nginx的更新与回退

nginx版本的查看

在sbin目录中,./nginx -V 或者 nginx -V可以看到当前nginx的信息:
版本信息及编译nginx时所加的参数,支持的模块
在这里插入图片描述

nginx版本的更新

在企业中,时时刻刻要保证服务的不间断。所以在更新时,,用户必须无感知。而nginx支持热部署。
刚才安装的nginx版本为目前官网最新版1.18,所以没有更新的版本。这里我们使用1.17版本模拟nginx的更新:

首先,对老的版本进行备份(在更新失败时直接可以进行版本的回退)。在nginx中,任何东西文件都可以不需要,nginx的二进制程序是必须要的。所以,在备份时,只需要备份nginx的二进制程序(sbin/nginx)。
在这里插入图片描述

在官网下载好nginx1.17的源码压缩包,解压并进行预编译:

./configure --prefix=/usr/local/nginx --with-http_ssl_module

在这里插入图片描述
编译: make
在这里插入图片描述

此时,执行完编译后就不能执行安装动作,make install 仅当应用第一次在主机上安装时使用!,否则会覆盖之前存在的程序(配置、默认发布目录等),服务就会中断。

此时我们可以在存放预编译和编译的中间产物的objs目录中找到nginx的二进制程序,将此二进制程序复制到编译安装所在目录中的nginx/sbin/nginx 将原有的nginx二进制程序覆盖即可:

cp objs/nginx /usr/local/nginx/sbin/nginx -f

直接使用cp进行覆盖时,提示当前程序正在运行,须进行强制覆盖(-f参数):
在这里插入图片描述

此时nginx的版本:1.17
在这里插入图片描述
查看当前nginx进程:
在这里插入图片描述
可以看到,当前nginx存在两个进程,master进程和worker进程。这两个nginx进程为1.18版本nginx的进程。
此时新的用户请求还是这两个进程来处理,所以我们需要做的工作是让我们的新版本1.17去处理新的访问请求,旧版本1.
8不再接受访问请求。

nginx默认只有一个worker进程,master进程负责创建并监控worker进程。所以真实处理用户请求的进程是worker进程。

这里使用对进程发送信号的方式:

 kill -USR2 33573

对master进程(33573)发送信号,使其停止接收用户请求,并重新开启一个master进程,新开启的master进程开启一个worker进程来处理新的用户请求。
在这里插入图片描述
等到旧的worker进程处理完用户请求后将其关闭:

kill -WINCH 33573

在这里插入图片描述
可以看到,我们保留了老版本的master进程,目的在于备份!如果更新进行失败,可以进行回退,保留的master进程可以拉起worker进程。

到此,nginx就算更新成功!

nginx版本的回退

当前版本:
在这里插入图片描述
我们更新之前的版本为1.18,先将1.17版本回退到18

我们更新时对1.18版本nginx二进制程序的备份:
在这里插入图片描述
此时,直接使用此备份覆盖掉新版本nginx的二进制程序:

cp -f nginx.old nginx

此时nginx的版本成功回退到1.18版本:
在这里插入图片描述
还需要将我们更新时关掉的1.18版本nginx的worker进程拉起来(之前保留了旧的master进程)
在这里插入图片描述
使用kill -HUP 33573对旧的masker的worker进程和进行拉起:
在这里插入图片描述
同样道理,使用 kill -USR2 37551使新的worker停止接收用户请求,旧的worker进程开始接收用户请求。
在使用 kill -WINCH 3573对失败版本的worker进程进行关闭:
在这里插入图片描述
最后关闭失败版本的master进程:
在这里插入图片描述
至此,nginx版本回退工作完成!

nginx的日志切割

nginx可以作为反向代理服务器,当为反向代理服务器时,需要处理的请求量也是非常大的,这就导致nginx的日志大小非常大。所以需要对nginx的日志进行切割。
如果不进行日志切割,那么一个日志文件大大小可能高达六七个G,当打开日志文件时,大小超过服务器内存大小就会造成服务器死机的情况,并且不方便查看。

可以看到,nginx的日志分为两种 ,access.log 和 error.log
正常的连接日志和错误日志。

当前正常连接日志大小:
在这里插入图片描述
大小为4K,太小,不方便切割。

这里使用ab加压命令对nginx服务器进行加压访问:

ab -c 1 -n 100000 http://192.168.0.10/index.html

此命令表示,对192.168.0.10主机的默认发布页面进行1个并发,100000此请求:
在这里插入图片描述
再次查看日志大小:
在这里插入图片描述
日志已经从之前的4K增大到了16M

一般按照企业要求对日志进行备份,这里我们将每天的日志进行备份:
将access.log改名为前一天的日期_access.log
并将此操作定时循环去执行就可实现对日志进行切割。
前一天的日期可通过变量的方式进行实现:

date +%F -d -1day

此命令可以实现对当前日期的前一天日期进行显示:
在这里插入图片描述
对前一天日志进行备份:

mv access.log `date +%F -d -1day`_access.log

在这里插入图片描述
执行命令:

../sbin/nginx -s reopen

表示重新打开一个access.log
将新的日志信息存放在access.log

此时access.log为空文件,验证是否存放新的日志信息:
对nginx进行访问,再次查看access.log:
在这里插入图片描述
可以看到,访问请求被成功记录到了access.log

同样的方法,也可以对error.log进行备份。

将备份的所有动作写进脚本,放进crotable每天定时定点执行。实现对日志的切割
脚本:

#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload

注意:编写完脚本后加执行权限!

创建定时任务:
执行命令:crontab -e创建定时任务

00 00 * * * /opt/nginx_log.sh &> /dev/null

nginx的压缩功能

当前的nginx默认发布页内容大小:
在这里插入图片描述
为保证实验效果明显,增加index.html的内容大小:
在这里插入图片描述
在浏览器对nginx默认发布页进行访问:
在这里插入图片描述
按F2调出调试按钮,可以看到当前页面内容大小为2.57M,转换内容为2.57M。实际上2.57M的文本页面已经不算小了,每次访问时,相当下载了2.57M的内容,如果内容稍微大一点,无疑访问就会变得特别慢,降低客户体验。
所以,nginx的压缩功能就能很好解决这一问题

配置gzip压缩

编辑nginx配置文件nginx/conf/nginx.conf
在这里插入图片描述gzip on 为打开gzip压缩
gzip_min_length 1:最小压缩长度(单位为kb)小于此值不压缩
gzip_comp_level :压缩等级(1~10)等级越高,压缩能立越强
gzip_types:压缩类型。

编辑玩成后,保存退出。
首先使用检测语法是否正确:

[root@localhost conf]# ./../sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

语法检测正确后再重加载nginx:
在这里插入图片描述

此时,清除浏览器缓存,再次访问nginx的默认发布页,按下F12打开调试页:
在这里插入图片描述
可以看到,此时内容大小依旧为2.57M,转换的大小为69.39KB
成功实现压缩。这也加速了用户访问页面的时间。

设置nginx使用systemd的启动方式

使用源码编辑安装后,每次启动时必须以脚本的方式进行启动。
这里可以修改nginx启动方式为systemctl:
在这里插入图片描述
可以看到,系统自带的服务都会放到/usr/lib/systemd/system

我们自己配置的服务官方不建议放在此目录,建议放到/etc/systemd/system目录

这里首先需要写nginx的启动脚本,可以将Apache的启动脚本当作模板进行就该即可:
在这里插入图片描述
首先将apache的启动脚本复制到/etc/systemd/system

cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/Nginx.service

在这里插入图片描述
编辑完成后,保存退出。
使用 ./../sbin/nginx -s reload重新加载nginx
再 ./…/sbin/nginx -s stop 关闭nginx。

这个时候就能使用systemctl的方式进行启动nginx:
在这里插入图片描述

关于nginx的配置文件

Nginx 的配置文件主要分为4部分:
main (全局设置) -> 此部分设置的指令将影响其它所有设置
server (主机设置) -> 主要用于指定 “主机” 和 “端口”
upstream (负载均衡设置) -> 用于负载均衡location (URL 匹配特定位置的设置)
location (URL 匹配特定位置的设置) -> 匹配网页文件的类型和位置

nginx的常用配置

配置方法都可以在nginx官网的文档中找到

实现后端负载均衡及健康检查

在这里插入图片描述
nginx主机:172.25.5.1
后端web服务器:172.25.5.3、172.25.5.4
编辑配置文件:
在这里插入图片描述
首先使用upstream定义后端服务器主机集群(默认调度算法为轮询)
然后在server字段进行调用

测试:

[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server4
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server4
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server4
[root@foundation5 usr]# curl 172.25.5.1
server3

nginx自带后端健康检查功能
测试:
关闭server4上的httpd,再次进行访问测试:

[root@server4 ~]# systemctl stop httpd
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3
[root@foundation5 usr]# curl 172.25.5.1
server3

开启nginx的用户及worker进程的数量

在这里插入图片描述
在这里插入图片描述
指定开启nginx的用户及组为nginx,nginx,编辑完成后保存退出

创建 nginx用户及nginx组:

useradd nginx

使用 ./../sbin/nginx -s reload重新加载nginx
查看nginx进程:
在这里插入图片描述
可以看到,开启该进程的用户为nginx,这里我们的虚拟机为单核,设置大于1的worker进程数没有意义。

最大连接数的修改

在这里插入图片描述

可以看到,默认的最大连接数为1024。nginx的最大支持为65535。 但是修改时,要注意此数值应小于系统限制的文件最大打开数(sysctl -a | grep file)。
或者为nginx服务创建nginx用户,在/etc/security/limits.conf添加限制信息:
在这里插入图片描述

注意:当nginx作为反向代理服务器时,此数字须除二(客户端对代理服务器的连接及代理服务器和后端服务器之间的连接)

nginx的一些并发优化

修改网络内核对TCP连接的有关限制

[root@server1 system]# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.ip_local_port_range = 1024 65535

此修改为临时修改,系统重启后就恢复原来的配置
可通过修改文件的方式进行永久修改:
编辑文件/etc/sysctl.conf
在这里插入图片描述
编辑完成后,使用命令sysctl --system使之生效。

修改限制接受新TCP连接侦听队列的大小

在这里插入图片描述

启用tcp连接timewait快速回收和利用

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_recycle = 1

在这里插入图片描述

使用epoll多路复用IO模型

在这里插入图片描述

开启文件高效传输模式

可防治网络和io阻塞
在这里插入图片描述

限流

限制并发连接

首先在外部进行压侧:10个并发,10个请求

[root@foundation5 ~]# ab -c10 -n10 http://172.25.5.1/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /index.html
Document Length:        612 bytes

Concurrency Level:      10
Time taken for tests:   0.003 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      8390 bytes
HTML transferred:       6120 bytes
Requests per second:    3225.81 [#/sec] (mean)
Time per request:       3.100 [ms] (mean)
Time per request:       0.310 [ms] (mean, across all concurrent requests)
Transfer rate:          2643.02 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     0    1   0.4      1       2
Waiting:        0    1   0.3      1       1
Total:          1    1   0.4      1       2

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      2
  98%      2
  99%      2
 100%      2 (longest request)

在nginx主机的nginx日志中可以看到,访问全部成功:

172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
172.25.5.250 - - [13/Aug/2020:14:45:31 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"

首先在配置文件中编辑:
在http字段里创建一个内存为10m的区域:

 limit_conn_zone $binary_remote_addr zone=addr:10m;

(不要写在server字段中,方便后边server调用)

在这里插入图片描述

定义解释:新定义访问目录/download/,在访问/download时,每个客户端来源只能建立一个并发连接.
测试:在外部压侧:

[root@foundation5 ~]# ab -c10 -n10 http://172.25.5.1/download/vim.jpg
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /download/vim.jpg
Document Length:        187870 bytes

Concurrency Level:      10
Time taken for tests:   0.003 seconds
Complete requests:      10
Failed requests:        7
   (Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Non-2xx responses:      7
Total transferred:      569083 bytes
HTML transferred:       567068 bytes
Requests per second:    3575.26 [#/sec] (mean)
Time per request:       2.797 [ms] (mean)
Time per request:       0.280 [ms] (mean, across all concurrent requests)
Transfer rate:          198693.28 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     0    1   0.2      1       1
Waiting:        0    1   0.1      1       1
Total:          1    1   0.2      1       2

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      2
  90%      2
  95%      2
  98%      2
  99%      2
 100%      2 (longest request)

可以看到,十次访问只成功了3次。
对比:一次并发,十个请求:

[root@foundation5 ~]# ab -c10 -n10 http://172.25.5.1/download/vim.jpg
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /download/vim.jpg
Document Length:        187870 bytes

Concurrency Level:      10
Time taken for tests:   0.003 seconds
Complete requests:      10
Failed requests:        7
   (Connect: 0, Receive: 0, Length: 7, Exceptions: 0)
Non-2xx responses:      7
Total transferred:      569083 bytes
HTML transferred:       567068 bytes
Requests per second:    3575.26 [#/sec] (mean)
Time per request:       2.797 [ms] (mean)
Time per request:       0.280 [ms] (mean, across all concurrent requests)
Transfer rate:          198693.28 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     0    1   0.2      1       1
Waiting:        0    1   0.1      1       1
Total:          1    1   0.2      1       2

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      2
  90%      2
  95%      2
  98%      2
  99%      2
 100%      2 (longest request)
[root@foundation5 ~]# ab -c1 -n10 http://172.25.5.1/download/vim.jpg
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /download/vim.jpg
Document Length:        187870 bytes

Concurrency Level:      1
Time taken for tests:   0.011 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      1881030 bytes
HTML transferred:       1878700 bytes
Requests per second:    922.42 [#/sec] (mean)
Time per request:       1.084 [ms] (mean)
Time per request:       1.084 [ms] (mean, across all concurrent requests)
Transfer rate:          169444.09 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     1    1   0.5      1       2
Waiting:        0    0   0.5      0       2
Total:          1    1   0.5      1       2

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      2
  98%      2
  99%      2
 100%      2 (longest request)

在一个并发的情况下,所有的访问都成功。

设定的限制生效!

带宽的限制

将访问的带宽限制在30k
在这里插入图片描述

可以看到,在访问时,我们在配置文件中限制的带宽起到了作用

[root@foundation5 ~]# ab -c1 -n10 http://172.25.5.1/download/vim.jpg
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /download/vim.jpg
Document Length:        187870 bytes

Concurrency Level:      1
Time taken for tests:   60.129 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      1881030 bytes
HTML transferred:       1878700 bytes
Requests per second:    0.17 [#/sec] (mean)
Time per request:       6012.948 [ms] (mean)
Time per request:       6012.948 [ms] (mean, across all concurrent requests)
Transfer rate:          30.55 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:  6012 6013   0.3   6013    6013
Waiting:        0    0   0.1      0       0
Total:       6013 6013   0.4   6013    6014

限制在单位时间内的连接请求

在http字段中定义:

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

在这里插入图片描述

  • 在首页index.html下添加limit_req zone=one ;参数(1秒钟只能处理一个请求)。
    reload enginx后再次测试:
[root@foundation5 ~]# ab -c1 -n10 http://172.25.5.1/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /index.html
Document Length:        612 bytes

Concurrency Level:      1
Time taken for tests:   0.003 seconds
Complete requests:      10
Failed requests:        9
   (Connect: 0, Receive: 0, Length: 9, Exceptions: 0)
Non-2xx responses:      9
Total transferred:      6977 bytes
HTML transferred:       5058 bytes
Requests per second:    3419.97 [#/sec] (mean)
Time per request:       0.292 [ms] (mean)
Time per request:       0.292 [ms] (mean, across all concurrent requests)
Transfer rate:          2330.19 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     0    0   0.1      0       0
Waiting:        0    0   0.1      0       0
Total:          0    0   0.2      0       1

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      1
  95%      1
  98%      1
  99%      1
 100%      1 (longest request)

可以看到,之成功了一次请求。限制生效!

  • 设置队列长度:
    在这里插入图片描述
    测试结果:
[root@foundation5 ~]# ab -c1 -n10 http://172.25.5.1/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /index.html
Document Length:        612 bytes

Concurrency Level:      1
Time taken for tests:   9.002 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      8390 bytes
HTML transferred:       6120 bytes
Requests per second:    1.11 [#/sec] (mean)
Time per request:       900.213 [ms] (mean)
Time per request:       900.213 [ms] (mean, across all concurrent requests)
Transfer rate:          0.91 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     1  900 316.0   1000    1002
Waiting:        0  900 316.0   1000    1002
Total:          1  900 315.9   1000    1002

Percentage of the requests served within a certain time (ms)
  50%   1000
  66%   1000
  75%   1000
  80%   1001
  90%   1002
  95%   1002
  98%   1002
  99%   1002
 100%   1002 (longest request)
  • 或者添加nodelay参数,只处理队列内的请求:
    在这里插入图片描述
    访问测试结果:
[root@foundation5 ~]# ab -c1 -n10 http://172.25.5.1/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.5.1 (be patient).....done


Server Software:        nginx/
Server Hostname:        172.25.5.1
Server Port:            80

Document Path:          /index.html
Document Length:        612 bytes

Concurrency Level:      1
Time taken for tests:   0.003 seconds
Complete requests:      10
Failed requests:        4
   (Connect: 0, Receive: 0, Length: 4, Exceptions: 0)
Non-2xx responses:      4
Total transferred:      7762 bytes
HTML transferred:       5648 bytes
Requests per second:    3537.32 [#/sec] (mean)
Time per request:       0.283 [ms] (mean)
Time per request:       0.283 [ms] (mean, across all concurrent requests)
Transfer rate:          2681.32 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     0    0   0.1      0       1
Waiting:        0    0   0.1      0       0
Total:          0    0   0.2      0       1

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      1
  95%      1
  98%      1
  99%      1
 100%      1 (longest request)

可以看到,成功6个(队列内5个)

ssl:

首先配置ssl模块:
在这里插入图片描述
接下来添加ssl的证书和key:

[root@server1 conf]# cd /etc/pk
pkcs11/ pki/    
[root@server1 conf]# cd /etc/pki/tls/certs/
[root@server1 certs]# ls
ca-bundle.crt  ca-bundle.trust.crt  make-dummy-cert  Makefile  renew-dummy-cert
[root@server1 certs]# make cert.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  cert.pem ; \
echo ""    >> cert.pem ; \
cat $PEM2 >> cert.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
..+++
..............................................................+++
writing new private key to '/tmp/openssl.zjdc0y'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn    
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:server1
Email Address []:root@localhost
[root@server1 certs]# ll c
ca-bundle.crt        ca-bundle.trust.crt  cert.pem
[root@server1 certs]# ll cert.pem 
-rw------- 1 root root 3096 Aug 16 10:04 cert.pem
[root@server1 certs]# cp cert.pem /usr/local/nginx/conf/

reload nginx后 测试:
在这里插入图片描述

自动索引

在nginx的httpd服务器下载一些东西时,一般需要将下载的资源路径写在浏览器的url框中,如果路径不全会访问失败。但是一般情况下,我们并不知道download目录中的资源名称,所以,需要加上自动索引的参数:
在这里插入图片描述
此时在访问默认发布页的download目录就能看到资源信息:
在这里插入图片描述

解决在访问nginx中碰到的中文乱码问题

在做自动索引时,有时会遇到中文资源名称乱码的问题,可以通过在http字段里添加utf-8字符集来优化:
在这里插入图片描述

缓存配置

如果在nginx服务器上通常一些不太常变的静态图片,在进行访问时,开启nginx缓存功能就不用每次对nginx的图片进行访问,起到加速的效果i。
配置:
在这里插入图片描述
测试:
在这里插入图片描述
缓存生效!
同时禁掉不必要日志信息:
在这里插入图片描述

禁用在nginx发布目录中的脚本

通常用户可能会上传一些脚本文件到nginx发布目录中,但是当调用执行脚本时,若是一些破坏性的脚本,就会对服务器产生危害,所以,一般会禁掉。

首先在download目录创建一个脚本,并给执行权限:
在这里插入图片描述

chmod +x script.sh

通过页面访问:
在这里插入图片描述

编辑配置文件:
在这里插入图片描述
reload nginx后再次进行访问:
在这里插入图片描述
设定生效!

访问限制

在这里插入图片描述
拒绝访问/download下的所有资源:
测试:
在这里插入图片描述

允许172.25.5.250访问:
在这里插入图片描述
测试:172.25.5.250访问:
在这里插入图片描述
其他主机:

 [root@server2 opt]# curl 172.25.5.1/download
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/</center>
</body>
</html>

限制某个ip的访问

在这里插入图片描述
当ip为172.25.5.250的主机访问默认发布页时直接返回403。
测试结果:
在这里插入图片描述

重定向

防止域名恶意解析到服务器ip

在这里插入图片描述
目前可以通过ip可以对服务器进行访问,但是一般情况下,为了防止恶意的解析,消耗流量,不允许用户直接通过ip对服务器进行访问。

对首页进行如下设置:
在这里插入图片描述
如果直接使用ip进行访问,直接返回500错误状态码。

reload nginx后,测试:
在这里插入图片描述

  • 也可以对其重定向:
    首先添加虚拟主机,别名为www.westos.org:
    在这里插入图片描述
    在主页设定当以ip的当时对服务器进行访问时,将其重定向到www.westos.org:
    在这里插入图片描述
    reload nginx后,测试:
    首先在测试主机上添加解析www.westos.org
    在这里插入图片描述
[root@foundation5 usr]# curl -I 172.25.5.1
HTTP/1.1 301 Moved Permanently     ##状态码301:重定向
Server: nginx/
Date: Sun, 16 Aug 2020 01:37:00 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: http://www.westos.org

80重定向到443

在这里插入图片描述
在这里插入图片描述

测试:

[root@foundation5 usr]# curl -I www.westos.org
HTTP/1.1 301 Moved Permanently
Server: nginx/
Date: Sun, 16 Aug 2020 02:25:42 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: https://www.westos.org/

网页重定向

首先创建一个虚拟主机,bbs.westos.org:
在这里插入图片描述
创建其发布目录和发布页面,发布页:
在这里插入图片描述
重定向:
在这里插入图片描述
测试:

[root@foundation5 usr]# curl -I www.westos.org/bbs
HTTP/1.1 301 Moved Permanently
Server: nginx/
Date: Sun, 16 Aug 2020 02:49:42 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: http://bbs.westos.org

bbs的重定向成功!但是在访问bbs后的页面时不会重定向:

[root@foundation5 usr]# curl -I www.westos.org/bbs/index.html
HTTP/1.1 404 Not Found
Server: nginx/
Date: Sun, 16 Aug 2020 02:51:37 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 147
Connection: keep-alive

在重定向时,需要接收后边的内容:
在这里插入图片描述
测试:

[root@foundation5 usr]# curl -I www.westos.org/bbs/index.html
HTTP/1.1 301 Moved Permanently
Server: nginx/
Date: Sun, 16 Aug 2020 02:56:50 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive
Location: http://bbs.westos.org/index.html

在这里插入图片描述

防盗链

盗链

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

在server1的默认发布页放上资源图vim.jpg
能够正常访问:
在这里插入图片描述
在server3上的nginx发布目录中,新建文件test.html:

<html>
<body>
<img src="http://www.westos.org/vim.jpg">
</body>
</html>

启动nginx,测试:
在这里插入图片描述
可以看到,server3成功盗链。

防盗连

编辑资源nginx主机配置文件:
在这里插入图片描述
reload nginx后,测试:
在这里插入图片描述

成功防盗链,一般情况下,我们也可以对其进行重定向,定向到不属于我们站点的地址或者定向到自己的公司宣传页面反手为自己打一波广告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值