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

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.mfbz.cn/a/133343.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win下安卓打包指南

win下安卓打包指南 0、缘起 换了台电脑竟然忘了怎么打包,还好有笔记,用软件打包也挺好,但是我感觉用 命令行 更有操作感,分享下。 1、下载并配置apktool(放在C://Windows无需配置环境变量,需要java环境&…

JVM虚拟机:垃圾回收器之Parallel Old(老年代)

本文重点 本文将学习老年代的另外一种垃圾回收器Parallel Old(PO),这是一种用于老年代的并行化垃圾回收器,它使用标记整理算法进行垃圾回收。 历史 在1.6之前,新生代使用Parallel Scavenge只能搭配老年代的Serial Old收集器,而…

入选《人工智能领域内容榜》

入选《人工智能领域内容榜》第 23名 C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割-CSDN博客

比亚迪推动启动电池无铅化 车主有福了

时间过得很快,又到了立冬,意味着冬季已经开始。此时的北方已经下起了大雪,即便是艳阳高照的粤北山区,早晚也出现了较大的温差。笔者不禁想起此前做二手车时期的尴尬场面——三年以上的老车,尤其是没有更换过启动电池的…

【解决方案】pytion 运行时提示 import psutil ModuleNotFoundError: No module named ‘psutil‘

报错原因分析 import psutil ModuleNotFoundError: No module named psutil报错原因分析 当前环境pytion中缺少了psutil包,使用pip命令进行安装 解决方案 pip install psutil

土壤含水量的计算

土壤含水量的计算 土壤水分的表示方法 一般所说的土壤水分,实际上是指用烘干法在105-110摄氏度温度下能从土壤中被驱逐出来的水。土壤水分含量即土壤含水量,它是指土壤中所含有的水分的数量。土壤含水量可以用不同的方法表示,最常用的表示方…

34 Feign最佳实践

2.4.2.抽取方式 将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。 例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包…

【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

8.继承与多态 8.2 多态8.2.1 多态的概念8.2.2 多态实现条件8.2.3 重写8.2.4 向上转型和向下转型8.2.5 向下转型8.2.6 多态的优缺点8.2.7 避免在构造方法中调用重写的方法 8.2 多态 8.2.1 多态的概念 通俗来说就是多种形态,具体点就是去完成某个行为,当…

华为ensp:为vlan配置ip

配置对应vlan的ip vlan1 interface Vlanif 1 进入vlan1 ip address 192.168.1.254 24配置IP为192.168.1.254 子网掩码为24位 这样就配置上ip了 vlan2 interface Vlanif 2 ip address 192.168.2.254 24 vlan3 interface Vlanif 3 ip address 192.168.3.254 24 查看结果 …

[蓝桥杯复盘] 第 3 场双周赛20231111

[蓝桥杯复盘] 第 3 场双周赛20231111 总结深秋的苹果1. 题目描述2. 思路分析3. 代码实现 鲜花之海1. 题目描述2. 思路分析3. 代码实现 斐波拉契跳跃2. 思路分析3. 代码实现 星石传送阵2. 思路分析3. 代码实现 六、参考链接 总结 做了后4题。https://www.lanqiao.cn/oj-contes…

为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学

目录 引言 可能有人想问为什么要学习云服务器? (获取Linux环境,获得外网IP) 二、安装教程 引言 可能有人想问为什么要学习云服务器? (获取Linux环境,获得外网IP) 1.虚拟机(下策) …

【教3妹学编程-算法题】765. 情侣牵手

3妹:2哥2哥,你看到新闻了吗?襄阳健桥医院院长 公然“贩卖出生证明”, 真是太胆大包天了吧。 2哥 : 我也看到新闻了,7人被采取刑事强制措施。 就应该好好查查他们, 一查到底! 3妹:真的…

《红蓝攻防对抗实战》十一.内网穿透之利用SSH协议进行隧道穿透

利用DNS协议进行隧道穿透 一.前言二.前文推荐三. 利用SSH协议进行隧道穿透1.SSH隧道-本地端口转发2.SSH隧道-远程端口转发3.SSH隧道-动态端口转发 四.本篇总结 一.前言 SSH(Secure Shell)协议是一种加密的网络传输协议,它可以在不安全的网络…

阿里云-maven私服idea访问私服与组件上传

1.进入aliyun制品仓库 2. 点击 生产库-release进入 根据以上步骤修改本地 m2/setting.xml文件 3.pom.xml文件 点击设置获取url 4. idea发布组件

DNS(Domain Name System) in detail

什么是 DNS? DNS(域名系统)为我们提供了一种与互联网上的设备进行通信的简单方法,而无需记住复数。就像每个房子都有一个唯一的地址来直接向它发送邮件一样,互联网上的每台计算机都有自己唯一的地址来与之通信&#xf…

酷柚易汛ERP-自定义打印整体介绍

1、产品介绍 每种单据系统预设常用模板,提供A4纸张、三等分、二等分,销货单额外提供80mm、58mm供用户选择;每张单据可设置一个默认模板和多个常用模;除默认模板外,其他模板都允许删除,用户可以根据公司业务…

jbase实现申明式事务

对有反射的语言,申明式事务肯定不可少。没必要没个人都try,catch写事务,写的不好的话还经常容易锁表,为此给框架引入申明式事务。申明式既字面意思,在需要事务的方法前面加一个申明,那么框架保证事务。 首…

为什么大多数团队推行自动化测试最后却不了了之?

随着软件行业的快速发展,接口测试用例在软件开发中扮演着越来越重要的角色。自动化测试作为软件测试的一个重要分支,一般可以提高测试效率和质量,节约测试成本和时间,但是在实际推行过程中,大多数团队最终却难以持续实…

react+星火大模型,构建上下文ai问答页面(可扩展)

前言 最近写的开源项目核心功能跑通了,前两天突发奇想。关于项目可否介入大模型来辅助用户使用平台,就跑去研究了最近比较活火的国内大模型–讯飞星火大模型。 大模型api获取 控制台登录 地址:https://console.xfyun.cn/app/myapp 新建应…

Java,多线程,线程安全的懒汉式、死锁、ReentrantLock的使用以及一些知识点补充

关于线程安全地懒汉式有以下几种方式: /*** 实现线程安全的懒汉式*/ public class BankTest {Bank b1 null;Bank b2 null;public static void main(String[] args){BankTest bb new BankTest();Thread t1 new Thread(){Overridepublic void run(){bb.b1 Bank.…
最新文章