Nginx的常见问题处理

Nginx的常见问题处理(优化)

一、需求

本案例要求对Nginx服务器进行适当优化,解决如下问题,以提升服务器的处理性能;

  • 如何自定义返回给客户端的404错误页面
  • 如何查看服务器状态信息
  • 如果客户端访问服务器提示“Too many open files”如何解决
  • 如何解决客户端访问头部信息过长的问题
  • 如何让客户端浏览器缓存数据
  • 日志切割
  • 开启gzip压缩功能,提高数据传输效率
  • 开启文件缓存功能

然后使用客户机访问此web服务器验证效果

  • 使用ab压力测试软件测试并发量
  • 编写测试脚本生成头部信息的访问请求
  • 客户端访问不存在的页面,测试404错误页面是否重定向

二、方案:

优化前,先进行测试,去访问一个不存在的界面,
在这里插入图片描述

1.自定义报错页面

1)修改配置文件,自定义报错页面

vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
}
#下面两行需要添加
charset utf-8;      #仅在需要中文时加入该选项
error_page  404   /404.html;  #自定义错误页面
}
...
echo "您访问的页面不存在" > /usr/local/nginx/html/404.html 
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload

2)优化后,客户端访问不存在的页面,会提示自己定义的404.html页面

开始测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIC2OiDE-1630683326791)(E:\Typort\image-20210903114047368.png)]

2.如何查看服务器状态信息(非常重要的功能)

常见http状态码

状态码功能描述
200一切正常
301永久重定向
302临时重定向
401用户名或密码错误
403禁止访问(客户端ip被拒绝)
404文件不存在
414请求URL头部过长
500服务器内部错误
502Bad Gateway(集群出现问题)

1)编译安装时,使用–wIth-http_stub_status_module开启状态页面模块

cd nginx-1.20.1/
./configure \
 --with-http_ssl_module \       #开启ssl加密功能  --with-模块名称
 --with-stream \    #开启TCP/UDP代理模块
 --with-http_stub_status_module    #开启status状态
 make && make install

nginx

  • 并发量
  • 总连接数
  • 等待
  • pv(page view 查看次数),uv(user view 用户量)

2)启用Nginx服务并查看监听端口状态

ss命令可以查看系统中启动的端口信息,给命令常用选项

  • -a 显示所有端口的信息
  • -n 以数字格式显示端口号
  • -t 显示TCP连接的端口
  • -u显示UDP连接的端口
  • -l 显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
  • -p 显示监听端口的服务名称是什么(也就是程序名称)
ss -anptu | grep nginx

3)修改配置文件,定义状态页面

vim /usr/local/nginx/conf/nginx.conf
 ...
 在servver中单独添加
 location /status {
            stub_status on;
            #allow ip地址  允许谁能看
            #deny IP 地址   不允许谁看
        }
...
重新加载
/usr/local/nginx/sbin/nginx -s reload

4)优化后,查看状态页面信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHMTvUTV-1630683326794)(E:\Typort\image-20210903144120376.png)]

  • activa connections:当前活动的连接数量(并发连接数)
  • server accepts 已经接收客户端的连接总数量
  • server handled 已经处理客户端的连接总数量(一般与accepts一致,除非服务器限制了连接)
  • server requests:客户端发送的请求数量
  • reading:当前服务器正在读取客户端请求
  • writing:当前服务器正在写响应信息的数量

3.优化并发量

1)优化前使用ab高并发测试

ab -n 2000 -c 2000 http://192.168.19.100/
c:多少人  n:所有人所有的访问量
ab模拟2000个人访问2000次

访问200

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npFX9W7t-1630683326796)(E:/Typort/image-20210903150541091.png)]

访问2000

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6RmxRgxY-1630683326797)(E:/Typort/image-20210903150602933.png)]

我们的网站并不能支持2000人的同时访问,所以我们要做优化

2)修改配置文件,增加并发量

vim /usr/local/nginx/conf/nginx.conf
...
worker_processes  2;   #与cpu核心数量一致
events {
    worker_connections  65535;  #每个worker最大的进程数量
}
#worker为nginx实际工作者
...
重新加载
/usr/local/nginx/sbin/nginx -s reload

3)优化Linux内核参数(最大文件数量)

ulimit -a #查看所有属性值
ulimit -Hn 100000  #设置硬限制(硬限制,超过会报错)
ulimit -Sn 100000  #设置软限制(软限制超过会警告)
#使用ulimit是临时修改规则,重启之后就会失效
#永久修改
vim /etc/security/limits.conf
...
*    soft  nofile  100000
*    hard  nofile  100000
# 该配置文件分为4列,分别如下
#用户或组    硬限制或者软限制    需要限制的项目     限制的值
#改完之后,并不会立即生效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qgfy9rQx-1630683326798)(E:/Typort/image-20210903211902705.png)]

open files 打开文件上限

4)优化后再次测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcfwsX8S-1630683326799)(E:/Typort/image-20210903213237861.png)]

成功执行

4.优化Nginx数据包头缓存

