一、 概述
nginx 是开源、高性能、高可靠的 web服务器 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
性能是 nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, nginx 是免费的并可以商业化,配置使用也比较简单。
1.1 nginx 特点
- 高并发、高性能;
- 模块化架构使得它的扩展性非常好;
- 异步非阻塞的事件驱动模型(epoll)这点和 node.js 相似;
- 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;
- 热部署、平滑升级;
- 完全开源,生态繁荣。
1.2 nginx 作用
- http服务器。nginx可以独立提供http服务。可做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个虚拟服务器。
- 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
- nginx 中也可以配置安全管理、比如可以使用nginx搭建api接口网关,对每个接口服务进行拦截。
nginx 是一个高性能的 http 和 反向代理 服务器,也是一个 imap/pop3/smtp 代理服务器。它的工作原理主要基于 事件驱动架构 和 异步非阻塞 i/o 模型,使其能够高效处理大量并发连接。以下是 nginx 的核心工作原理:
1.3 nginx工作原理
1. 事件驱动架构(event-driven)
nginx 采用 事件驱动 模型(如 epoll、kqueue),而不是传统的多线程/多进程模型(如 apache 的 prefork)。
优势:
- 单个工作进程可以处理数千个并发连接,减少上下文切换和内存开销。
- 通过事件循环(event loop)监听文件描述符(如 socket),当数据就绪时触发回调函数,避免阻塞。
2. 多进程模型(master-worker)
nginx 启动时分为两类进程:
master 进程:
- 负责读取配置文件、管理 worker 进程(启动、停止、重载配置)。
- 不直接处理客户端请求。
worker 进程:
- 实际处理请求的进程(数量可配置,通常与 cpu 核心数相同)。
- 每个 worker 是独立的,通过事件驱动机制高效处理并发连接。
优势:
- worker 进程崩溃时,master 可以快速重启新的 worker,提高稳定性。
- 多 worker 利用多核 cpu,避免线程竞争。
3. 异步非阻塞 i/o
nginx 使用 非阻塞 i/o 操作:
- 当 worker 处理一个请求时,如果遇到 i/o 操作(如读取文件、访问数据库),不会等待完成,而是立即处理其他请求。
- i/o 操作完成后,通过事件通知(如
epoll)触发回调继续处理。
对比传统阻塞模型:
- apache 的每个连接可能需要一个线程/进程,高并发时资源消耗大。
- nginx 的 worker 仅在 cpu 计算时占用资源,i/o 等待时不阻塞。
4. 请求处理流程
接收请求:
- worker 通过监听端口(如 80)接收客户端连接。
解析请求:
- 解析 http 头部,确定 host、url、方法(get/post)等。
匹配 location:
- 根据配置文件中的
server和location块匹配请求。
处理静态/动态内容:
- 静态文件:直接读取文件并返回(高效,默认开启
sendfile零拷贝)。 - 动态请求:通过反向代理(如 fastcgi、uwsgi)转发到后端服务(如 php、python)。
返回响应:
- 组装 http 响应,通过非阻塞 i/o 发送给客户端。
5. 高性能关键设计
- 零拷贝(sendfile):静态文件直接从磁盘发送到网络,无需经过应用层缓冲区。
- 连接复用(keepalive):减少 tcp 握手/挥手的开销。
- 内存池:减少频繁的内存分配/释放,提高内存管理效率。
- 负载均衡:作为反向代理时,支持轮询、ip hash、加权分配等算法。
6. 扩展性
- 模块化设计:核心功能(如 http、mail)和第三方模块(如 lua、websocket)可动态加载。
- 热部署:修改配置后,通过
nginx -s reload平滑重启,不中断现有连接。
总结:
nginx 的高性能源于:
- 事件驱动 + 非阻塞 i/o:用少量进程处理高并发。
- 多进程隔离:避免单点故障,利用多核 cpu。
- 高效内存/文件处理:零拷贝、内存池等优化。
适合场景:静态资源服务、反向代理、负载均衡、api 网关等。
二、nginx服务搭建
2.1 ningx安装
2.1.1 yum安装
yum 安装默认安装在
[root@nginx1~]#yum install -y nginx ##验证安装结果 [root@nginx1~]#rpm -q nginx nginx-1.20.1-7.el7.x86_64
2.1.2 编译安装
[root@bogon ~]# tar xf nginx-1.25.3.tar.gz [root@bogon ~]# ls anaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm nginx-1.25.3 nginx-1.25.3.tar.gz [root@bogon ~]# yum install -y pcre-devel [root@bogon ~]# yum install -y zlib-devel [root@bogon ~]# cd nginx-1.25.3 [root@bogon nginx-1.25.3]# ./configure --prefix=/usr/local/nginx checking for os + linux 3.10.0-1160.el7.x86_64 x86_64 checking for c compiler ... found + using gnu c compiler + gcc version: 4.8.5 20150623 (red hat 4.8.5-44) (gcc)
三、nginx服务平滑升级
3.1 nginx添加新模块
在已编译安装nginx的基础上添加–with-http_image_filter_module模块。
(1)进入nginx解压目录
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.25.3 built by gcc 4.8.5 20150623 (red hat 4.8.5-44) (gcc) configure arguments: --prefix=/usr/local/nginx
(2)添加–with-http_image_filter_module模块。
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.25.3 built by gcc 4.8.5 20150623 (red hat 4.8.5-44) (gcc) configure arguments: --prefix=/usr/local/nginx –with-http_image_filter_module
[root@bogon nginx-1.25.3]# make
备份原nginx二进制文件
[root@bogon nginx-1.25.3]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
复制新的nginx二进制文件,进入新的nginx源码包
[root@bogon nginx-1.25.3]# cp /root/nginx-1.25.3/objs/nginx /usr/local/nginx/sbin/nginx
测试新版本的nginx是否正常
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
3.2 nginx版本升级
1.25版本------>1.27版本
#解压新版本 [root@bogon ~]# tar zxf nginx-1.27.3.tar.gz -c /usr/local/ [root@bogon ~]# cd /usr/local/nginx-1.27.3/ [root@bogon nginx-1.27.3]# ./configure --prefix=/usr/local/nginx checking for os + linux 3.10.0-1160.el7.x86_64 x86_64 checking for c compiler ... found #进行编译 #注意:这里不能进行,make install 操作,否则将会被覆盖,可能会影响线上业务。 [root@bogon nginx-1.27.3]# make #拷贝nginx1.27版本的二进制文件到1.25版本 [root@bogon ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #先备份一份 [root@bogon ~]# cp /usr/local/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/ #启动新的主进程,查看升级后的版本 [root@bogon ~]# kill -usr2 $(cat /usr/local/nginx/logs/nginx.pid) #查看升级后的版本 [root@bogon ~]# /usr/local/nginx/sbin/nginx -v
四、nginx服务反向代理
概述
什么是反向代理
反向代理代理的是服务端
反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式
客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 ip 地址
4.1反向代理实战
- 反向代理服务器 192.168.49.134
- 主机 192.168.49.135
- 服务器 192.168.49.136
要求主机访问反向代理服务器时,其实是去找服务器,隐藏服务器ip地址
反向代理服务器 安装nginx 配置好文件
在nginx.conf中配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.49.136;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#测试nginx
nginx -t
#重新加载
nginx -s reload
五、nginx服务负载均衡
服务端 192.168.49.136 ;客户端 192.168.49.135
- 代理端 192.168.49.134
- 反向代理实现负载均衡配置:
- nginx的负载均衡原理是基于反向代理和事件驱动的机制。
当客户端发送请求时,nginx作为反向代理服务器接收请求,并根据配置的负载均衡算法将请求转发到后端的多个服务器上,实现负载均衡。
常见配置参数
location / {
proxy_pass http://192.168.49.136;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-proto $scheme;
}
轮询实现负载均衡配置:
upstream group1{
server 192.164.49.134;
server 192.164.49.136;
}
location / {
pass_proxy http://group1;
}
nginx -t
nginx -s reload
#重新加载
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论