Nginx详解 一:编译安装Nginx和Nginx模块

文章目录

  • 1.HTTP 和 Nginx
    • 1.1 Socket套接字
    • 1.2 HTTP工作机制
      • 1.2.1一次http事务
      • 1.2.2 资源类型
      • 1.2.3提高HTTP连接性能
  • 2. I/O模型
    • 2.1 I/O模型相关概念
    • 2.2 网络I/O模型
      • 2.2.1 **阻塞型** **I/O** 模型(blocking IO)
      • 2.2.2 **非阻塞型** **I/O** **模型** **(nonblocking IO)**
      • 2.2.3 **多路复用** **I/O** **模型(I/O multiplexing)**
      • 2.2.4 **异步** **I/O** **模型** **(asynchronous IO)**
    • 2.3 事件模型 Select、poll、epoll
      • 2.3.1 优缺点
      • 2.3.2 区别
  • 3. Nginx概述
    • 3.1 基础作用
    • 3.2 特性
    • 3.3 Apache和Nginx的区别
  • 4. Nginx模块
    • 4.1 安装Nginx
      • 4.1.1 yum安装
      • 4.1.2 编译安装
        • 4.1.2.1 前置准备
        • 4.1.2.2 解压软件包
        • 4.1.2.3 编译并安装
        • 4.1.2.4 启动停止nginx
        • 4.1.2.5 创建nginx自启动文件 (将其归入systemd管理)
    • 4.2 Nginx命令及常用选项
      • 4.2.1 常用选项
      • 4.2.2 信号
    • 4.3 日志分割 (nginx调优)
    • 4.4 平滑升级(升级新版本)
      • 4.4.1 具体思路
      • 4.4.2 实操
    • 4.5 回滚 (重回老版本)

1.HTTP 和 Nginx

1.1 Socket套接字

套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换

进程间的传输要有两个标志:IP地址和端口号合称为套接字地址 socket address

  • 客户机套接字地址定义了一个唯一的客户进程
  • 服务器套接字地址定义了一个唯一的服务器进程

1.2 HTTP工作机制

1.2.1一次http事务

  • http请求:http request
  • http响应:http response

1.2.2 资源类型

  • 静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同
文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi
  • 动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同
文件后缀:.php, .jsp ,.asp

1.2.3提高HTTP连接性能

  • 并行连接:通过多条TCP连接发起并发的HTTP请求
    Nginx详解 一:编译安装Nginx和Nginx模块_第1张图片

  • 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
    Nginx详解 一:编译安装Nginx和Nginx模块_第2张图片

  • 管道化连接:通过共享TCP连接,发起并发的HTTP请求
    Nginx详解 一:编译安装Nginx和Nginx模块_第3张图片

2. I/O模型

2.1 I/O模型相关概念

同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

  • 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成

  • 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

Nginx详解 一:编译安装Nginx和Nginx模块_第4张图片

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

  • 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。

  • 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

Nginx详解 一:编译安装Nginx和Nginx模块_第5张图片

2.2 网络I/O模型

2.2.1 阻塞型 I/O 模型(blocking IO)

Nginx详解 一:编译安装Nginx和Nginx模块_第6张图片
阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间

  • 优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
  • 缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式。

2.2.2 非阻塞型 I/O 模型 (nonblocking IO)

Nginx详解 一:编译安装Nginx和Nginx模块_第7张图片
用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行

2.2.3 多路复用 I/O 模型(I/O multiplexing)

Nginx详解 一:编译安装Nginx和Nginx模块_第8张图片
I/O multiplexing 主要包括:select,poll,epoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。

通过多路复用I/O模型,可以在一个线程中同时处理多个客户端连接的 I/O 操作,而不需要为每个连接创建一个线程或进程,避免了资源开销和上下文切换的成本。

2.2.4 异步 I/O 模型 (asynchronous IO)

Nginx详解 一:编译安装Nginx和Nginx模块_第9张图片
异步 I/O 模型是一种非阻塞的 I/O 处理模式,通过回调函数或事件通知的方式来处理已完成的 I/O 操作,能够提高系统的并发性和处理效率。

2.3 事件模型 Select、poll、epoll

2.3.1 优缺点

名称 描述 优点 缺点
select 是最早期的事件驱动模型 拥有良好的跨平台支持 效率较低,不适用于大规模的并发连接
poll 是select的升级版 效率相对更高,可以处理大量并发连接 随着文件描述符数量的增加,性能下降较明显
epoll Linux特有的 没有最大并发连接的限制 在非Linux系统上不可用

2.3.2 区别

select poll epoll
操作方式 遍历 遍历 回调
底层实现 数组 链表 hash表
I/O效率 每次调用都进行线性遍历,事件复杂度为0(n) 同左 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdlllist里,时间复杂度0(1)
最大连接数 1024(x86)2048(x64) 无上限 无上限
fd拷贝 每次调用select都需要把fd集合从用户拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 调用epoll ctl时拷贝进内核并保存,之后每次epoll wait不拷贝

