昨天也尝试了用 ChatGPT + Mindshow 快速生成 PPT,PPT 的主题是 Nginx 技术的知识分享。首先用 ChatGPT 生成文案,这里分享下我的 Prompt,生成的内容挺准确的~---请帮我写一篇 Nginx 零基础教程,要求如下:内容要求:包括 Nginx 的介绍、应用场景、快速上手、常用特性、注意事项、原理概述等字数要求:不少于 1500、不大于 2000 字格式要求:文章使用 Markdown 语法,并严格区分标题文风要求:语气轻松幽默,可以适当使用一些比喻---就得到了图 1 所示的文章,输入 “继续” 可以生成完整内容。可以适当地自行添加一些图片。然后将文案导入到 MindShow 平台(mindshow.fun),即可生成如图 2 所示的 PPT。再切换一个布局,就得到了图 3 的页面,感觉还是挺帅的~不过美中不足的是 mindshow 平台的 ppt 生成能力还有待提高,下载下来的 pptx 文件可能会丢失图片(我这遇到了),开发者们也可以尝试 ,自己用代码生成 PPT。#A##chatGpt#
2、nginx简介及配置文件详解晚上好,今天我们一起来看一下NGINX的内存池。那么Nginx为什么会使用内存池呢?这是为了减少内存碎片的产生,Nginx提前帮我们申请好了一块大的内存,这样我们在申请小块内存的时候,就会在已经创建的内存池里去分配就好了。内存管理分为段式管理和页式管理。关于内存管理这块我们后面有机会再深入介绍。在我们的应用程序里的内存大概可以分为栈内存,堆内存。我等码农在使用堆内存的步骤大致可以分3步:申请内存使用内存释放内存这里穿插一个小知识点:C语言里的malloc 和 free 函数不是系统调用,而是 C 语言的运行时库。也就是说malloc的时候并不会进行用户态到内核态到切换。介绍:Nginx 将内存池里的内存分为两类:小块内存,大块内存。对于小块内存,它在申请后并不需要释放,而是等到释放内存池时再释放。对于大块内存,可以调用相关接口进行释放,也可以等内存池释放后在释放。这是因为Nginx的内存池支持增加回调函数,当内存池被释放的时候,会调用回调函数用来释放用户申请的资源。这里值得一提的是,回调函数还可以有多个,是通过链表的形式来链接的,遍历链表一一回调。下面我们一起看一下内存池的操作方法。如图从表格中,我们可以看到Nginx其实已经提供封装了malloc、free的ngx_alloc、ngx_free方法,那为什么还要再整一个挺复杂的内存池呢?这里对于没有垃圾回收机制的C语言编写的应用来说,容易犯的错就是内存泄露。(我当年写C程序的时候就经常段错误)。当分配内存与释放内存的逻辑相距遥远时,还很容易发生同一块内存被释放两次。内存池就是为了降低程序员犯错几率的:模块开发者只需要关心内存的分配,而释放则交由内存池来负责。是不是想起了php-fpm?一次请求中phper们一顿操作猛如虎,请求结束php-fpm都给你释放了。所以,phper对内存都不太care的只要不oom就可以了。详见:Nginx之内存池
3、本篇讲解Docker 日志驱动切换到Linux Syslog。首先来看下Docker 日志架构。Docker容器(Docker Container)中的应用程序(Application)将日志写入到标准输出设备(STDOUT),Docker守护进程(Docker Daemon)负责从STDOUT中获取日志,并将日志写入对应的日志驱动中,如图1所示。默认地, Docker 日志驱动是写到json-file 里面的,我们通过docker info | grep "Logging Driver" ,即可观察到默认的日志设置,如图2所示。在这里,我们将介绍将Docker 的日志切换到Docker 的Linux宿主机的日志中。日志是系统中发生的事情的重要信息来源。Linux 的默认日志是syslog,Syslog是消息日志记录的标准。长期以来,它一直是Linux/Unix系统上的标准日志记录机制。Syslog包含三个部分:-Syslog守护程序:它是一个监听日志并将其写入特定位置的守护程序。位置在守护程序的配置文件中定义。rsyslog是大多数发行版附带的Syslog守护程序。-Syslog消息格式:指Syslog消息的语法。-Syslog协议:指用于远程日志记录的协议。现代Syslog守护程序可以使用TCP和TLS,以及UDP,UDP是远程日志记录的传统协议。通常,日志写入/var/log目录下,通过命令 sudo ls /var/log, 即可看到当前系统下的多个log文件,如图3所示。Linux操作系统已安装了Syslog软件包,但它叫Rsyslog。实际上,Rsyslog是Syslog标准的一种实现。除了Rsyslog这一种实现,还有一种叫Syslogng的第三方实现。虽然Syslogng的功能较为强大,但我们还是选择使用Rsyslog,因为操作系统已经预装了,我们无须再单独安装。当然,也可通过以下命令查看Rsyslog是否已安装rsyslogd -vLinux 系统基本已经默认安装了rsyslogd, 图4显示的是RockyLinux 8.5 的执行结果。可以看到, 这里的rsyslogd已经安装, 并且已经配置了systemd服务。下面,我们将修改rsyslogd的配置文件,开启514端口,这样我们就可以是用TCP 协议来查看系统的log 日志了, 这么做的目的,当然是为了日志能够和ELK集成。执行:sudo vim /etc/rsyslog.conf本机为RockyLinux 8.5, 也就是类似于Redhat 8.5, 修改配置为:module(load="imtcp") # needs to be done just onceinput(type="imtcp" port="514")然后,重启rsyslog服务: sudo systemctl restart rsyslog之后,查看本机端口,确认514端口已经打开:sudo netstat -anpt | grep 514当我们打开了syslog的远程端口514之后,我们就可以在启动Docker 的时候,指定Docker 的日志驱动为syslog,同时指定远程端口:执行命令:docker run -d -p 81:80 --log-driver syslog --log-opt syslog-address=tcp://localhost:514 --name nginx nginx本命令中,首先需要使用logdriver指定Syslog为日志驱动,此外使用log-opt指定地址tcp://localhost:514,表示Docker容器可通过TCP协议连接本地的514端口,从而将日志写入Rsyslog中。如图6所示,我们得到一个id为70d761开头的Docker 容器。Nginx容器启动成功后,在浏览器上发出请求,此时会发现,在/var/lib/docker/containers/<container_id>目录中不再生成<container_id>json.log文件了。如图7所示。那么日志输出到哪里去了呢?当然是在Linux的系统日志文件中了。此时可使用以下命令来查看Linux系统日志文件,该文件中的内容就是Syslog所生成的日志。执行: tail -f /var/log/messages结果如图8所示,在日志信息中,可以看到一个12位的字符串70d761efae8d,它就是Docker的容器ID。以上,我们实现了 Docker 日志的syslog 输出。#Docker##Docker 日志##Docker syslog#@Docker 自定义日志输出
4、Nginx是一个高性能的轻量级Web服务器,本书从配置文件的角度出发,介绍了多种关于Nginx配置文件的技巧。本书以模块化风格写成,几乎每一章都是一个独立的模块,读者将能够自由地在各个模块间切换阅读。全书分两部分,第一部分用8章内容介绍了安装Nginx及第三方模块、配置指南、使用mail模块、Nginx作为反向代理、反向代理**话题、NginxHttp服务器、Nginx的开发以及故障排除技巧;第二部分用4个附录的形式介绍了指令参考、Rewrite规则指南、Nginx社区以及Solaries系统下的网络调优。本书适合在安装和配置服务器方面有经验的系统管理员或系统工程师,阅读本书不需要任何Nginx使用经验,想信这本书会帮助你更好地完成任务。
5、【爱奇艺Java面试经验分享】一面线下面试,没有自我介绍,帅气老哥上来就盯着简历问项目。项目做了哪方面的东西我说了我这个 项目 的思路,怎么实现的我的需求的。然后问表的设计,给张纸写一下 项目 表的结构,索引字段。然后巴拉巴拉建联合索引,覆盖索引优化,聚簇索引等等。然后写走索引的SQL上面索引提到了B+树,然后被问B+树的数据结构,用B+树有哪些好处。巴拉巴拉在纸上写一下主键索引的B+树是个什么样子的,你建的索引又是什么样子巴拉巴拉之前说的都是逻辑上的,了解MySQL索引文件在磁盘页上是具体怎么存储和分布的吗不了解。。。给一个用户权限管理系统要怎么建表怎么实现授权,不用开源框架的话。不太会啊。。我就说了下建表的思路,扯到了范式巴拉巴拉,然后还说错了一些…说如果要给你的 项目 加削峰、限流等访问控制你会怎么做?随便扯了点Redis会使用Redis是吧是的看过那本Redis设计与实现。项目 中怎么用的,缓存了哪些数据。巴拉巴拉Redis 数据类型和数据结构有哪些我刚开始巴拉巴拉,他说就书上的对吧那本书我也看过算了不用说了就说说Zset的数据结构吧跳表+字典或压缩列表说说什么是跳表,有什么好处巴拉巴拉然后问跳表确定高度的 算法抛硬币 算法为什么Redis用跳表实现Zset而不用B+树 ?稍微说了一下,他说回答对了一半,但是这个问题是拓展题,问题不大,后面你可以去了解一下。Java并发并发用的多吗不多手撕代码:写一个生产者消费者的代码三个线程循环打印123我用Semaphore写完,他看了下说应该没什么问题然后问能不能用ReentrantLock和Condition写。我ok,可能代码量要大一点,需要点时间,他:那就不写了讲讲ReentrantLock吧。我巴拉巴拉LockSupport.park,重入,非公平和公平的实现方式,CAS,AQS那再讲讲AQS我巴拉巴拉阻塞队列,volatile state,那就再讲讲volatile我巴拉巴拉可见性,防止重 排序 ,然后说到JMM内存模型,缓存一致性协议然后然后写了个代码,考察指令重 排序 相关的,不被重 排序 应该给哪个变量加volatile。(感觉自己指令重 排序 问题还需要更深一点的理解,到计组执行层面是如何做的)然后他说并发这方面就没什么问题了MySQL事务然后看了看简历,又看到了MySQL事务,说说事务的隔离级别,MySQL默认级别,每个隔离级别会出现什么问题,举个例子。MySQL如何实现的可重复读和读已提交讲了一下MVCCMVCC工作原理简单说了下undo log巴拉巴拉说什么是幻读现象,举个例子,在MySQL中会出现幻读现象吗?扯了一下当前读和快照读。后说应该没有什么问题了,我去叫下同事来二面。(擅长的JVM、集合类一个没问,Spring也一个没问)二面(二面面试官看上去是大佬)上来问我的研究方向,研一主要在帮导师干活对吧,课上的怎么样了介绍一下简历上的 项目 ,做了哪些工作,怎么做的本科专业是学硬件方面比较多是吗从学校问过来方便吗研二来实习和导师说好了吗问更喜欢 算法 还是开发当然是开发开发是自己学的对吧,说说自己的学习方法和学习路线先跟着从入门到……的路线学习基础,然后从GitHub、技术博客、书籍、Stack Overflow拓展深度。然后疯狂介绍这边组里的业务大概15分钟。然后问 前端 会多少只能看懂 前端 代码,稍微调调,不会Vue等框架,没有开发过完整的 项目看了看简历,问Nginx是怎么用的,我说了下怎么给我的博客做请求过滤,实现Https,请求转发。然后问Linux掌握的怎么样我说了一下我接触Linux的经历,展示了一下我的云服务器探针,网站,说一般使用是完全没有问题的然后问Git会用吗后问实习找的怎么样了然后说和leader沟通一下,等HR通知。然后送我出了公司……总体面试感受~感觉不像是你问我答的考试而是有一种交流技术的感觉HR面大概2面完之后隔了一个半小时电话来了(当时我还在小卖部挑雪糕呢没想到这么快),说恭喜面试通过,问了下个人基本情况,然后说马上发邮件OFFER从约面试到发OFFER总共不超过24小时~~#程序员# #互联网#
6、今天我们来介绍一个阿里巴巴提供的模块Caoncat。它到底有什么用呢?这个模块可以在一次请求返回多个文件的内容。对于我们在web系统中,提升小文件请求的性能是十分有帮助的。下面我们来介绍一下Concat模块的用法:功能:上面介绍了,就是当页面需要访问多个小文件时,把他们的内容合并到一次http响应中返回,提升性能。这并不是一个官方模块,它的github地址:网页链接安装步骤:1.先从github上 clone到本地。2. 在编译Nginx的时候 加上 --add-module=../nginx-http-concat/ (这里的目录是你自己clone的地址)就能编译进Nginx了。这时候Nginx才具有concat的功能。使用方式:1.在URL后加上??,放多个文件,这些文件是通过,来分隔的。2.如果还有参数,则在后通过?添加参数。如:网页链接相关指令:// 启用开关concat: on | offdefault: concat offContext: http, server, location// 对哪些文件进行合并concat_types: MIME typesDefault: concat_types: text/css application/x-javascriptContext: http, server, location// 是否对多种类型进行合并concat_unique: on | offDefault: concat_unique onContext: http, server, location// 多合并多少个文件,默认是10个文件concat_max_files: numberpDefault: concat_max_files 10Context: http, server, location// 多个文件的分隔符concat_delimiter: stringDefault: NONEContext: http, server, locatione// 多个文件中 某个文件出现错误是否忽略继续返回其他正常的文件concat_ignore_file_error: on | offDefault: offContext: http, server, location#程序员# #Nginx#
7、【找工作必问面试题】1.MySQL 数据库中 CHAR 和 VARCHAR 的区别?2.介绍一下互斥锁和悲观锁的具体区别?3.Nginx 如何实现负载均衡?4.请解释一下 Nginx 服务器上的 Master 和 Worker 进程分别是什么?5.Swoole 协程与 Golang 协程有哪些不同?AI给出的答案,仅供参考:1. CHAR和VARCHAR在MySQL数据库中都是用于存储字符类型的。主要区别在于,CHAR是固定长度的,而VARCHAR是可变长度的。例如,如果使用CHAR(10)存储字符串“hello”,则这个字段总共会占用10个字节的存储空间;而如果使用VARCHAR(10)存储同样的字符串,这个字段只会占用5个字节,因为“hello”只需要5个字节的存储空间。2.互斥锁和悲观锁都是用于保护共享资源的锁。互斥锁是一种独占锁,即同一时间只能有一个线程可以持有该锁。当一个线程尝试获取互斥锁时,如果该锁已经被其他线程持有,那么该线程就会被阻塞,直到该锁释放。悲观锁则是一种悲观的保护策略,它认为在操作共享资源时,一定会有其他线程同时访问该资源,并且这些线程可能会修改共享资源的值。因此,悲观锁每次都会去请求锁,即使在没有其他线程访问该资源的情况下,也会先获取锁,然后再执行操作。3.Nginx可以通过以下几种方式实现负载均衡:- 轮询(Round Robin):按照请求的顺序依次分配到不同的服务器。- IP哈希(IP Hash):根据客户端的IP地址来进行哈希计算,然后将请求分配到对应的服务器。- 加权轮询(Weighted Round Robin):按照服务器的权重进行轮询分配,权重大的服务器收到的请求数量也更多。- 加权IP哈希(Weighted IP Hash):根据客户端的IP地址进行哈希计算,并结合服务器的权重来进行请求分配。4.Nginx服务器上的Master和Worker进程分别是什么?- Master进程:该进程是Nginx的主进程,主要负责控制Nginx的启动、停止以及重载配置等操作。一旦Master进程启动,它就会读取配置文件,然后启动多个Worker进程用于处理客户端的请求。- Worker进程:Nginx的实际工作由多个Worker进程完成。每个Worker进程都会独立地处理客户端的请求,并负责与客户端的连接交互。Master进程会将请求分配给不同的Worker进程处理,以实现请求的并发处理。5.Swoole协程与Golang协程有哪些不同?- Swoole协程:是通过PHP的上下文切换来实现的,因为协程在PHP语言中是不被支持的。Swoole基于ReactPHP和Coroutine实现了PHP的协程。Swoole的协程不能跨线程调用,同一线程内的协程可以无限嵌套调用,但好不要超过4096层,否则会导致栈溢出。- Golang协程:是一种更轻量级的线程,它可以在不同的Goroutine之间切换,而不需要使用操作系统的上下文切换。Golang的协程可以通过channel来进行协程间的通讯,从而达到并发处理的目的。Golang的协程可以在不同的线程之间进行调度,因此可以使用多核CPU进行并发处理。