一、ansible实现Nginx安装
第九周 1.编写一个playbook实现Nginx的两种安装过程,安装方式可通过变量传入控制
gitee存放ansible安装nginx文件路径
#创建ansible可读取的nginx安装的yaml文件
vim nginx_install.yml
#填写以下内容
---
- name: Install Nginx using variable-controlled method
hosts: MagN86 # 替换为你的主机或组名
vars:
nginx_install_method: "package" # 可选值: "package", "source"
tasks:
- name: Update package manager repositories
become: yes
when: nginx_install_method == "package"
block:
- name: Update apt cache on Debian/Ubuntu
apt:
update_cache: yes
when: ansible_os_family == 'Debian'
- name: Update yum/dnf cache on RedHat/CentOS
yum:
update_cache: yes
when: ansible_os_family == 'RedHat'
- name: Install Nginx using package manager
become: yes
when: nginx_install_method == "package"
package:
name: nginx
state: present
- name: Install required packages for source installation
become: yes
when: nginx_install_method == "source"
package:
name:
- gcc
- make
- openssl-devel # 对于RHEL/CentOS
- libssl-dev # 对于Debian/Ubuntu
state: present
- name: Download Nginx source
become: yes
when: nginx_install_method == "source"
get_url:
url: "http://nginx.org/download/nginx-1.18.0.tar.gz" # 示例版本,请替换为实际版本
dest: /usr/local/src/nginx-1.18.0.tar.gz
- name: Extract Nginx source
become: yes
when: nginx_install_method == "source"
unarchive:
src: /usr/local/src/nginx-1.18.0.tar.gz
dest: /usr/local/src/
remote_src: yes
creates: /usr/local/src/nginx-1.18.0
- name: Compile and install Nginx from source
become: yes
when: nginx_install_method == "source"
command: |
cd /usr/local/src/nginx-1.18.0 &&
./configure --prefix=/usr/local/nginx &&
make && make install
args:
creates: /usr/local/nginx/sbin/nginx
- name: Ensure Nginx is started and enabled at boot
become: yes
service:
name: nginx
state: started
enabled: yes
#执行安装
[root@192-168-110-138 ~]# ansible-playbook nginx_install.yml
PLAY [Install Nginx using variable-controlled method] ************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************
ok: [192.168.110.133]
ok: [192.168.110.135]
TASK [Update apt cache on Debian/Ubuntu] *************************************************************************************************************************************
skipping: [192.168.110.133]
skipping: [192.168.110.135]
TASK [Update yum/dnf cache on RedHat/CentOS] *********************************************************************************************************************************
ok: [192.168.110.133]
ok: [192.168.110.135]
TASK [Install Nginx using package manager] ***********************************************************************************************************************************
ok: [192.168.110.133]
ok: [192.168.110.135]
TASK [Install required packages for source installation] *********************************************************************************************************************
skipping: [192.168.110.133]
skipping: [192.168.110.135]
TASK [Download Nginx source] *************************************************************************************************************************************************
skipping: [192.168.110.133]
skipping: [192.168.110.135]
TASK [Extract Nginx source] **************************************************************************************************************************************************
skipping: [192.168.110.133]
skipping: [192.168.110.135]
TASK [Compile and install Nginx from source] *********************************************************************************************************************************
skipping: [192.168.110.133]
skipping: [192.168.110.135]
TASK [Ensure Nginx is started and enabled at boot] ***************************************************************************************************************************
changed: [192.168.110.135]
changed: [192.168.110.133]
PLAY RECAP *******************************************************************************************************************************************************************
192.168.110.133 : ok=4 changed=1 unreachable=0 failed=0 skipped=5 rescued=0 ignored=0
192.168.110.135 : ok=4 changed=1 unreachable=0 failed=0 skipped=5 rescued=0 ignored=0
二、http协议版本和工作原理
2.总结http协议版本和工作原理
2.1、http协议版本
HTTP/0.9: 最初的HTTP协议版本,功能十分基础,仅支持GET请求,且服务器响应中只能包含HTML文本,已不再使用。
HTTP/1.0: 发布于1996年,相比0.9版本增加了对多种请求方法(如GET, POST, PUT, DELETE)的支持,以及MIME类型,但每次请求都需要建立新的TCP连接,效率较低。
HTTP/1.1: 1997年发布,成为广泛使用的标准。引入了持久连接(默认开启Keep-Alive),允许在一个TCP连接上发送多个请求和接收多个响应,提高了效率。解决了HTTP/1.0中的队头阻塞问题,并增强了缓存机制、请求头和响应头的灵活性。
HTTP/2: 引入了多路复用、二进制分帧层、头部压缩等特性,显著提高了性能,尤其是在高延迟网络环境中,能够更有效地利用带宽和减少延迟。
HTTP/3: 基于QUIC协议而非TCP,旨在进一步减少延迟,改善安全性,解决HTTP/2中的一些问题,如TCP队头阻塞。
2.2、http工作原理
1、建立连接:接收或拒绝连接请求
2、接收请求:接收客户端请求报文中对某资源的一次请求的过程
Web访问响应模型(Web l/0)
单进程I/0模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/0模型:并行启动多个进程,每个进程响应一个连接请求
复用I/0结构:启动一个进程,同时响应N个连接请求
复用的多进程I/0模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
3、处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
常用请求 MethOd:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS4、访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
5、构建响应报文:
一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
1) 响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Content-Length
实际报文的主体内容
2) URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径3) MIME类型:Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来
6、发送响应报文Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客广端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束
7、记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
三、IO模型和零复制技术的原理
3.总结IO模型和零复制技术的原理
3.1、IO模型
阻塞IO模型:在进行IO操作时,如果数据未准备好,当前线程会被挂起,直到数据准备好才继续执行。这种方式会阻塞进程或线程,效率低下。
非阻塞IO模型:线程发起IO操作后立即返回,无论数据是否准备好,之后通过轮询检查IO操作是否完成,减少了阻塞,但轮询会消耗CPU资源。
IO多路复用模型:包括select、poll、epoll等,允许一个线程同时监控多个IO事件,当至少有一个事件准备就绪时,通知应用程序,减少了线程的数量,提高了效率。
信号驱动IO模型:应用注册一个信号处理函数,然后继续执行,当有IO事件发生时,由内核发送信号通知应用,应用再进行处理。
异步IO模型(AIO):应用发起IO操作后,直接返回,由内核在后台完成IO操作,并在完成时通知应用。真正的非阻塞,应用程序无需主动检查IO完成状态。
3.2、零复制技术
共享内存 MMAP( Memory Mapping ) :数据直接在内存中由发送方写入,接收方直接读取,无需通过内核缓冲区。
sendfile:一种典型的零拷贝技术,常用于文件传输。它允许数据从一个文件描述符直接复制到另一个文件描述符,中间无需经过用户空间,减少了一次数据复制。
DMA辅助的sendfile