【Day12】Nginx实战训练营

本文详细介绍了Nginx的日志配置,包括如何配置访问日志、过滤指定文件、日志切割,以及一系列的Nginx优化参数调整,如worker进程、http和tcp连接、buffer和cache、压缩、日志优化和SSL优化,旨在提升服务器性能和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

45、配置 Nginx 访问日志

web服务器的访问日志是非常重要的,我们可以通过访问日志来分析用户的访问情况,
也可以通过访问日志发现一些异常访问,比如cc攻击。

格式: access_log /path/to/logfile format;

access_log 可以配置到 http, server, location 配置段中。

  • 配置示例
server 
{
    listen 80;
    server_name www.1.com;
    root /data/wwwroot/www.1.com;
    index index.html index.php;
    access_log /data/logs/www.1.com_access.log main;
}

说明: 若不指定log_format,则按照默认的格式写日志。

资料:
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/acclog.md

46、Nginx 日志过滤指定文件

一个网站,会包含很多元素,尤其是有大量的图片、js、css等静态元素。
这样的请求其实可以不用记录日志。

  • 配置示例
location ~* ^.+\.(gif|jpg|png|css|js)$ 
{
    access_log off;
}

或
location ~* ^.+\.(gif|jpg|png|css|js)$                                      
{
    access_log /dev/null;
}

47、Nginx 日志切割

如果任由访问日志写下去,日志文件会变得越来越大,甚至是写满磁盘。
所以,我们需要想办法把日志做切割,比如每天生成一个新的日志,旧的日志按规定时间删除即可。

实现日志切割可以通过写shell脚本或者系统的日志切割机制实现。

  • shell 脚本切割 Nginx 日志
    切割脚本内容:
#!/bin/bash
logdir=/var/log/nginx  //定义日志路径
prefix=`date -d "-1 day" +%y%m%d`  //定义切割后的日志前缀
cd $logdir  
for f in `ls *.log`
do
   mv $f $f-$prefix  //把日志改名
done
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null  //生成新的日志,后者 reload nginx 也可以。
bzip2 *$prefix  //压缩日志
find . -type f -mtime +180 |xargs /bin/rm -f  //删除超过180天的老日志
  • 系统日志切割机制
    在 /etc/logrotate.d/ 下创建 nginx 文件,内容为:
