一、Ansible实例展示--编写playbook实现通过变量传入控制Nginx安装
#Rocky-test1为控制端,Rocky-test2,Rocky-test3为被控制端
#安装软件配置ansible环境
[root@Rocky-test1 ~]# yum -y install ansible #安装ansible软件
[root@Rocky-test1 ~]# cd /etc/ansible/
[root@Rocky-test1 ansible]# ansible-config init --disabled -t all > ansible.cfg #红帽系列需要使用该命令生成默认配置文件[root@Rocky-test1 ansible]# vim hosts #分组添加被控制端主机
[webserver]
10.0.0.152
10.0.0.153[root@Rocky-test1 ansible]# vim /etc/ssh/ssh_config #建立远程密钥验证
StrictHostKeyChecking no
[root@Rocky-test1 ansible]# ssh-keygen -f /root/.ssh/id_rsa -P ' '
[root@Rocky-test1 ansible]# ssh-copy-id 10.0.0.152
[root@Rocky-test1 ansible]# ssh-copy-id 10.0.0.153
[root@Rocky-test1 ansible]# ansible all -m ping #检测ansible配置是否成功
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
10.0.0.152 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}#编写playbook
[root@Rocky-test1 ansible]# vim nginx.yml
---
- hosts: webserver
remote_user: root
vars:
version: "1.24.0"
user: "nginx"
url: "https://nginx.org/download/nginx-{{ version }}.tar.gz"
dir: "/root/"
azdir: "/home/app/nginx"tasks:
- name: install packages
yum:
name: "{{ item }}"
state: present
loop:
- "gcc"
- "make"
- "pcre-devel"
- "openssl-devel"
- "perl-ExtUtils-Embed"- name: download
unarchive:
src: "{{ url }}"
dest: "{{ dir }}"
remote_src: yes- name: prepare group
group:
name: "{{ user }}"
gid: 88
state: present- name: prepare user
user:
name: "{{ user }}"
uid: 88
group: "{{ user }}"
shell: "/sbin/nologin"
create_home: no
system: yes
state: present- name: prepare dir
file:
path: "{{ azdir }}"
owner: "{{ user }}"
group: "{{ user }}"
state: directory- name: install
shell:
chdir: "{{ dir }}/nginx-{{ version }}/"
cmd: ./configure --prefix={{ azdir }} --user={{ user }} --group={{ user }} --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install && ln -s {{ azdir }}/sbin/nginx /usr/sbin/- name: prepare service
- name: prepare service
copy:
src: /etc/ansible/nginx.service
dest: lib/systemd/system/
owner: "{{ user }}"
group: "{{ user }}"
- shell:
cmd: systemctl daemon-reload- name: start service
service:
name: nginx
state: started
enabled: yes[root@Rocky-test1 ansible]# vim nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/home/app/nginx/logs/nginx.pid
ExecStartPre=/bin/rm -f /home/app/nginx/logs/nginx.pid
ExecStartPre=/home/app/nginx/sbin/nginx -t
ExecStart=/home/app/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
二、http协议版本和工作原理总结
版本 | 工作原理 | 特性 |
HTTP/1.0 | 客户端发送请求,服务器返回响应,并在响应后关闭连接 | 每次请求都需要建立新的TCP连接,效率较低,所有数据传输都是明文,安全性低 |
HTTP/1.1 | 个TCP连接可以传输多个HTTP请求和响应,减少了TCP连接的建立和关闭次数;客户端可以在不等待响应的情况下发送多个请求,减少了请求-响应的等待时间;允许服务器将数据分块发送 | 引入持久连接、请求管道、分块传输编码等现代特性,提高了性能,减少了TCP连接次数,降低了延迟,所有数据传输都是明文 |
HTTP/2.0 | 使用二进制格式且压缩头部信息,降低了传输延迟;在单一连接上并行处理多个请求和响应,优先处理重要资源;允许服务器未经客户端明确请求的情况下发送资源 | 支持明文发送也可以加密数据 |
三、IO模型和零复制技术的原理总结
3.1,IO模型总结
IO模型 | 描述 |
阻塞IO | 程序向内核发送I/O请求后一直等待内核响应,如果内核IO操作不能立即返回,则进程将 一直等待并不再接受新的请求,并由进程轮询查看I/O是否完成 |
非阻塞IO | 程序向内核发送I/O请求后一直等待内核响应,如果内核IO操作不能立即返回,则进程将 不再等待,继续处理其他请求,此时依旧轮询查看I/O是否完成 |
IO多路复用 | 程序向内核发送I/O请求后会由select、poll或epoll等系统调用监听一个或多个IO条件,内核执行IO请求 |
信号驱动IO | 程序向内核发送I/O请求后直接处理其他请求,如果IO操作不能立即返回,则内核将等待结果完成后通知进程 |
异步IO | 程序向内核发送I/O请求后直接处理其他请求,如果IO操作不能立即返回,内核会继续处理其他事务,IO完成后会通知内核,内核再将结果传递给进程 |
3.2,零复制技术原理
名称 | 原理 |
MMAP |
将内存内的文件或者其它对象映射到进程的地址空间,实现文件磁盘
地址和进程虚拟地址空间中一段虚拟地址的一一对映关系
|
SENDFILE | 在内核空间直接将文件复制到网络套接字,省去了数据从内核缓冲区拷贝到用户缓冲区的步骤,提高了数据传输的效率 |