一:nginx概述
1.1 nginx是什么
1:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日。
2:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
3:Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
4:Nginx支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
1.2:为什么使用nginx
- 更快
单次请求更快,高峰期也更快
- 高扩展性
极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极高的模块组成,这种低耦合的设计,造就了它庞大的第三方模块
- 高可靠性
每个worker进程相对独立,master进程在某个worker进程出错时能迅速拉起新的worker进程
nginx的可靠性来源于其核心框架代码的优秀设计、模块设计的简单性。
官方提供的常用模块都很稳定。
- 低内存消耗
一般情况下10000个非活跃的keep-alive连接仅消耗2.5M的内存
- 单机支持10万以上的并发连接
nginx支持的并发连接上限取决于内存,10万远没封顶
- 热部署
master管理进程
worker工作进程
- 最自由的BSD许可协议
1.3 nginx功能介绍
静态的web资源服务器html,图片,js,css,txt等静态资源
http/https协议的反向代理
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
tcp/udp协议的请求转发(反向代理)
imap4/pop3协议的反向代理
1.4 基础特性
模块化设计,较好的扩展性 高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven,aio,mmap,sendfil
1.5 web服务相关功能
虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
二: nginx架构和进程
2.1 主要特性
- 高并发处理能力:Nginx 使用异步、非阻塞事件驱动架构,能够高效地处理大量并发连接。
- 低资源消耗:相对于传统的进程或线程模型,Nginx 使用更少的内存和 CPU 资源。
- 模块化设计:Nginx 的功能通过模块实现,用户可以根据需求加载不同的模块。
- 高可扩展性:通过第三方模块和 Lua 脚本,Nginx 能够轻松扩展其功能。
- 丰富的功能:支持 HTTP/2、反向代理、负载均衡、缓存、SSL/TLS、WebSocket 等
2.2 核心架构
Nginx 的核心架构设计是其高性能和高可用性的关键。核心架构包括模块化设计、事件驱动模型、Master-Worker 进程模型和高效的请求处理流程。
2.3 nginx进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
2.4 nginx进程角色
Nginx在内存中运行多个进程,一个master进程和多个worker进程。同时还有一些特殊用途的进程,例如缓存加载和缓存管理进程。在nginx 1.x版本,所有进程都是单线程的,使用共享内存作为进程间通信机制。Master进程使用root用户权限运行,其他进程使用非特权用户权限运行。
master进程负责下列工作:
- 读取和校验配置文件
- 创建、绑定、关闭套接字
- 启动、终止、维护所配置的worker进程数目
- 不中断服务刷新配置文件
- 不中断服务升级程序(启动新程序或在需要时回滚)
- 重新打开日志文件
- 编译嵌入Perl脚本
**Worker进程接受、处理来自客户端的连接,提供反向代理和过滤功能以及其他nginx所具有的所有功能。**由于worker进程是web服务器每日操作的实际执行者,所以对于监控nginx实例行为,系统管理员应该保持关注worker进程。
缓存加载进程负责检查磁盘上的缓存数据并且在内存中维护缓存元数据的数据库。基本上,缓存加载进程使用特定分配好的目录结构来管理已经存储在磁盘上的文件,为nginx提供准备,它会遍历目录,检查缓存内容元数据,当所有数据可用时就更新相关的共享内存项。
缓存管理进程主要负责缓存过期和失效。它在nginx正常工作时常驻内存中,当有异常则由master进程重启
主进程(master process)的功能:
1.对外接口:接收外部的操作(信号)
2.对内转发:根据外部的操作的不同,通过信号管理 Worker
3.监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
4.读取Nginx 配置文件并验证其有效性和正确性
5.建立、绑定和关闭socket连接
6.按照配置生成、管理和结束工作进程
7.接受外界指令,比如重启、升级及退出服务器等指令
8.不中断服务,实现平滑升级,重启服务并应用新的配置
9.开启日志文件,获取文件描述符
10.不中断服务,实现平滑升级,升级失败进行回滚处理
11.编译和处理perl脚本
工作进程(worker process)的功能:
1.所有 Worker 进程都是平等的
2.实际处理:网络请求,由 Worker 进程处理 Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源
3.增加上下文切换的损耗
4.接受处理客户的请求 将请求依次送入各个功能模块进行处理
5.I/O调用,获取响应数据 与后端服务器通信,接收后端服务器的处理结果
6.缓存数据,访问缓存索引,查询和调用缓存数据
7.发送请求结果,响应客户的请求
8.接收主程序指令,比如重启、升级和退出等
2.4 nginx缓存简介
**Nginx在文件系统上使用分层数据存储实现缓存。缓存主键可配置,并且可使用不同特定请求参数来控制缓存内容。**缓存主键和元数据存储在共享内存段中,缓存加载进程、缓存管理进程和worker进程都能访问。目前不支持在内存中缓存文件,但可以用操作系统的虚拟文件系统机制进行优化。每个缓存的响应存储到文件系统上的不同文件,Nginx配置指令控制存储的层级(分几级和命名方式)。如果响应需要缓存到缓存目录,就从URL的MD5哈希值中获取缓存的路径和文件名。
将响应内容缓存到磁盘的过程如下:当nginx从后端服务器读取响应时,响应内容先写到缓存目录之外的一个临时文件。nginx完成请求处理后,就将这个临时文件重命名并移到缓存目录。如果用于代理功能的临时目录位于另外一个文件系统,则临时文件会被拷贝一次,所以建议将临时目录和缓存目录放到同一个文件系统上。如果需要清除缓存目录,也可以很安全地删除文件。一些第三方扩展可以远程控制缓存内容,而且整合这些功能到主发布版的工作已经列入计划。
三 : nginx
3.1 正向反向代理
正向代理: 我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器)
反向代理: 那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)
3.2 nginx的负载均衡
什么是负载均衡:
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单来说就是:现有的请求使服务器压力太大无法承受,所有我们需要搭建一个服务器集群,去分担原先一个服务器所承受的压力,那现在我们有ABCD等等多台服务器,我们需要把请求分给这些服务器,但是服务器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一个问题。
Nginx给出来三种关于负载均衡的方式:
轮询法(默认方法):
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
weight权重模式(加权轮询):
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
情况。
这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
ip_hash:
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3.3 动静分离
3.4 零拷贝技术
3.4.1 什么是零拷贝
零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做 到"0"拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化
3.4.2 零拷贝基础
零拷贝
从一个存储区域到另一个存储区域的 copy 任务没有 CPU 参与。零拷贝通常用于网络文件传输,以减少 CPU 消耗和内存带宽占用,减少用户空间与 CPU 内核空间的拷贝过程,减少用户上下文与 CPU 内核上下文间的切换,提高系统效率。
用户空间:
用户可操作的内存缓存区域,CPU 内核空间是指仅 CPU 可以操作的寄 存器缓存及内存缓存区域。
用户上下文:
指的是用户状态环境,CPU内核上下文指的是CPU内核状态环境。 零拷贝需要 DMA 控制器的协助。DMA,Direct Memory Access,直接内存存取,是 CPU的组成部分,其可以在 CPU 内核(算术逻辑运算器 ALU 等)不参与运算的情况下将数据从一个地址空间拷贝到另一个地址空间。
3.4.3 零拷贝方式
该拷贝方式共进行了 2 次用户空间与内核空间的上下文切换
,以及 3 次数据拷贝
,但整 个拷贝过程均没有CPU 的参与
,这就是零拷贝
3.5 nginx的并发处理机制
一般情况下并发处理机制有三种:多进程、多线程,与异步机制。 Nginx 对于并发的处 理同时采用了三种机制。当然,其异步机制使用的是异步非阻塞方式。
我们知道 Nginx 的进程分为两类:master 进程与 worker 进程。
master进程负责worker进程的生命周期、接收外部命令、解析Perl脚本。
worker进程用于接收和处理客户端的请求。
每个 master 进程可以生 成多个 worker 进程,所以其是多进程的。
每个 worker 进程可以同时处理多个用户请求,每 个用户请求会由一个线程来处理,所以其是多线程的。
那么,如何解释其"异步非阻塞"并发处理机制呢?
worker 进程采用的就是 epoll 多路复用机制来对后端服务器进行处理的。当后端服务器返回结果后,后端服务器就会回调 epoll 多路复用器,由多路复用器对相应的 worker 进程进行通知。此时,worker 进程就会挂起当前正在处理的事务,拿 IO 返回结果去响应客户端请求。响应完毕后,会再继续执行挂起的事务。这个过程就是"异步非阻塞"的。
四:nginx模块介绍
4.1 nginx模块
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
4.2 模块分类
核心模块:core module
标准模块:
HTTP 模块: ngx_http_* HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
ngx_http_core_module 核心模块
ngx_http_access_module 访问控制模块
ngx_http_auth_basic_module 身份验证模块
ngx_http_gzip_module 压缩模块
ngx_http_log_module 日志模块
ngx_http_proxy_module 代理模块
ngx_http_rewrite_module 重写模块
ngx_http_stub_status_module 状态页
ngx_http_upstream_module 反向代理模块
五:实验环节
5.1 nginx的源码编译
解压1.23.0压缩包
生成文件
关闭debug模式
[root@nginx nginx-1.24.0]# vim auto/cc/gcc
[root@nginx nginx-1.24.0]# ./configure --prefix=/usr/local/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
[root@nginx nginx-1.24.0]# make && make install
export PATH=$PATH:/usr/local/nginx/sbin
测试
5.2 nginx的平滑升级与回滚:基于源码编译
解压echo文件和1.26.2版本
要添加--add-moudle=/root/echo-nginx-module-0.63
[root@nginx nginx-1.26.2]# make !!!直接make不可以install
回收work进程
测试
回滚版本
[root@nginx sbin]# kill -HUP 44563
[root@nginx sbin]# kill -WINCH 44615
[root@nginx sbin]# kill -9 44615
5.3 nginx命令参数
-V :show version and configure options then exit #显示版本和编译参数
-t : test configuration and exit #测试配置文件是否异
-T : test configuration, dump it and exit #测试并打印
-q : suppress non-error messages during configuration testing #静默 模式
-s signal : send signal to a master process: stop, quit, reopen, reload # 发送信号,reload信号 会生成新的worker,但master不会重新生成
-p prefix : set prefix path (default: /etc/nginx/) #指定Nginx 目录
-c filename : set configuration file (default: /etc/nginx/nginx.conf) # 配置文件路径
-g directives : set global directives out of configuration file #设置全局指令,注意和 配置文件不要同时配置,否则冲突
例如-V -T
5.4 nginx启动文件编写
[root@nginx sbin]# vim /lib/systemd/system/nginx.service
[root@nginx sbin]# systemctl daemon-reload !!必须要daemon-reload!!
[root@nginx sbin]# nginx -s stop
[root@nginx sbin]# ps aux | grep nginx
root 44749 0.0 0.1 221680 2328 pts/1 S+ 13:42 0:00 grep --color=auto nginx
5.5 nginx全局参数优化
修改配置文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
[root@nginx ~]# vim /etc/security/limits.conf
nginx - nofile 100000
下载httpd-tools测试
[root@nginx ~]# dnf install httpd-tools -y
5.6 nginx下的root和alias
建立文件并编辑
[root@nginx ~]# mkdir -p /usr/local/nginx/conf.d
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@nginx ~]# cat /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /test1/ {
root /datda/web;
}
location /test2 {
alias /datda/web/test1;
}
}
[root@nginx ~]# mkdir -p /data/web/html
[root@nginx ~]# echo www.timinglee.org > /data/web/html/index.html
[root@nginx ~]# mkdir -p /datda/web/test1
[root@nginx ~]# echo /datda/web/test1 > /datda/web/test1/index.html
5.7 nginx的用户认证
设置密码为123
[root@nginx ~]# htpasswd -cm /usr/local/nginx/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin
[root@nginx ~]# cat /usr/local/nginx/.htpasswd
admin:apr1TCpfGsZF$XxhVq0cRxahNpzWoweTq50
[root@nginx ~]# cat /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location /lee {
root /data/web;
auth_basic "login passwd !!";
auth_basic_user_file "usr/local/nginx/.thpasswd";
}
}
5.8 自定义日志
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@nginx ~]# mkdir /var/log/timinglee.org
[root@nginx ~]# nginx -s reload
5.9 nginx的文件检测
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
error_log /var/log/timinglee.org/error.log;
access_log /var/log/timinglee.org/access.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
[root@nginx ~]# mkdir /data/web/html
[root@nginx ~]# echo error default > /data/web/html/error/default.html
5.10 nginx中的长连接管理
[root@nginx ~]# dnf install telnet -y ###安装长连接测试工具
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
修改可看时间为60
5.11 下载服务器的设定以及优化
[root@nginx ~]# mkdir /data/web/download
[root@nginx ~]# dd if=/dev/zero of=/data/web/download/leefile bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.176053 s,596 MB/s
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
location /download {
root /data/web;
autoindex on;
}
显示本地时间
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
location /download {
root /data/web;
autoindex on;
autoindex_localtime on;
}
显示文件粗略大小
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
location /download {
root /data/web;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
5.12 nginx状态页
[root@nginx conf.d]# vim status.conf
[root@nginx conf.d]# nginx -s reload
5.13 源码编译php
重新编译nginx1.26
[root@nginx nginx-1.26.2]# make && make install
编译php
[root@nginx ~]# tar zxf php-8.3.9.tar.gz
[root@Nginx ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel(需要在阿里云找)
[root@nginx php-8.3.9]# make && make install
编译成功!!!这个是真的慢啊(OvO)
5.14 php配置方法
[root@nginx ~]# cd /usr/local/php/etc/
[root@nginx etc]# cp -p php-fpm.conf.default php-fpm.conf
[root@nginx etc]# vim php-fpm.conf
[root@nginx etc]# cd php-fpm.d/
[root@nginx php-fpm.d]# cp www.conf.default www.conf -p
[root@nginx php-fpm.d]# cd /root/php-8.3.9/
[root@nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
更改时区
[root@nginx etc]# vim php.ini
生成启动脚本
[root@nginx etc]# cd /root/php-8.3.9/
[root@nginx php-8.3.9]# cd sapi/
[root@nginx sapi]# cd fpm/
[root@nginx fpm]# cp php-fpm.service /lib/systemd/system/
[root@nginx fpm]# pwd
/root/php-8.3.9/sapi/fpm
[root@nginx fpm]# vim /lib/systemd/system/php-fpm.service
将ProtectSystem注释掉
更改端口
[root@nginx php]# ls
bin etc include lib php sbin var
[root@nginx php]# cd etc/php-fpm.d/
[root@nginx php-fpm.d]# ls
www.conf www.conf.default
[root@nginx php-fpm.d]# vim www.conf
[root@nginx php-fpm.d]# systemctl restart php-fpm.service
5.15 nginx和php的整合
[root@nginx bin]# vim ~/.bash_profile
[root@nginx bin]# cat ~/.bash_profile
.bash_profile
Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
User specific environment and startup programs
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin
[root@nginx bin]# source ~/.bash_profile
[root@nginx bin]# cd /data/web/php
[root@nginx php]# ls
index.php
[root@nginx php]# cat index.php
<?php
phpinfo();
>
[root@nginx nginx]# mkdir conf.d
[root@nginx nginx]# vim conf/nginx.conf
[root@nginx conf.d]# vim vhosts.conf
[root@nginx conf.d]# cat vhosts.conf
server {
listen 80;
server_name www.timinglee.org;
root /data/web/html;
index index.html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
成功出现php页面