文章目录
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后,测试:
成功防盗链,一般情况下,我们也可以对其进行重定向,定向到不属于我们站点的地址或者定向到自己的公司宣传页面反手为自己打一波广告。