文章目录
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页面
开始测试
2.如何查看服务器状态信息(非常重要的功能)
常见http状态码
状态码 | 功能描述 |
---|---|
200 | 一切正常 |
301 | 永久重定向 |
302 | 临时重定向 |
401 | 用户名或密码错误 |
403 | 禁止访问(客户端ip被拒绝) |
404 | 文件不存在 |
414 | 请求URL头部过长 |
500 | 服务器内部错误 |
502 | Bad 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)优化后,查看状态页面信息
- 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
访问2000
我们的网站并不能支持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列,分别如下
#用户或组 硬限制或者软限制 需要限制的项目 限制的值
#改完之后,并不会立即生效
open files 打开文件上限
4)优化后再次测试
成功执行
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
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)再次执行脚本,再次测试
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)优化后,使用浏览器访问图片,再次查看缓存信息
状态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次会被缓存
#关闭缓存报错,缓存出现问题,可能是因为过期等等问题,解决方法重新读入