一: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
1.3 nginx功能介绍
1.4 基础特性
1.5 web服务相关功能
二: nginx架构和进程
2.1 主要特性
- 高并发处理能力:Nginx 使用异步、非阻塞事件驱动架构,能够高效地处理大量并发连接。
- 低资源消耗:相对于传统的进程或线程模型,Nginx 使用更少的内存和 CPU 资源。
- 模块化设计:Nginx 的功能通过模块实现,用户可以根据需求加载不同的模块。
- 高可扩展性:通过第三方模块和 Lua 脚本,Nginx 能够轻松扩展其功能。
- 丰富的功能:支持 HTTP/2、反向代理、负载均衡、缓存、SSL/TLS、WebSocket 等
2.2 核心架构
Nginx 的核心架构设计是其高性能和高可用性的关键。核心架构包括模块化设计、事件驱动模型、Master-Worker 进程模型和高效的请求处理流程。
2.3 nginx进程结构
2.4 nginx进程角色
2.4 nginx缓存简介
Nginx在文件系统上使用分层数据存储实现缓存。缓存主键可配置,并且可使用不同特定请求参数来控制缓存内容。缓存主键和元数据存储在共享内存段中,缓存加载进程、缓存管理进程和worker进程都能访问。目前不支持在内存中缓存文件,但可以用操作系统的虚拟文件系统机制进行优化。每个缓存的响应存储到文件系统上的不同文件,Nginx配置指令控制存储的层级(分几级和命名方式)。如果响应需要缓存到缓存目录,就从URL的MD5哈希值中获取缓存的路径和文件名。
将响应内容缓存到磁盘的过程如下:当nginx从后端服务器读取响应时,响应内容先写到缓存目录之外的一个临时文件。nginx完成请求处理后,就将这个临时文件重命名并移到缓存目录。如果用于代理功能的临时目录位于另外一个文件系统,则临时文件会被拷贝一次,所以建议将临时目录和缓存目录放到同一个文件系统上。如果需要清除缓存目录,也可以很安全地删除文件。一些第三方扩展可以远程控制缓存内容,而且整合这些功能到主发布版的工作已经列入计划。
三 : nginx
3.1 正向反向代理
正向代理: 我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器)
反向代理: 那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)
3.2 nginx的负载均衡
3.3 动静分离
3.4 零拷贝技术
3.4.1 什么是零拷贝
零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做 到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化
3.4.2 零拷贝基础
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高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
4.2 模块分类
五:实验环节
5.1 nginx的源码编译
解压1.23.0压缩包
生成文件
关闭debug模式
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进程
测试
回滚版本
5.3 nginx命令参数
例如-V -T
5.4 nginx启动文件编写
[root@nginx sbin]# vim /lib/systemd/system/nginx.service
5.5 nginx全局参数优化
修改配置文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
[root@nginx ~]# vim /etc/security/limits.conf
下载httpd-tools测试
[root@nginx ~]# dnf install httpd-tools -y
5.6 nginx下的root和alias
建立文件并编辑
5.7 nginx的用户认证
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
显示本地时间
显示文件粗略大小
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 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]# source ~/.bash_profile
[root@nginx nginx]# mkdir conf.d
[root@nginx nginx]# vim conf/nginx.conf
成功出现php页面