3. Nginx概述

3.1 基础作用

  • 支持4层(传输层)和7层(应用层)反向代理
  • 可做静态的web资源服务器

3.2 特性

  • 模块化设计:有较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • 单机部署

3.3 Apache和Nginx的区别

特点 Nginx Apache
并发处理 高并发处理能力,轻量级且低内存消耗 对静态文件处理高效,但在高并发情况下内存消耗较大
资源占用 占用更少的系统资源和内存 占用较多的系统资源和内存
事件驱动 使用事件驱动模型,可在较少的线程上同时处理多个连接 使用多线程模型,会为每个连接创建一个线程
配置灵活性 配置简单明了,易于阅读和维护 配置相对复杂,需要更多的配置项指定
扩展性 支持动态模块和第三方扩展,可自定义功能 支持动态模块和第三方扩展,但相对Nginx更少
虚拟主机 支持无限个虚拟主机配置,每个虚拟主机独立配置 支持无限个虚拟主机配置,但每个虚拟主机使用同一套配置
模块支持 支持反向代理、负载均衡、HTTP缓存等 支持反向代理、负载均衡、SSL等
用户群体 更适合高并发、网络应用场景,如反向代理、负载均衡 更适合传统Web服务器应用,如静态内容和PHP

4. Nginx模块

4.1 安装Nginx

4.1.1 yum安装

centos7 需要安装epel源

yum install -y epel-release
#安装epel源

yum install nginx -y
#安装nginx主体软件

http://nginx.org/en/linux_packages.html
#官方网站下载安装

4.1.2 编译安装

4.1.2.1 前置准备

systemctl stop firewalld
setenforce 0
#关闭防火墙和selinux

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel
#搭建编译环境

useradd -M -s /sbin/nologin nginx
#新建nginx用户便于管理

cd /opt

wget http://nginx.org/download/nginx-1.18.0.tar.gz
#官网下载包

注:必须要联网

Nginx详解 一:编译安装Nginx和Nginx模块_第10张图片
Nginx详解 一:编译安装Nginx和Nginx模块_第11张图片

4.1.2.2 解压软件包

tar xf tar xf nginx-1.18.0.tar.gz 

cd nginx-1.18.0/

在这里插入图片描述

4.1.2.3 编译并安装

./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--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 -j2 && make install
#编译并安装

Nginx详解 一:编译安装Nginx和Nginx模块_第12张图片
Nginx详解 一:编译安装Nginx和Nginx模块_第13张图片

chown -R nginx.nginx /apps/nginx
#修改配置文件属主和属组

在这里插入图片描述

4.1.2.4 启动停止nginx

#启动

/apps/nginx/sbin/nginx
#绝对路径启动

ln -s /apps/nginx/sbin/nginx /usr/sbin/
#创建软连接后直接 nginx启动

#停止

killall  nginx
#杀进程

4.1.2.5 创建nginx自启动文件 (将其归入systemd管理)

vim /usr/lib/systemd/system/nginx.service
#建立文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
#重新加载配置
systemctl start nginx
#开启软件
systemctl enable  --now nginx
#开机自启并立即启动

chown -R nginx.nginx /apps/nginx
#修改权限

Nginx详解 一:编译安装Nginx和Nginx模块_第14张图片
Nginx详解 一:编译安装Nginx和Nginx模块_第15张图片

###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid   /apps/nginx/run/nginx.pid;
#找到 pid的位置修改  

4.2 Nginx命令及常用选项

#命令格式
nginx [选项] [参数]

注:要使用命令需要做一个软连接到系统默认环境变量

4.2.1 常用选项

选项 功能
-c <配置文件> 指定一个自定义的配置文件路径
-g <全局配置> 在命令行中指定全局配置选项
-p <工作目录> 设置工作目录,用于存放日志文件和临时文件
-s <信号> 向nginx发送信号,常用的有stop(停止nginx进程)和reload(重新加载配置文件)
-t 测试配置文件语法是否正确
-q 在测试配置文件时,以静默模式运行,只输出关键信息
-V 显示nginx的版本、编译信息和配置参数
-h 显示帮助信息,包括所有可用的命令行选项
-s <文件> 启动nginx并将master进程的PID写入指定的文件
-e <错误日志文件> 设置错误日志文件的路径
-g <配置指令> 设置全局配置指令。可以在命令行中设置多个全局配置指令,用分号分隔
-T 测试配置文件,并打印出解析后的配置内容
-q <文件> 检查配置文件,并打印出解析后的配置内容,但不启动nginx

4.2.2 信号

