👨🏻‍🎓博主介绍:大家好!我是李大白,一名运维容器运维工程师,热爱分享知识🌟 

🌈擅长领域:云原生、数据库、自动化运维

🙏🏻如果本文章对小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏!

🤝如果在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

🍂 落叶而知秋,博闻而强识!

📕  精品专栏:Harbor大白话(企业级)

Nginx高级篇-性能优化_运维



隐藏版本号

如果用户访问nginx一个不存在的页面,就会暴露nginx的版本号。暴露nginx的版本号,就会被***者利用该版本的一些漏洞进行***。所以为了nginx的安全,非常有必要对nginx的版本号进行隐藏,防止被针对性的进行***。

🐖:使用源码安装,在安装前修改源码。

Nginx高级篇-性能优化_nginx_02

  • 修改配置文件
$ vim conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; # 在http全局块添加该指令
...
  • 重启nginx
$ /usr/local/nginx/sbin/nginx  -s reload

Nginx高级篇-性能优化_运维_03

可以看到版本号已经被隐藏了!


自定义Nginx版本信息

出于开发需要,我们希望显示自定义的Nginx版本信息。如果想自定义响应报文的nginx版本信息,需要修改安装文件源码文件,并重新编译安装

  • 修改 src/core/nginx.h 修改第13-14行
[root@ceph1 nginx-1.5.8]# vim src/core/nginx.h
#define NGINX_VERSION "2022.05.2" # 想要显示的版本号
#define NGINX_VER "lidabai/" NGINX_VERSION
#define NGINX_VAR "Dabai"
  • 修改.src/http/ngx_http_special_response.c文件49行
[root@ceph1 nginx-1.5.8]# vim src/http/ngx_http_special_response.c 
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
  • 重新编译源码
$ pwd
/app/nginx-1.5.8
$ ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module
$ make && make install
  • 启动nginx
[root@ceph1 nginx-1.5.8]# /usr/local/nginx/sbin/nginx

Nginx高级篇-性能优化_日志文件_04


Nginx日志切割

随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件的大小,太大的日志文件对监控是一个大灾难,所以需要定期进行日志文件的切割(自动)。

Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割。


  • 编写shell脚本
$ cat <<EOF >  nginx-log-cutting.sh
#!/bin/bash

Date=$(date +%Y-%m-%d) #获取今天的日期(格式:2022-05-02)
log_Path=/usr/local/nginx/logs # 日志文件的路径
mv $log_Path/access.log $log_Path/access-$Date.log #切割业务日志
mv $log_Path/error.log $log_Path/error-$Date.log # 切割错误日志
kill -USR 1 $(cat $log_Path/nginx.pid) # 发送信号生产新的日志文件
find $log_Path -mtime +30 | xargs rm -rf #'删除30天前的日志'
EOF
  • 执行shell脚本
$ sudo chmod +x  nginx-log-cutting.sh
$ sh nginx-log-cutting.sh
编写计划任务,每天切割一次,日志文件产生比较多的可以1小时切割1次


Linux内核参数优化

$ cat <<EOF >> /etc/sysctl.conf
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
EOF
$ sysctl -p
  • net.core.netdev_max_backlog: 

表示当每个网络接口接收数据包的速率比内核处理这些数据包的速率快时,允许发送到队列的数据包的最大数量(默认128)。

  • net.core.somaxconn:

系统同时发起的TCP连接数(默认128)。

在客户端存在高并发请求的情况下,该默认值较小可能导致连接超时或重传问题。可根据实际业务场景调节该值。

  • net.ipv4.tcp_max_orphans:

设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上。

如果超过该值,没有与用户文件句柄关联的TCP套接字将立即被复位,同时给出告警信息。该限制只是为了防止简单的Dos(拒绝服务)。在内存充足情况下可调大该值。

  • net.ipv4.tcp_max_syn_backlog:

记录尚未收到客户端确认信息的连接请求的最大值。

  • net.ipv4.tcp_timestamps:

禁用对TCP时间戳的支持,可避免序列号的绕卷。

  • net.ipv4.tcp_synack_retries:

设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量。值为1则表示内核放弃连接之前发送1次SYN+ACK包。

  • net.ipv4.tcp_syn_retries:

设置内核放弃建立连接之前发送SYN包的数量。


性能优化—Gzip压缩

修改配置文件

$ vim  conf/nginx.conf
...
http { # 在http全局块配置
gzip on; # 开启Gzip功能,
gzip_buffers 32 4k; #设置gzip压缩文件使用缓存空间的大小,32指服务器向系统申请缓存空间的个数,4k指每个缓存空间的大小;
gzip_comp_level 6; #压缩程度(1~9),值越高,压缩程度越高,压缩效率就越低越废时间;
gzip_disable 服务器标识; # 针对不同客户端发起的请求,可选择性的开启/关闭Gzip功能,服务器标志(UA)可见百度;
gzip_http_version 1.0|1.1; #开启Gzip功能的最低HTTP协议版本;
gzip_min_length 1k; #设置页面的字节数,当响应页面的大小大于该值时才启用Gzip功能,防止压缩很小的数据会出现越压缩数据量越大的情况;
gzip_proxied off; #设置nginx服务器是否对后端服务器返回的结果进行Gzip压缩(配置反向代理才有效)
gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;
#支持压缩的格式
gzip_vary on; #选择支持very header可以让前端的缓存服务器缓存经过gzip压缩的页面


Nginx高级篇-性能优化_日志文件_05