【Nginx40】Nginx学习:动静分离与日志分割

news2024/11/24 2:32:05

Nginx学习:动静分离与日志分割

放轻松放轻松,最后两篇文章学习的内容是比较轻松的。首先,我们来看看 Nginx 动静分离的概念,然后再看看怎么为 Nginx 做日志分割。内容都很简单,完全不需要有任何的压力。

动静分离

动静分离,听着高大上吧,而且也是面试中比较喜欢问的问题。简单来说,就是动态请求走后端的动态程序,静态资源,比如说图片、CSS、JS、文件以及普通的静态 html ,走静态资源就可以了。就像下面这张图一样。

f394b23d78b84f6b84e4e9e43b496c57.jpeg

大部分 PHPer 可能就疑惑了,咱们 PHP 在 Nginx 中的配置不就这样的嘛。

server {
  listen       80;
  server_name  localhost;
  location / {
    root   html;
    index  index.html index.htm;
  }

  location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

这是我们之前使用的,最最经典的,也是默认 Nginx 配置文件中所提供的基础配置。这里其实就已经实现了动静分离。动态的针对 PHP 文件的请求,使用 FastCGI 进行处理。实际上,FastCGI 也是个代理,这个之前我们就说过了。而静态资源,直接就是通过 root 配置指令去找 html 目录中的内容。

没错,静态分离对我们 PHPer 来说并不稀奇。但是对于一些编译型语言来说,比如 Java 或者 Go ,它们会将资源打包,然后生成一个 Jar 或者可执行文件。通过 Nginx 的反向代理来实现动态程序的运行。但这时,其实静态资源也是在一起打包的,虽然不是直接编译进可执行文件中,但是有时候修改一点静态资源的内容,也会需要重启后端服务。这就是典型的没有做分离。

因此,一般情况下我们可以这样配。

server{
  
  listen 8040;
   
  location / {
    proxy_pass http://192.168.56.88:8080/;
  }
  
  location ~ .*\.(jpg|jpeg|if|png|js|css)$ {
    root html/static;
    access_log off;
  }

}

假设 proxy_pass 代理的是一个 Java 程序,那么我们就可以在根请求中指定代理到 Java ,而静态资源后缀的,则单独再指定一个 location ,并且指定好 root 地址。

当然,更多的情况下,现在大部分公司都直接买云存储了,这就是更分离了,连服务器都分开了。如果不用云存储,也可以再单独建一个 server 并绑定一个静态资源域名。比如我的博客的图片链接配置:

server
{
    listen 80;
		listen 443 ssl http2;
    server_name img1.zyblog.com.cn;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/zyblog/storage/img;
    ……………………
}

后台存储上传的图片时,直接保存到 /www/wwwroot/zyblog/storage/img 目录,然后只存储相对路径,比如 /article/1.jpg ,然后在程序中拼接上域名,最终形成 http://img1.zyblog.com.cn/article/1.jpg 这样的 URL 地址。

这样做有什么好处呢?当我们需要迁移存储时,比如上云或者下云,只需要在动态程序中修改域名配置就行了。而为什么不让动态程序来处理静态资源呢?要知道,动态程序是需要走加载、展示的过程的,而 Nginx 则直接对静态资源做了很多优化,比如 sendfile 。效率要比直接使用动态后端语言高出很多。并且,在做集群时,我们也可以直接分离静态资源服务器,将所有的静态资源统一存放管理。反正,好处多多,唯一的问题就是,要做好这些资源的目录管理和数据调取时的存储管理,否则可能就会比较乱哦。

日志分割

另一个非常常见的面试题,同时也是非常常用的操作,就是对 Nginx 的日志进行分割。这是什么意思?其实呀,就是我们的访问日志或者错误日志,经年累月的积累,会变得非常多,单个文件也会非常大。通常我们都会按天对这些日志进行分割,分割之后又会压缩备份或者直接发送走用于处理分析。

Nginx 默认没有日志分割的功能,但是它可以重载配置文件,也可以重开日志句柄,有这两个功能,其实就为我们进行日志分割提供了基础了。那么我们就写一个简单的 shell 脚本来实现吧。

#/bin/sh

cd /usr/local/nginx/logs/;

mv access.log access.log_bak;


nginx -s reload;
#nginx -s reopen;
#kill -HUP `cat /usr/local/nginx/logs/nginx.pid`;
#kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`;

很简单吧?进入日志目录,给日志文件改个名字,然后重载 reload 或者重开 reopen ,就行了。下面三个注释的功能是等价的,使用 -s 参数其实就是封装好的 kill 命令嘛。这个在最早的文章中我们都已经说过了。

将文件保存为 .sh 命名的文件,然后通过 chmod 加上执行权限,运行一下吧。

查看日志目录,发现确实老的日志被改名了,并且新的日志也生成了。

[root@localhost ~]# ll /usr/local/nginx/logs/ | grep access.log*
-rw-r--r-- 1 root root        0 Sep 26 09:01 access.log
-rw-r--r-- 1 root root  5693634 Sep 23 10:53 access.log_bak

再请求两次,就会发现新的请求信息还是记录到新的 access.log 文件中了。

[root@localhost ~]# ll /usr/local/nginx/logs/ | grep access.log*
-rw-r--r-- 1 root root      112 Sep 26 09:02 access.log
-rw-r--r-- 1 root root  5693634 Sep 23 10:53 access.log_bak

如果想要压缩一下,直接在 mv 代码行后面加上 gzip 操作就好了。

gzip access.log_bak;

修改脚本并运行之后,就可以看到之前的 access.log_bak 被压缩成 .gz 文件了。

[root@localhost ~]# ll /usr/local/nginx/logs/ | grep .*gz
-rw-r--r-- 1 root root      148 Sep 26 09:05 access.log_bak.gz

接下来,我们再尝试加上日期时间,这样的话,每次分割的日志都是按日期命名了。修改 mv 部分就好。

d=`date +'%Y%m%d'`;
mv access.log "access_"$d".log";

试试效果吧,看看是不是按日期出现备份文件了。

[root@localhost ~]# ll /usr/local/nginx/logs/ | grep access_
-rw-r--r-- 1 www  root        0 Sep 26 09:15 access_20220926.log

当然,我们的测试代码非常简单,不过对于自己的小项目或者公司的小应用完全没问题了。后续的步骤就是直接把这个脚本加入到 crontab 里面就好了。简单的 shell 相信也不会让各位大佬犯难的,我们还可以移动到指定的备份目录,或者流量特别大的网站直接按小时、分钟进行备份,这些都没问题。

对于 宝塔 这种面板工具来说,在它的计划任务功能中,直接就提供了日志分割的功能。而且这个功能也比较强大,可以按单独的站点,也可以全部都分割,还可以保留多少份备份。这些功能的代码实现其实都在 /www/server/panel/script/logsBackup 这个文件中的 split_log 函数里面。它全部是由 Python 实现的,还是比较容易看懂的。宝塔使用的就是 mv+reload 方式,大家可以自己分析一下哦。

总结

说了很简单吧,也不算水了一篇,但确实也不是很硬。不过对于很多新手来说,这两个东西还是比较常见的,或者说比较有用的基础知识。下次面试的时候可不要再发懵了哦,动静分离就是让 Nginx 自己来处理静态资源,动态请求才走代理让后端动态语言程序来运行。而日志分割实际上就是给文件改名,然后再 reload 或 reopen 一下,效果都一样。而且咱们还知道宝塔直接用得就是 mv+reload 模式。

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

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

相关文章

FPGA高端项目:图像缩放+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案我这里已有的图像处理方案 3、设计思路框架设计框图视频源选择IT6802解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 …

SSL证书申请安全审核失败?

随着HTTPS普及,申请安装使用SSL证书成为了我们的必备项。但这个SSL证书申请过程中,遇到问题也是不少。今天我们来浅了解一下SSL证书为什么会出现安全审核失败? SSL证书申请会出现安全审核失败的情况可能是以下原因: 域名验证不通…

docker-compose安装es以及ik分词同义词插件

目录 1 前言 2 集成利器Docker 2.1 Docker环境安装 2.1.1 环境检查 2.1.2 在线安装 2.1.3 离线安装 2.2 Docker-Compose的安装 2.2.1 概念简介 2.2.2 安装步骤 2.2.2.1 二进制文件安装 2.2.2.2 离线安装 2.2.2.3 yum安装 3 一键安装ES及Kibana 3.1 yml文件的编写…

多组学整合,快速定位关键代谢通路,解析分子机制

生物学是一种复杂的学科,往往单一组学无法探究想要了解的生物学问题,这时就要运用到多组学联合分析。近年来,多组学研究的不断发展和持续火热,越来越多的研究者开始将微生物组学和代谢组学联合起来。16s全长扩增子测序可提供细菌构…

JAVA集合学习和源码分析

一、结构 List和Set继承了Collection接口,Collection继承了Iterable Object类是所有类的根类,包括集合类,集合类中的元素通常是对象,继承了Object类中的一些基本方法,例如toString()、equals()、hashCode()。 Collect…

Mysql数据备份 —Navicat

一 Navicat 对于表的备份 根据自己的需求来选择 可以直接备份数据表 操作简单明了 二 Navicat 对于库的备份 对于数据库 直接通过转储SQL文件 保存结构和数据 需要新创建数据库 字符集和编码格式要对应 否则容易乱码 运行刚才生成的文件即可

【Git】GUI图形化界面的使用SSH协议IDEA集成Git

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Git的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. GUI图形化界面的使用 1.使用Gui​ 2.常…

Linux - 基础IO(Linux 当中的文件,文件系统调用接口,文件描述符)- 上篇

前言 首先,关于文件我们最先要理解的是,文件不仅仅存储的是数据,一个文件包括 内容 数据。内容好理解,就是我们先要这文件存储哪一些数据,这些数据就是文件的内容。 但是,在计算机当中,有两种…

【Maven教程】(十):使用 Hudson 进行持续集成—— 从Hudson的安装到任务创建 ~

Maven 使用 Hudson 进行持续集成 1️⃣ 持续集成的作用、过程和优势2️⃣ Hudson 简介与安装3️⃣ 准备 Subversion 仓库4️⃣ Hudson 的基本系统设置5️⃣ 创建 Hudson 任务5.1 Hudson 任务的基本配置5.2 Hudson 任务的源码仓库配置5.3 Hudson 任务的构建触发配置5.4 Hudson …

Linux:权限篇 (彻底理清权限逻辑!)

shell命令以及运行原理: Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来…

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt,可能也要安装下对应的编译工具 1、下载对应Linux版本的qt (1)准备安装的是qt5.7.1:qt-opensource-linux-x64-5.7.1.run (2)在虚拟机进入存放qt安装包的目录…

jQuery HTML/CSS 参考文档

jQuery HTML/CSS 参考文档 文章目录 应用样式 示例属性方法示例 jQuery HTML/CSS 参考文档 应用样式 addClass( classes ) 方法可用于将定义好的样式表应用于所有匹配的元素上。可以通过空格分隔指定多个类。 示例 以下是一个简单示例&#xff0c;设置了para标签 <p&g…

CVE-2023-25194 Kafka JNDI 注入分析

Apache Kafka Clients Jndi Injection 漏洞描述 Apache Kafka 是一个分布式数据流处理平台&#xff0c;可以实时发布、订阅、存储和处理数据流。Kafka Connect 是一种用于在 kafka 和其他系统之间可扩展、可靠的流式传输数据的工具。攻击者可以利用基于 SASL JAAS 配置和 SASL …

django|报错SQLite 3.8.3 or later is required的解决方案

迁移原同事写的程序&#xff0c;到新服务器上边。运行报错。解决方案有三种 降低django版本升级sqlite3&#xff0c;不低于3.8.3版本修改django源码 方案一、降低django版本 卸载高版本django pip uninstall django安装低版本&#xff0c;如 pip install django2.1.7注意&…

ARM 基础学习记录 / 异常与GIC介绍

GIC概念 念课本&#xff08;以下内容都是针对"通用中断控制器&#xff08;GIC&#xff09;"而言&#xff0c;直接摘录的&#xff0c;有的地方可能不符人类的理解方式&#xff09;&#xff1a; 通用中断控制器&#xff08;GIC&#xff09;架构提供了严格的规范&…

【C语言 | 预处理】C语言预处理详解(三)——内存对齐、手把手教你计算结构体大小

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Elasticsearch:Lucene 中引入标量量化

作者&#xff1a;BENJAMIN TRENT 我们如何将标量量化引入 Lucene。 Lucene 中的自动字节量化 虽然 HNSW 是一种强大而灵活的存储和搜索向量的方法&#xff0c;但它确实需要大量内存才能快速运行。 例如&#xff0c;查询 768 维的 1MM float32 向量大约需要 1,000,000*4*(7681…

Spring Boot 集成 ElasticSearch

1 加入依赖 首先创建一个项目&#xff0c;在项目中加入 ES 相关依赖&#xff0c;具体依赖如下所示&#xff1a; <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.1.0</version&g…

「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

PHP 使用递归方式 将其二维数组整合为层级树 其中层级id 为一个uuid的格式 造成的诡异问题 已解决

不啰嗦 直接上源代码 <?php function findChildren($list, $p_id){$r array();foreach ($list as $k > $item) {if ($item[fid] $p_id) {unset($list[$k]);$length count($r);$r[$length] $item;if ($t findChildren($list, $item[id])) {$r[$length][children] …