一、Nginx常见报错问题处理实验要求
本案例要求对Nginx服务器进行适当优化,解决如下问题,以提升服务器的处理性能: 如何自定义返回给客户端的404错误页面如何查看服务器状态信息如果客户端访问服务器提示“Too many open files”如何解决如何解决客户端访问头部信息过长的问题如何让客户端浏览器缓存数据客户机访问此Web服务器验证效果:使用ab压力测试软件测试并发量编写测试脚本生成长头部信息的访问请求客户端访问不存在的页面,测试404错误页面是否重定向
自定义报错页面
HTTP常见状态码列表:
200 正常
301 & 302 重定向
400 请求语法错误
401 访问被拒绝
403 禁止访问
404 资源找不到
414 请求URI头部太长
500 服务器内部错误
502 代理服务器无法正常获取下一个服务器正常的应答1)优化前,客户端使用浏览器访问不存在的页面192.168.99.5/xxxxxxx,会提示404文件未找到2)修改Nginx配置文件,自定义报错页面
[root@proxy ~]# cd /usr/local/nginx
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf #还原配置文件
[root@proxy nginx]# vim conf/nginx.conf
...charset utf-8; #仅在需要中文时修改该选项,可以识别中文
...
error_page 404 /404.html; #当网站发生404报错时,给用户看的页面
.. ..
[root@proxy nginx]# echo "抱歉!您访问的页面不存在呢?" > html/404.html
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload
3)客户端再次使用浏览器访问不存在的页面,看到的优化过的内容
查看nginx服务状态信息
如何查看nginx服务网站的状态信息(非常重要的功能)1)编译安装时使用--with-http_stub_status_module开启状态页面模块
如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序
[root@proxy nginx]# killall nginx
[root@proxy nginx]# cd /root/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure --with-stream --with-http_stub_status_module #--with-stream开启4层代理模块,--with-http_stub_status_module开启status状态页面
[root@proxy nginx-1.22.1]# make #编译,不用执行make install安装,之间已经安装过
[root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/ #覆盖原文件
cp: overwrite '/usr/local/nginx/sbin/nginx'? y
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
configure arguments: --with-stream --with-http_stub_status_module2)修改Nginx配置文件,定义状态页面
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
....server {listen 80;server_name localhost;location /status { #定义状态页面stub_status on;}charset utf-8;
....
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx4)查看状态页面信息
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status
Active connections: 1
server accepts handled requests1 1 1
Reading: 0 Writing: 1 Waiting: 0Active connections:当前活动的连接数量,有多少人访问网站
Accepts:已经接受客户端的连接总数量,有多少人曾经来过
Handled:已经处理客户端的连接总数量
Requests:客户端发送的请求数量
Reading:当前服务器正在读取客户端请求头的数量,请求头:客户现在正在发的请求,要看什么页面,要求服务器传过去
Writing:当前服务器正在写响应信息的数量,指服务器正在给客户回应信息
Waiting:当前多少客户端在等待服务器的响应,如果想要只允许自己访问,看到nginx的状态信息,其他人不能看到,可以做以下配置
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
....server {listen 80;server_name localhost;location /status { #定义状态页面stub_status on;allow 192.168.99.5; #允许99.5访问deny all; #其他人全部拒绝}charset utf-8;
....
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload
命令行测试
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status #可以访问
真机浏览器测试,失败
补充知识:PV(Page View):页面浏览量,即网站页面在一定时间内被访问的页面总次数,相同用户刷新相同页面也被计算一次,反映了用户对网站内容的浏览情况,可以通过访问日志得到。
UV(Unique Visitor):独立访客数,统计一定周期内,访问网站的独立用户数量,不重复计算同一用户的多次访问。可以通过访问日志或根据用户的唯一标识去重得到PV与UV都是衡量业务活跃度的重要指标,尤其网站改版升级后,可以进行对比来判断业务情况
优化Nginx并发量
1)优化前使用ab高并发测试,使用web1主机作为海量客户,访问proxy主机
[root@web1 ~]# ab -n 100 -c 100 http://192.168.99.5/ #-n任务量,-c是连接数
....
Percentage of the requests served within a certain time (ms)50% 366% 375% 380% 490% 495% 498% 499% 4100% 4 (longest request) 数字代表多少毫秒执行完[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
...Benchmarking 192.168.99.5 (be patient)
socket: Too many open files (24) #失败,因为是linux系统有限制,限制文件打开数量10242)优化Linux内核参数(最大文件数量)
[root@web1 ~]# ulimit -n #查看最大文件数量
1024
[root@web1 ~]# ulimit -n 100000 #临时设置最大文件数量3)优化后测试服务器并发量,成功
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
.. ..98% 87199% 872100% 1692 (longest request)永久设置最大文件数量(知晓即可,无须操作)
[root@web1 ~]# vim /etc/security/limits.conf
.. ..
* soft nofile 100000
* hard nofile 100000
# End of file#该配置文件分4列,分别如下:
#用户或组 软限制或硬限制 需要限制的项目 限制的值
重启系统生效proxy主机修改Nginx配置文件,增加并发量(知晓即可)
[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
.. ..#user nobody;worker_processes 2; #与CPU核心数量一致
.. ..events {worker_connections 50000;}
.. ..
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload
优化Nginx数据包头缓存
支持超长地址
1)优化前,使用脚本测试超长头部请求是否能获得响应
默认情况下nginx无法支持长地址栏,会报414错误
[root@proxy nginx-1.22.1]# cd /root/lnmp_soft/
[root@proxy lnmp_soft]# cat buffer.sh
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
doURL=${URL}v$i=$i
done
curl $URL #经过5000次循环后,生成一个超长的URL地址
[root@proxy lnmp_soft]# ./buffer.sh
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center> #访问失败
<hr><center>nginx/1.22.1</center>
</body>
</html> 2)修改Nginx配置文件,增加数据包头部缓存大小
[root@proxy lnmp_soft]# cd /usr/local/nginx
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf #还原配置文件
[root@proxy nginx]# vim conf/nginx.conf
.. ..
http {client_header_buffer_size 200k; #添加,请求包头信息的缓存大小large_client_header_buffers 4 200k; #添加,大请求包头部信息的缓存个数与容量include mime.types;default_type application/octet-stream;
.. ..
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload3)优化后,使用脚本测试超长头部请求是否能获得响应
[root@proxy nginx]# /root/lnmp_soft/buffer.sh #成功
浏览器本地缓存静态数据
1)使用Firefox浏览器查看缓存
以Firefox浏览器为例,在Firefox地址栏内输入about:cache将显示Firefox浏览器的缓存信息,点击List Cache Entries可以查看详细信息;可以看到自己曾经访问网站缓存到自己电脑里面的数据
一、Nginx常见报错问题处理
实验要求
本案例要求对Nginx服务器进行适当优化,解决如下问题,以提升服务器的处理性能:
如何自定义返回给客户端的404错误页面
如何查看服务器状态信息
如果客户端访问服务器提示“Too many open files”如何解决
如何解决客户端访问头部信息过长的问题
如何让客户端浏览器缓存数据
客户机访问此Web服务器验证效果:
使用ab压力测试软件测试并发量
编写测试脚本生成长头部信息的访问请求
客户端访问不存在的页面,测试404错误页面是否重定向
自定义报错页面
HTTP常见状态码列表:
200 正常
301 & 302 重定向
400 请求语法错误
401 访问被拒绝
403 禁止访问
404 资源找不到
414 请求URI头部太长
500 服务器内部错误
502 代理服务器无法正常获取下一个服务器正常的应答
1)优化前,客户端使用浏览器访问不存在的页面192.168.99.5/xxxxxxx,会提示404文件未找到
2)修改Nginx配置文件,自定义报错页面
[root@proxy ~]# cd /usr/local/nginx
[root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf #还原配置文件
[root@proxy nginx]# vim conf/nginx.conf
...
charset utf-8; #仅在需要中文时修改该选项,可以识别中文
...
error_page 404 /404.html; #当网站发生404报错时,给用户看的页面
.. ..
[root@proxy nginx]# echo "抱歉!您访问的页面不存在呢?" > html/404.html
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload
3)客户端再次使用浏览器访问不存在的页面,看到的优化过的内容
查看nginx服务状态信息
如何查看nginx服务网站的状态信息(非常重要的功能)
1)编译安装时使用--with-http_stub_status_module开启状态页面模块
如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序
[root@proxy nginx]# killall nginx
[root@proxy nginx]# cd /root/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure --with-stream --with-http_stub_status_module #--with-stream开启4层代理模块,--with-http_stub_status_module开启status状态页面
[root@proxy nginx-1.22.1]# make #编译,不用执行make install安装,之间已经安装过
[root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/ #覆盖原文件
cp: overwrite '/usr/local/nginx/sbin/nginx'? y
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
configure arguments: --with-stream --with-http_stub_status_module
2)修改Nginx配置文件,定义状态页面
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name localhost;
location /status { #定义状态页面
stub_status on;
}
charset utf-8;
....
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx
4)查看状态页面信息
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量,有多少人访问网站
Accepts:已经接受客户端的连接总数量,有多少人曾经来过
Handled:已经处理客户端的连接总数量
Requests:客户端发送的请求数量
Reading:当前服务器正在读取客户端请求头的数量,请求头:客户现在正在发的请求,要看什么页面,要求服务器传过去
Writing:当前服务器正在写响应信息的数量,指服务器正在给客户回应信息
Waiting:当前多少客户端在等待服务器的响应,
如果想要只允许自己访问,看到nginx的状态信息,其他人不能看到,可以做以下配置
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name localhost;
location /status { #定义状态页面
stub_status on;
allow 192.168.99.5; #允许99.5访问
deny all; #其他人全部拒绝
}
charset utf-8;
....
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload
命令行测试
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status #可以访问
真机浏览器测试,失败
补充知识:
PV(Page View):页面浏览量,即网站页面在一定时间内被访问的页面总次数,相同用户刷新相同页面也被计算一次,反映了用户对网站内容的浏览情况,可以通过访问日志得到。
UV(Unique Visitor):独立访客数,统计一定周期内,访问网站的独立用户数量,不重复计算同一用户的多次访问。可以通过访问日志或根据用户的唯一标识去重得到
PV与UV都是衡量业务活跃度的重要指标,尤其网站改版升级后,可以进行对比来判断业务情况
优化Nginx并发量
1)优化前使用ab高并发测试,使用web1主机作为海量客户,访问proxy主机
[root@web1 ~]# ab -n 100 -c 100 http://192.168.99.5/ #-n任务量,-c是连接数
....
Percentage of the requests served within a certain time (ms)
50% 3
66% 3
75% 3
80% 4
90% 4
95% 4
98% 4
99% 4
100% 4 (longest request) 数字代表多少毫秒执行完
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
...
Benchmarking 192.168.99.5 (be patient)
socket: Too many open files (24) #失败,因为是linux系统有限制,限制文件打开数量1024
2)优化Linux内核参数(最大文件数量)
[root@web1 ~]# ulimit -n #查看最大文件数量
1024
[root@web1 ~]# ulimit -n 100000 #临时设置最大文件数量
3)优化后测试服务器并发量,成功
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
.. ..
98% 871
99% 872
100% 1692 (longest request)
永久设置最大文件数量(知晓即可,无须操作)
[root@web1 ~]# vim /etc/security/limits.conf
.. ..
* soft nofile 100000
* hard nofile 100000
# End of file
#该配置文件分4列,分别如下:
#用户或组 软限制或硬限制 需要限制的项目 限制的值
重启系统生效
proxy主机修改Nginx配置文件,增加并发量(知晓即可)
[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
.. ..
#user nobody;
worker_processes 2; #与CPU核心数量一致
.. ..
events {
worker_connections 50000;
}
.. ..
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload
优化Nginx数据包头缓存
支持超长地址
1)优化前,使用脚本测试超长头部请求是否能获得响应
默认情况下nginx无法支持长地址栏,会报414错误
[root@proxy nginx-1.22.1]# cd /root/lnmp_soft/
[root@proxy lnmp_soft]# cat buffer.sh
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL #经过5000次循环后,生成一个超长的URL地址
[root@proxy lnmp_soft]# ./buffer.sh
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center> #访问失败
<hr><center>nginx/1.22.1</center>
</body>
</html>