一、Nginx简介
Nginx(发音为“engine X”)是一款高性能、轻量级的开源Web服务器和反向代理服务器。它由俄罗斯的程序员Igor Sysoev于2004年首次发布,并且在后来迅速获得了广泛的认可和采用。Nginx的主要特点包括高并发处理能力、低内存占用、事件驱动的架构、灵活的配置选项以及可扩展性。
以下是一些Nginx的主要特点和用途:
高性能: Nginx以其高并发处理能力和低内存占用而闻名,适合处理大量的并发请求。它可以在相对较少的硬件资源下处理更多的请求。
反向代理: Nginx常用作反向代理服务器,将客户端请求转发给后端的应用服务器。这可以提供负载均衡、缓存、SSL终止等功能,帮助提高应用的性能和安全性。
负载均衡: Nginx可以分配客户端请求到多个后端服务器,实现负载均衡,从而提高服务的可靠性和性能。
静态文件服务: Nginx可以高效地提供静态文件,如图片、CSS和JavaScript文件。它可以缓存这些文件,减少对后端服务器的请求。
动态内容处理: 尽管Nginx不像一些应用服务器那样处理动态内容,但它可以通过反向代理将请求转发到应用服务器,实现动态内容的处理。
SSL终止: Nginx可以作为SSL终止代理,处理SSL加密和解密,从而减轻后端服务器的负担。
虚拟主机: Nginx支持虚拟主机配置,可以在同一台服务器上托管多个域名或站点。
模块化架构: Nginx的模块化架构使其可以通过加载不同的模块来扩展功能。这使得Nginx适用于各种不同的用例和需求。
二 、Nginx和Apache的差异
Nginx | Apache |
---|---|
nginx是一个基于事件的web服务器 | apache是一个基于流程的服务器 |
所有请求都由一个线程处理 | 单个线程处理单个请求 |
nginx避免子进程的概念 | apache是基于子进程的 |
nginx类似于速度 | apache类似于功率 |
nginx在内存消耗和连接方面比较好 | apache在内存消耗和连接上没有提高 |
nginx在负载均衡方面表现较好 | 当流量到达进程极限时,apache将拒绝新的连接。 |
nginx不支持IBMI和openvms一样的os | apache支持更多的os |
nginx只具有核心功能 | apache提供了比nginx更多的功能 |
nginx的性能和可伸缩性不依赖于硬件 | apache依赖于cpu和内存等硬件组件 |
Nginx支持热部署 | Apache不支持热部署 |
-
架构:
- Nginx:采用事件驱动、非阻塞的架构。它使用少量的线程或进程处理大量的并发连接,每个连接都以异步非阻塞方式处理,能够高效地处理大量并发请求。
- Apache:采用多进程或多线程的传统多路复用架构。每个连接通常会分配一个线程或进程,适合处理少量的连接。
-
内存占用:
- Nginx:因为采用事件驱动、非阻塞的架构,所以内存占用较低,适合处理大量并发连接。
- Apache:由于多进程或多线程的架构,内存占用相对较高,适用于并发连接较少的情况。
-
性能:
- Nginx:由于事件驱动架构和低内存占用,Nginx在高并发情况下表现出色,特别适合处理静态资源和负载均衡。
- Apache:在低并发情况下表现良好,但在高并发情况下,由于进程或线程较多,性能可能较差。
-
配置:
- Nginx:配置文件语法简洁、易读,支持模块化配置,通常被认为更易于配置。
- Apache:配置文件较为复杂,可以通过
.htaccess
文件实现目录级别的配置,但这可能会影响性能。
-
模块:
- Nginx:支持的模块较少,但内置的模块足够满足大多数需求。
- Apache:拥有大量的第三方模块,提供了更多的功能扩展。
-
适用场景:
- Nginx:适用于高并发的场景,如静态资源服务、反向代理、负载均衡等。
- Apache:适用于小规模的Web应用,需要灵活的配置和动态内容处理的场景。
-
虚拟主机:
- Nginx:虚拟主机配置相对简单,可以处理大量的虚拟主机。
- Apache:虚拟主机配置较为复杂,适用于较小规模的虚拟主机。
2.1 nginx apache 的优缺点
nginx相对于apache的优点∶
- 轻量级,同样起web服务,比apache占用更少的内存及资源
- 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简
- 支持热部署,平滑升级
apache相对于nginx的优点∶
- Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
- 模块多,基本想到的都可以找到
- 少bug, nginx的bug相对较多
- 超稳定
- Nginx处理动态请求是弱项,动态请求要Apache去做。
三、nginx 进程架构
nginx启动时有两个进程:
Nginx启动时会创建一个Master进程,也称为主进程。Master进程负责管理所有的Worker进程,并处理来自操作系统的信号。它不直接处理客户端请求,而是负责监控和管理其他进程的生命周期。
Nginx可以配置多个Worker进程,每个Worker进程都是一个独立的执行单元,负责实际的客户端请求处理。每个Worker进程都是独立的,互相之间不会影响。Worker进程使用事件驱动的方式处理连接,允许异步非阻塞地处理多个连接。
主进程(master process)的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(worker process)的功能:
Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
四、编译安装nginx
1)安装nginx依赖
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
2)新建一个nginx用户便于管理nginx
useradd -M -s /sbin/nologin nginx
3)创建在根目录创建一个文件夹用于存放软件例如/apps
mkdir /apps
4)网络下载nginx安装包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
5)解压nginx源码包准备编译安装
tar xf nginx-1.18.0.tar.gz
6) 编译安装
./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
7) 修改文件权限
chown -R nginx.nginx /apps/nginx
8)实现systemd控制nginx
(1)创建.service文件
vim /usr/lib/systemd/system/nginx.service
(2)编写启动项
9)启动nginx
systemctl start nginx
systemctl status nginx
10)浏览器访问服务器ip 192.168.2.101
五、nginx 平滑升级
5.1 升级流程
-
将旧Nginx文件换成新Nginx文件(注意备份)
-
向master进程发送USR2信号
-
master进程修改pid文件名,加后缀.oldbin
-
master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务
-
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件
-
向旧master进程发送QUIT信号,关闭老master
-
如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT
5.2 nginx 1.18 升级 1.20
1) 修改配置文件woker进程数
vim /apps/nginx/conf/nginx.conf
读取配置文件
nginx -s reload
ps:如果此命令显示未找到命令请做软连接到$PATH
2) 下载nginx 1.20.2安装包 编译
wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /apps
解压nginx1.20.2
tar xf nginx-1.20.2.tar.gz
编译安装需要与之前版本一直
这时候可以
nginx -V
查看配置
ps:编译时注意不要make install !!!!!!!!!
3)升级
将老版本nginx 改名为nginx.bak
mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
将编译完成新版本nginx复制进去
mv /apps/nginx-1.20.2/objs/nginx /apps/nginx/sbin/
4)向nginx发送升级信号
kill -USR2 `cat /apps/nginx/logs/nginx.pid`
5) 升级完成优雅退出老nginx
kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
6)浏览器测试是否升级成功
ps:升级成功测试无bug之后可以kill掉老master进程彻底升级成功
5.3 回滚
1)如果新版本测试有bug需要回滚,可以尝试唤醒老进程
kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
2)然后杀掉新进程
kill -QUIT `cat /apps/nginx/logs/nginx.pid`
3)将新nginx删除后将老nginx改回来
cd /apps/nginx/sbin
rm -rf nginx
mv nginx.bak nginx
4)浏览器测试