kill -l  看信号大全
nginx -h 可以看到的信号较少
#基本格式
nginx -s 信号
信号名 含义
stop 直接停止
quit 优雅的退出:有人在访问不会结束进程
reopen 分割日志
reload 重新加载配置文件
term 快速停止nginx进程,可能会中断现有连接,与stop信号类似。
usr1 重新打开日志文件,用于日志切割或日志重定向,与reopen信号类似。
usr2 平滑地升级nginx可执行文件。
hup 重新加载配置文件,优雅地应用新配置,与reload信号类似。
winch 当nginx以master/worker工作模式运行时,重新生成worker进程以适应新的配置。
usr3 向worker进程发送自定义信号。

4.3 日志分割 (nginx调优)

cd /apps/nginx/logs/
#切换到日志文件所在目录,此目录为指定安装目录,默认目录为/var/log/nginx

mv access.log access.log.bak
#备份日志文件

touch access.log
#新建日志文件
#此时日志不会写入到新文件

cat /apps/nginx/logs/nginx.pid
#查看软件进程号ps -aux | grep nginx

在这里插入图片描述

kill -s USR1 13286
或
nginx -s reopen 13286
#重新打开Nginx进程以重新加载配置文件

#会发送信号给Nginx主进程,告诉它重新加载配置文件而不停止正在处理的连接(不停止Nginx服务)

curl 192.168.67.100

在这里插入图片描述

4.4 平滑升级(升级新版本)

4.4.1 具体思路

  1. 将旧Nginx文件换成新Nginx文件(注意备份)
  2. 向master进程发送USR2信号
  3. master进程修改pid文件名,加后缀.oldbin
  4. master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务
  5. 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件
  6. 向旧master进程发送QUIT信号,关闭老master
  7. 如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT

4.4.2 实操

在这里插入图片描述

ps aux |grep nginx
#查看nginx是否开启

在这里插入图片描述

wget https://nginx.org/download/nginx-1.20.2.tar.gz -P \
/usr/local/src/
#下载安装包到src目录

cd /usr/local/src

ls

Nginx详解 一:编译安装Nginx和Nginx模块_第16张图片

tar xf nginx-1.20.2.tar.gz 
#解压缩软件包

cd nginx-1.20.2.tar.gz/

在这里插入图片描述

#检测编译环境,加模块
./configure --prefix=/apps/nginx --user=nginx --group=nginx --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 -j2 && make install
#编译并安装

Nginx详解 一:编译安装Nginx和Nginx模块_第17张图片

nginx -v
#查看软件版本

在这里插入图片描述

mv /apps/nginx/sbin/nginx   /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名
cp /usr/local/src/nginx-1.20.2/objs/nginx /apps/nginx/sbin
#将新版本 拷入进去
/apps/nginx/sbin/nginx -t
#语法检查

Nginx详解 一:编译安装Nginx和Nginx模块_第18张图片

kill -USR2 `cat /apps/nginx/logs/nginx.pid`

ps auxf|grep nginx
#会生成新的master进程,需要结束旧的

Nginx详解 一:编译安装Nginx和Nginx模块_第19张图片

#创建一个空格填充文件,用于让测试客户端下载
dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10

cd /apps/nginx/html

ls

在这里插入图片描述
在这里插入图片描述

切换到客户端下载测试包

#192.168.67.100为服务端IP地址

wget --limit-rate=1M http://192.168.67.100/m.img 
#从服务端下载m.img,观察进程

Nginx详解 一:编译安装Nginx和Nginx模块_第20张图片

返回服务端

ls /apps/nginx/logs/
#查看master process pid文件路径 

在这里插入图片描述

cat /apps/nginx/logs/nginx.pid #1.20.2版本的
cat /apps/nginx/logs/nginx.pid.oldbin #1.18.2版本的

Nginx详解 一:编译安装Nginx和Nginx模块_第21张图片

kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin`
#优雅关闭老进程的  worker 进程
wget --limit-rate=1M http://192.168.67.100/m.img
#再开启一台服务器测试 是否是新的进程在下载

Nginx详解 一:编译安装Nginx和Nginx模块_第22张图片

ss -natp | grep 80
#然后返回服务端查看是否使用新进程

在这里插入图片描述

nginx -v
#查看当前nginx版本

在这里插入图片描述

4.5 回滚 (重回老版本)

kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`
#唤起老的进程

ps aux|grep nginx

Nginx详解 一:编译安装Nginx和Nginx模块_第23张图片

kill -QUIT `cat /apps/nginx/run/nginx.pid`  
#结束新版本进程

ps aux |grep nginx

Nginx详解 一:编译安装Nginx和Nginx模块_第24张图片

curl -I 127.1
#通过 curl 发送一个 HEAD 请求到本地服务器并返回响应头信息

Nginx详解 一:编译安装Nginx和Nginx模块_第25张图片

你可能感兴趣的:(nginx,运维)