一.nginx基础
1.基础知识点
nginx 是一个 轻量级、高性能的web服务应用,可以作为 http 服务器、虚拟主机、反向代理服务器、负载均衡器,以及支持 tcp/udp 的通用代理服务器。
特点:稳定性高、不容易宕机;开源免费;内存/cpu资源消耗较少;并发能力高,至少能同时处理2-3万并发,最多能支持5万并发
2.异步非阻塞机制
nginx 的异步非阻塞机制通过 事件驱动模型 和 i/o 多路复用技术 实现,使得单个 worker 进程能够高效处理成千上万的并发连接。
1. worker进程初始化,监听指定的端口(如80或443)。
2. 当有新的连接请求到达时,worker进程接受该连接,并将其注册到事件循环中。
3. 事件循环使用i/o多路复用机制(epoll)来监视所有注册的文件描述符(即连接)。
4. 当某个连接上有可读或可写事件发生时,事件循环会触发相应的回调函数来处理该事件。
5. 在处理事件时,如果需要进行i/o操作(如读取请求数据或发送响应数据),这些操作会被异步执行,不会阻塞进程。
6. 处理完一个事件后,事件循环继续检查其他事件,循环往复。
- 异步非阻塞 i/o:当发起 i/o 操作(如读取网络数据、写入文件)时,进程不等待操作完成,而是继续处理其他任务;操作完成后,通过事件通知机制(如回调函数)处理结果。
- 事件驱动模型:worker 进程通过事件循环(event loop)监听所有连接的事件(如可读、可写),仅处理已就绪的事件,避免空等。
- i/o 多路复用:使用操作系统提供的机制(如
epoll
、kqueue
)同时监控多个文件描述符(即连接),当任意一个描述符就绪时立即通知进程。
二.nginx安装
2.1安装nginx3种方式
1.包管理工具安装(yum/apt)
- 原理:通过系统的包管理工具自动从官方仓库下载并安装预编译的包。
- 特点:自动解决依赖、自动生成service文件
- 命令: centos: yum install nginx -y ubuntu: apt install nginx -y
2.本地包安装(rpm/dpkg)
- 原理:手动下载.rpm(red hat系)或.deb(debian系)包,都属于预编译的二进制包
- 特点:手动解决依赖、包含service文件
- 命令:centos: rpm -i nginx.rpm 或 ubuntu: dpkg -i nginx.deb 安装。
3.源码编译安装
原理:从nginx官网下载源代码,手动编译并安装。
特点:
- 完全自定义:可启用/禁用模块(如--with-http_ssl_module)、指定安装路径(如--prefix=/opt/nginx)。
- 性能优化:自行调整编译参数(如-march=native)。
- 手动处理依赖:需提前安装开发工具(如gcc)及依赖库(如pcre、openssl)。
- 无自动管理:更新需重新编译,服务脚本需手写service文件。
- 独立目录结构:默认安装到/usr/local/nginx,与系统包隔离。
3.1 源码编译安装nginx流程(ubuntu)
1. 更新apt源、下载lrzsz工具
apt update apt install -y lrzsz 用于本地主机和服务器相互传输文件
2.安装依赖包
ubuntu: apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential centos: yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
3.创建运行用户
nginx 服务程序默认以 nobody 身份运行:useradd -m -s /sbin/nologin nginx
4.编译安装nginx
./configure --prefix=/usr/local/nginx \ #指定了nginx的安装目录。在这种情况下,它将安装在 /usr/local/nginx 目录下。 --user=nginx --group=nginx \ #指定了运行nginx进程的用户和组。在这种情况下,它将是用户 和组 nginx。 --with-http_gzip_static_module \ #启用了支持使用 .gz 扩展名提供预压缩文件的功能。 --with-http_flv_module \ --with-http_ssl_module \ #启用了对http连接的ssl/tls加密支持。 --with-http_realip_module \ --with-http_v2_module \ #启用了对http2.0协议的支持 --with-http_sub_module \ --with-http_mp4_module \ --with-http_stub_status_module \ #启用了 stub_status 模块,提供了访问nginx状态信息的方 法。 --with-pcre \ #启用了对perl compatible regular expressions(pcre) 库的支持。 --with-stream \ #启用了对tcp/udp代理模块的支持。 --with-stream_ssl_module \ #启用了对tcp/udp连接的ssl/tls加密支持。 --with-stream_realip_module #允许nginx从proxy协议头部获取客户端的真实ip地址。
make -j 2(cpu数量决定)
make -install (安装)
注意:
1.让系统识别nginx操作命令,将nginx的可执行文件做上软链接
2.更改nginx文件夹下的属主属组
chown -r nginx.nginx /usr/local/nginx
5.检查、启动、重启、停止 nginx服务
1.检查nginx配置文件:/usr/local/nginx/conf/nginx_conf
nginx -t 检查配置文件是否有语法错误
2.启动nginx服务
3.停止nginx服务
4.重载nginx服务
5.日志分割,重新打开日志文件
nginx 存放日志文件的位置: /usr/local/nginx/logs
生成存放成功日志、错误日志的空文件:kill -usr1 $(cat /usr/local/nginx/logs/nginx.pid)
6.nginx如何前台启动
3.2nginx版本平滑升级
kill -usr2 <pid号>
注意:升级完成后要使用绝对路径启动服务,否则升级可能会报错
3.3添加 nginx 系统服务管理
因为编译安装没有service文件,如果想要系统服务统一管理systemed,需要编写service文件。
service 文件
[unit] description=nginx after=network.target [service] type=forking pidfile=/usr/local/nginx/logs/nginx.pid execstart=/usr/local/nginx/sbin/nginx execreload=/bin/kill -s hup $mainpid execstop=/bin/kill -s quit $mainpid privatetmp=true [install] wantedby=multi-user.target
三.nginx进程
- master 进程 :1.管理worker子进程 2.加载配置文件
- worker 进程: 1.处理客户端发送的请求
以处理 http 请求为例:
- 接收连接:worker 进程通过
epoll
监听端口,接收客户端连接。 - 读取请求:若数据未到达(非阻塞),worker 继续处理其他连接;若数据到达,读取并解析请求。
- 处理请求:若需读取静态文件,发起非阻塞文件 i/o 操作;若需代理到后端,发起非阻塞网络连接。
- 响应客户端:待所有操作完成后,通过事件回调将结果返回客户端。
1. 核心优势
- 低资源消耗:单线程可处理数万并发连接,避免多线程的内存开销和上下文切换。
- 高吞吐量:通过事件分发机制,最大化 cpu 和 i/o 利用率。四.nginx配置
nginx配置文件的路径: /usr/local/nginx/conf/nginx_conf
- 1、全局块:全局配置,对全局生效;
- 2、events块:配置影响 nginx 服务器与用户的网络连接;
- 3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
- 4、server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
- 5、location块:用于配置匹配的 uri (域名后面的部分);
- 6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
全局块:全局配置,对全局生效;
- events块:配置影响 nginx 服务器与用户的网络连接;
- http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
注意:http模块中还可以第三方模块的配置
- server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
- location块:用于配置匹配的 uri (域名后面的部分);
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论