1)优化前,先使用脚本测试长头部请求是否能获得响应

vim buffer.sh
#! /bin/bash
URL=http://192.168.19.100/index.html?
for i in {1..5000}
do
        URL=${URL}v$i=$i   
        #例:url=192.168.19.100v1=1
        #url=192.168.19.100v1=1v2=2
done
curl $URL    #经过5000次追加URL
#添加执行权限
chmod o+x buffer.sh
./buffer.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jqVHlNk-1630683326800)(E:/Typort/image-20210903213524904.png)]

414错误,一般是这个数据包头太大了,或者说服务器的nginx服务内存太小

2)修改Nginx配置文件,增加数据包头部缓存大小

vim /usr/local/nginx/conf/nginx.conf
...
http {
 client_header_buffer_size 1k;   #默认请求报头信息的缓存
 #large_client_header_buffers 4 4k;    #大请求包头部信息的缓存个数与容量
large_client_header_buffers 4 1m;  
#上面的4k一般在生产环境中足够使用,但是我们使用的脚本有5000次循环,所以使用4个1m
重新加载
/usr/local/nginx/sbin/nginx -s reload

3)再次执行脚本,再次测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2S09aQr-1630683326801)(E:/Typort/image-20210903215021114.png)]

5.浏览器本地缓存静态数据

1)使用谷歌浏览器查看缓存

以firefox为例,在地址栏输入about:cache将显示浏览器的缓存信息

2)修改Nginx配置文件,定义对静态页面的缓存时间

vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { #缓存格式
expires  30d;   #定义客户端缓存时间为30天
}
}
上传一张图片到我们的nginx服务器
重新加载
/usr/local/nginx/sbin/nginx -s reload

3)优化后,使用浏览器访问图片,再次查看缓存信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyZKRqDL-1630683326803)(E:/Typort/image-20210903223624744.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBk2ZJks-1630683326803)(E:/Typort/image-20210903224106628.png)]

状态304重定向到我们自己的电脑,这张图片已经缓存了,所以不需要再次下载

6.日志切割

日志文件越来越大怎么办,单个文件10G?如何切割(这也是常见的面试题)

  • 把旧的日志重命名
  • kill USR1 PID(当前nginx的进程pid号)

kill 的多种使用方法

  • kill 给某个进程发送信号
  • kil pid (默认参数15)
  • kill -9 pid(强制关闭的通知)
  • kill -USR1 pid(通知这个进程的日志拿走了 = kill 10)
  • kill 19 pid 放到后台暂停执行

1)手动执行

备注:/usr/local/logs/nginx.pid文件中存放的是nginx的pid号

mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access2.log
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

2)自动执行

在每周5的03点03分自动执行脚本完成日志切割工作

vim /usr/local/nginx/logbak.sh
#! /bin/bash
date=`date +%Y%m%d`
logpath= /usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log  $logpath/errot-$date.log
kill -USR1 $(cat $logpath/nginx.pid)

chmod o+x /usr/local/nginx/logbak.sh
crontab -e
03 03 * * 5 /usr/local/nginx/logbak.sh

7.对页面进行压缩处理

相同文件大小,启用压缩能使客户端使用更少的流量和时间能得到相同的文件

1)修改nginx配置文件

vim /usr/local/nginx/conf/nginx.conf
...
http {
...
gzip on;   #开启压缩
gzip_min_length 1000;  #小文件不压缩,小于1000字节的不压缩
gzip_comp_level 4;  #压缩比例,数字越高,压缩比例预告,最高为9
gzip_types test/plain test/css applicatio/json application/x-javascript text
#对特定的文件压缩,详情参考conf下的mime.types
#仅对特定的文件压缩,不要对多媒体文件压缩(MP3,MP4,flv)
#文本文档都能压缩,pdf
}

目前所有的浏览器自带解压功能,所以从服务器上下载的压缩文件,在浏览器上会自动解压,提高我们的访问速度

8.服务器内存缓存

如果需要处理大量的静态文件,可以将文件缓存在内存,客户端访问会更快

vim /usr/local/nginx/conf/nginx.conf
...
http {
open_file_cache   max=2000    inactive=20;
	open_file_cache_valid 60s;
	open_file_cache_min_uses 5;
	open_file_cache_errors off;
#设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
#文件句柄的有效时间是60s,60s后过期
#只有访问次数超过5次会被缓存
#关闭缓存报错,缓存出现问题,可能是因为过期等等问题,解决方法重新读入

服务器内存缓存

如果需要处理大量的静态文件,可以将文件缓存在内存,客户端访问会更快

vim /usr/local/nginx/conf/nginx.conf
...
http {
open_file_cache   max=2000    inactive=20;
	open_file_cache_valid 60s;
	open_file_cache_min_uses 5;
	open_file_cache_errors off;
#设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
#文件句柄的有效时间是60s,60s后过期
#只有访问次数超过5次会被缓存
#关闭缓存报错,缓存出现问题,可能是因为过期等等问题,解决方法重新读入
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值