/data/logs/*log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
}
  • 说明:
    1 nginx日志在/data/logs/目录下面,日志名字以log结尾
    2 daily表示每天切割
    3 rotate 30表示日志保留30天
    4 missingok表示忽略错误
    5 notifempty表示如果日志为空,不切割
    6 compress表示压缩
    7 sharedscripts和endscript中间可以引用系统的命令
    8 postrotate表示当切割之后要执行的命令

最后再 crontab -e 添加

0 0 * * * /bin/bash /usr/local/nginx/sbin/log_rotate.sh

资料:
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/rotate.md

48/49/50 Nginx 优化-配置参数优化

  • Nginx配置参数调整:
    worker进程优化
    http和tcp连接优化
    buffer和cache设置
    启用压缩
    Nginx日志优化
    作为代理服务器时的优化、
    SSL优化
  • 配置放到 nginx.conf 的 http 下
  • Nginx配置参数优化
    Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。
    以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务。

1、worker进程

  • worker_processes
    该参数表示启动几个工作进程,建议和本机 CPU 核数保持一致,每一核 CPU 处理一个进程。
  • worker_rlimit_nofile
    它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400。
    还需要在系统里执行 ulimit -n 102400才可以。
    也可以直接修改配置文件 /etc/security/limits.conf 修改
    增加:
    * soft nofile 655350
    * hard nofile 655350
  • worker_connections
    该参数用来配置每个 Nginx worker 进程最大处理的连接数,这个参数也决定了该 Nginx 服务器最多能处理多少客户端请求
    (worker_processes * worker_connections),建议把该参数设置为 10240,不建议太大。

2、http和tcp连接

  • use epoll
    使用 epoll 模式的事件驱动模型,该模型为 Linux 系统下最优方式。
  • multi_accept on
    使每个 worker 进程可以同时处理多个客户端请求。
  • sendfile on
    使用内核的FD文件传输功能,可以减少 user mode 和 kernel mode 的切换,从而提升服务器性能。
  • tcp_nopush on
    当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。
    使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。
  • tcp_nodelay on
    不缓存 data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。
    (关于 Nagle 算法)
    【假如需要频繁的发送一些小包数据,比如说1个字节,以 IPv4 为例的话,则每个包都要附带40字节的头,
    也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。
    为了解决这个问题,出现了 Nagle 算法。
    它规定:如果包的大小满足 MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。
    通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。】
  • keepalive_timeout
    定义长连接的超时时间,建议 30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数。
  • keepalive_requests
    定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如 50000.
  • reset_timeout_connection on
    设置为 on 的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接。
  • client_body_timeout
    客户端如果在该指定时间内没有加载完 body 数据,则断开连接,单位是秒,默认60,可以设置为10。
  • send_timeout
    这个超时时间是发送响应的超时时间,即 Nginx 服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。
    如果某个连接超过 send_timeout 定义的超时时间,那么 Nginx 将会关闭这个连接。单位是秒,可以设置为3。

3、buffer 和 cache(以下配置都是针对单个请求)

  • client_body_buffer_size
    当客户端以 POST 方法提交一些数据到服务端时,会先写入到 client_body_buffer 中,如果 buffer 写满会写到临时文件里,建议调整为 128k。
  • client_max_body_size
    浏览器在发送含有较大 HTTP body 的请求时,其头部会有一个Content-Length 字段,client_max_body_size 是用来限制 Content-Length 所示值的大小的。
    这个限制 body 的配置不用等 Nginx 接收完所有的 HTTP 包体,就可以告诉用户请求过大不被接受。会返回 413 状态码。
    例如,用户试图上传一个 1GB 的文件,Nginx 在收完包头后,发现 Content-Length 超过 client_max_body_size 定义的值,
    就直接发送 413(Request Entity Too Large) 响应给客户端。
    将该数值设置为 0,则禁用限制,建议设置为 10m。
  • client_header_buffer_size
    设置客户端 heade r的 buffer 大小,建议 4k。
  • large_client_header_buffers
    对于比较大的 header(超过client_header_buffer_size)将会使用该部分 buffer,两个数值,第一个是个数,第二个是每个 buffer 的大小。
    建议设置为 4 8k
  • open_file_cache
    该参数会对以下信息进行缓存:
    打开文件描述符的文件大小和修改时间信息;
    存在的目录信息;
    搜索文件的错误信息(文件不存在无权限读取等信息)。
    格式: open_file_cache max=size inactive=time;
    max 设定缓存文件的数量,inactive 设定经过多长时间文件没被请求后删除缓存。
    建议设置 open_file_cache max=102400 inactive=20s;
  • open_file_cache_valid
    指多长时间检查一次缓存的有效信息。建议设置为 30s。
  • open_file_cache_min_uses
    open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如,将该参数设置为 1,则表示,如果文件在 inactive 时间内一次都没被使用,它将被移除。
    建议设置为 2。

4、压缩

对于纯文本的内容,Nginx 是可以使用 gzip 压缩的。使用压缩技术可以减少对带宽的消耗。
由 ngx_http_gzip_module 模块支持

配置如下:

gzip on; //开启gzip功能
gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节,有的小文件越压缩越大
gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小
gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩
gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩

测试:
curl -I -H “Accept-Encoding: gzip, deflate” http://www.1.com/1.css

5、日志

  • 错误日志级别调高,比如 crit 级别,尽量少记录无关紧要的日志
  • 对于访问日志,如果不要求记录日志,可以关闭
  • 静态资源的访问日志关闭

6、静态文件过期

对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器,
在缓存未失效前,客户端不再向服务期请求相同的资源,从而节省带宽和资源消耗。

配置示例如下:

location ~* ^.+\.(gif|jpg|png|css|js)$                                      
{
    expires 1d; //1d表示1天,也可以用24h表示一天。
}

7、作为代理服务器

Nginx绝大多数情况下都是作为代理或者负载均衡的角色。
因为前面章节已经介绍过以下参数的含义,在这里只提供对应的配置参数:

http
{
    proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
    ...;
    server
    {
	proxy_buffering on;
	proxy_buffer_size 4k;
	proxy_buffers 2 4k;
	proxy_busy_buffers_size 4k;
	proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
	proxy_max_temp_file_size 20M;
	proxy_temp_file_write_size 8k;
	
	location /
	{
	    proxy_cache my_zone;
	    ...;
	}
    }
}

8、SSL优化

  • 适当减少 worker_processes 数量,因为 ssl 功能需要使用 CPU 的计算。
  • 使用长连接,因为每次建立 ssl 会话,都会耗费一定的资源(加密、解密)
  • 开启 ssl 缓存,简化服务端和客户端的“握手”过程。
    ssl_session_cache shared:SSL:10m; //缓存为10M
    ssl_session_timeout 10m; //会话超时时间为10分钟

资料:
https://coding.net/u/aminglinux/p/nginx/git/blob/master/optimize/nginx_opt.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值