一、Nginx常见报错问题处理

一、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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19643.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何确保Python爬虫程序的稳定性和安全性?

在当今数字化时代&#xff0c;Python爬虫被广泛应用于数据采集和信息抓取。然而&#xff0c;确保爬虫程序的稳定性和安全性是开发过程中的重要考虑因素。本文将探讨如何通过技术手段和最佳实践来提高Python爬虫的稳定性和安全性&#xff0c;并提供代码示例。 稳定性保障 1. 异…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…

基于智能推荐的图书电商系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

JavaScript实现Promise

第一步&#xff1a;编写constructor构造方法 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#state PENDING;#result undefined;constructor(executor) {const resolve (data) > {this.#changeState(FULFILLED, data…

物理 + 人工智能 = 2024年诺贝尔物理学奖

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、机器学习与神经网络的发展前景 二、机器学习和神经网络的研究与传统物理学的关系 结…

C++:异常

1. 异常的概念 C语言主要通过错误码的方式处理错误&#xff0c;错误码本质上就是对错误信息进行分类编号&#xff0c;拿到错误码以后还要去查询错误信息&#xff0c;比较麻烦。异常时抛出一个对象&#xff0c;这个对象可以涵盖更全面的信息。 异常处理机制允许程序中独立开发的…

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的&#xff1a; 本实验通过手动输入二叉树结点信息&#xff0c;构建相应的二叉树&#xff0c;并通过图形化界面动态演示先序遍历算法的过程。通过本次实验&#xff0c;我可以深入理解二叉树的数据结构、先序遍历算法…

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 &#xff0c;文末自助获取源码 \color{red}{T624&#xff0c;文末自助获取源码} T624&#xff0c;文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境&#xff0c;在Linux下对编译链接理解&#xff0c;较为简短&#xff0c;着重在于编译的步骤。 C的环境 在ANSI C&#xff08;标准C语言&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff1a;在这个环境中&#xff0c;源代码…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

快速上手Mybatis Plus并速通MybatisPlus所有知识点

目录 一、简介 1.1 概况 1.2 特性 二、快速入门 1.建表 2.引依赖 3.application.ymal文件 4.定义mapper继承BaseMapper 5.总结 三、Mybatis Plus的使用 1.常见注解 1.1 TableName 1.2 TableId 1.3 TableField 2.常见配置 3.BaseMapper的基础CRUD方法 4.Wrapper…

使用代理解决前端跨域问题详解

目录 前言1. 什么是跨域问题&#xff1f;1.1 同源策略的定义1.2 跨域问题的表现 2. 解决跨域问题的常见方法3. 在 Vite 中配置代理解决跨域问题3.1 环境准备3.2 配置代理3.2.1 配置基础路径3.2.2 配置 Vite 代理3.2.3 参数解释 3.3 验证代理功能 4. 深入分析与注意事项4.1 代理…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

查看台式机主机支持的最大分辨率 | 显卡和显示器

通过检查显卡规格和型号&#xff0c;确认主机支持最大分辨率。 方法1&#xff1a;设置 在设置 -> 系统 -> 屏幕 及其内的高级显示设置 设置 -> 显示 方法2&#xff1a;cmd 在运行中输入“devmgmt.msc”&#xff0c;进入设备管理器界面&#xff0c;点击展开“显示适配…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时&#xff0c;根据HN Public Key把SUPI加密成SUCI&#xff0c;并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证&#xff0c;并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI&#xff0c;并保…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板&#xff0c;支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

企业数字化转型的战略指南:物联网与微服务架构的深度融合及应用解析

新时代下的企业数字化转型挑战与机遇 在当前全球经济和技术迅猛发展的背景下&#xff0c;企业数字化转型成为保持竞争力和创新的关键战略。物联网&#xff08;IoT&#xff09; 的兴起为企业提供了无数新的数据来源和运营模式&#xff0c;然而&#xff0c;如何有效整合这些数据…

vue3+vant实现弹幕循环播放~

1、效果图 <!-- 弹幕 --> <div style"height: 88px"><van-barragev-model"list"duration"5000":rows"rows":gap"gap":loop"loop"style"--move-distance: -345px" ><div class&quo…

字母异位词分组(java)

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单shilie 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "n…