Nginx基础
说明:此篇分以下四个部分介绍nginx基础,基于当前整合资料,做一下学习总结,也方便初学者快速入门。
- Nginx起源及介绍
- Nginx架构及交互过程
- Nginx核心功能及配置
- Nginx部署使用
一、Nginx起源及介绍
1.1 起源背景:解决 C10K 性能瓶颈
时代需求与问题
2000 年代初,互联网流量爆发式增长,传统 Web 服务器(如 Apache)的同步阻塞模型面临 C10K 问题(单服务器处理万级并发连接的瓶颈)。Apache 的进程模型在高并发时资源消耗剧增,导致性能骤降。
Igor Sysoev[伊戈尔·赛索耶夫] 的突破
俄罗斯程序员 Igor Sysoev 于 2002 年启动开发,目标是通过异步事件驱动架构替代同步模型。2004 年 10 月 4 日首次公开发布,其核心设计利用操作系统的高效 I/O 机制(如 Linux 的 epoll、BSD 的 kqueue),单机可支撑 2 万-5 万并发连接,显著降低内存与 CPU 占用。
1.2 发展历程:从开源项目到商业生态
1.3 技术特性与核心优势
架构创新
事件驱动模型:异步非阻塞 I/O 处理请求,避免进程/线程切换开销,提升并发能力。
模块化设计:核心功能解耦为模块(如 HTTP 模块、Stream 模块),支持动态加载扩展。
核心功能场景
反向代理与负载均衡:支持轮询、IP 哈希等算法,分配流量至后端集群。
动静分离与缓存:高效处理静态资源,动态请求代理至应用服务器(如 Tomcat),减少后端压力。
SSL/TLS 终止:集中处理加密流量,降低后端计算负担。
1.4 当前市场地位与应用场景
市场份额与覆盖
截至 2025 年,全球 55.6% 的网站 由 Nginx 或其衍生产品支持(包括 Netflix、Airbnb、Spotify 等),居市场首位。
中国 BAT、新浪、网易等企业广泛采用,成为高性能网关标准方案。
核心应用场景
云原生与微服务:作为 Kubernetes Ingress Controller 管理集群流量。
API 网关与安全:集成 WAF、限流等功能,保护后端服务。
边缘计算:处理 CDN 边缘节点请求,加速内容分发。
🔮 五、未来方向:云原生与开源深化
技术演进
支持 HTTP/3 与 QUIC 协议,优化延迟敏感型应用(如实时视频)。
扩展 NGINX Unit(多语言应用服务器),实现动态配置与无重启部署。
生态战略
开源承诺强化:F5 宣布将 DNS 服务发现等关键功能免费加入开源版,推动社区贡献。
开发者体验优化:简化配置工具链,集成 SaaS 监控方案(如 NGINX Amplify)。
六、Nginx 介绍
官方文档:https://nginx.org/en/
Nginx是一款开源的HTTP和反向代理服务器,同时也支持邮件代理服务器和通用的TCP/UDP代理服务器。
Nginx 的架构可以大致分为以下几个主要部分:
1、Master Process (主进程)
2、Worker Process (工作进程)
3、Modules (模块)
4、Configuration File (配置文件)
5、Cache (缓存)
二、Nginx架构及交互过程
2.1 基础概念
Master进程
功能:Master进程是Nginx的主控制进程,负责读取和验证配置文件、管理Worker进程。它可以进行配置加载(Load configuration)、启动Worker进程(Launch workers)以及在不停止服务的情况下进行升级(Non-stop upgrade)。
特点:Master进程并不直接处理网络请求,主要专注于管理和监控Worker进程的运行状态,确保Nginx的稳定运行。
Worker进程
功能:Worker进程是实际处理客户端请求的进程。每个Worker进程都能独立地处理多个客户端连接。它们通过多路复用技术(Multiplexing via kevent/epoll/select)来同时监听和处理多个请求,提高了资源利用率和请求处理效率。Worker进程中包含多个模块,如http_core(处理HTTP核心功能)、http_upstream(处理上游服务器相关操作)、http_proxy(代理模块)、http_fastcgi(与FastCGI通信模块)。
特点:Worker进程之间是平等的,它们竞争地处理来自客户端的请求。Nginx采用多进程模型,每个Worker进程都是独立的,这样可以避免一个请求的阻塞影响其他请求的处理,增强了系统的稳定性和并发处理能力。
代理缓存(proxy cache)
功能:代理缓存用于缓存上游服务器(如Web server、Application server等)的响应结果,当下次有相同的请求时,可以直接从缓存中获取数据返回给客户端,减少对上游服务器的压力,提高响应速度。
特点:包括缓存加载器(Cache loader)和缓存管理器(Cache manager)。缓存加载器负责在Nginx启动时加载缓存数据,缓存管理器则负责管理缓存的生命周期,包括缓存的清理、更新等操作。
后端服务器(Backend)
功能:后端服务器包括Web服务器(如Apache)、应用服务器(如Tomcat)和Memcached等。Nginx可以作为反向代理服务器,将客户端的请求转发到这些后端服务器上,并将后端服务器的响应返回给客户端。
通信方式:Nginx通过HTTP、FastCGI、memcache等协议与后端服务器进行通信。例如,通过FastCGI协议与应用服务器交互,通过memcache协议与Memcached服务器交互。
2.2 交互过程(Reciprocal process)
- 客户端请求:客户端通过HTTP/HTTPS协议向Nginx发送请求。
- Master与Worker交互:Master进程接收到请求后,并不直接处理,而是根据一定的策略(如轮询、IP哈希等)将请求分配给一个Worker进程。Worker进程通过多路复用技术(如epoll)同时监听多个连接,当有请求到达时,Worker进程会进行处理。
- 请求处理与转发:Worker进程根据配置的规则,判断请求是否需要转发到后端服务器。如果需要,Worker进程会通过相应的协议(如FastCGI、HTTP等)将请求转发给后端服务器(Web server、Application server等)。后端服务器处理请求后,将响应结果返回给Worker进程。
- 响应处理:Worker进程接收到后端服务器的响应后,如果配置了代理缓存,会判断是否需要缓存响应结果。如果不需要缓存,直接将响应返回给客户端;如果需要缓存,则将响应结果存储到代理缓存中,并返回给客户端。当下次有相同的请求时,Worker进程可以直接从代理缓存中获取响应结果返回给客户端,减少后端服务器的压力。
三、Nginx核心功能及配置
3.1 正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
例如:你需要访问google,google不知道访问它的客户端是谁,它只知道这个中间服务器在访问它,所以中间服务器代理了我们客户端,去访问google,这种就叫做正向代理。
3.2 Nginx 反向代理
反向代理就是客户端去访问服务器,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后(注:后面会讲到负载均衡轮询,多个服务器才可以负载均衡),再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是nginx代理服务器地址,隐藏了真实服务器IP地址。
好处是:
1.解决跨域问题,
2.隐藏了服务器真实地址及目录路径,
3.实现负载均衡功能。
3.3 nginx负载均衡
反向代理代理多台服务器的情况下,按照一定的算法【权重、轮询】,将客户端请求转发到不同服务器上,减轻单个服务器压力,提高系统并发量。
通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕机,请求将自动发送到其他正常的服务器。
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
3.4 nginx动静分离
动态(数据/页面)和静态(数据/页面)分开请求。进而提升整个服务访问性能和可维护性。
例如接口是必须动态去请求的,那么我们图片img或者一些pdf文件,就没必要叫后端再给你接口返回,可以在nginx配置,直接静态获取你存放在服务器上的图片。
3.5 Nginx 配置文件
nginx.conf
配置文件路径:位于/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx目录中。
全局块
全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。启动 Nginx
events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。
这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。systemctl restart nginx.service
http块
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。
server块
server 块用于定义一个虚拟主机(或服务端点),通过监听特定端口/域名来接收请求,并配置对应的处理逻辑(如路由、反向代理、SSL 等)
listen指令 #监听ip/端口等
location块 #基于Nginx服务器接收到的请求字符串,对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。
root指令 #设置请求寻找资源的跟目录
nginx.conf中文详解:https://www.w3cschool.cn/nginx/nginx-d1aw28wa.html
3.6 Nginx location 匹配规则详细解说+正则表达式
location 支持的语法 location [=|||^~|@] pattern { … }
location修饰符类型说明
「=」 修饰符:要求路径完全匹配
「~」修饰符:区分大小写的正则匹配
「~」不区分大小写的正则匹配
「^~」修饰符:前缀匹配 #如果该 location 是最佳的匹配,那么对于匹配这个 location 的字符串, 该修饰符不再进行正则表达式检测。注意,这不是一个正则表达式匹配,它的目的是优先于正则表达式的匹配。
一个最简单的 location 的例子如下:
server {server_name website.com;location /admin/ {# The configuration you place here only applies to# http://website.com/admin/}
}
3.7 查找的顺序及优先级
当有多条 location 规则时,nginx 有一套比较复杂的规则,优先级如下:
①精确匹配 =
②前缀匹配 ^~(立刻停止后续的正则搜索)
③按文件中顺序的正则匹配 或*
④匹配不带任何修饰的前缀匹配。
这个规则大体的思路是先精确匹配,没有则查找带有 ^~的前缀匹配,没有则进行正则匹配,最后才返回前缀匹配的结果。都是正则表达式,匹配时使用文件中的顺序,找到返回。前缀匹配下,返回最长匹配的 location,与 location 所在位置顺序无关。
举例:
server {server_name website.com;location /doc {return 701; # 用这样的方式,可以方便的知道请求到了哪里}location ~* ^/document$ {return 702; # 用这样的方式,可以方便的知道请求到了哪里}
}curl -I website.com:8080/document
HTTP/1.1 702
匹配优先级:
Nginx的location匹配规则中,精确匹配(=或正则~* ^…)优先级高于前缀匹配(/document)。因此,/document会优先匹配到location ∗/document)优先级高于前缀匹配(/document)。
因此,/document会优先匹配到location ~* ^/document)优先级高于前缀匹配(/document)。因此,/document会优先匹配到location ∗/document,返回702。
四、Nginx部署使用
4.1 Nginx 安装配置(CentOS为例)
安装 (Centos7.9,openeuler22.03,KylinV10;Intel® Xeon® CPU E5-2680 v4 @ 2.40GHz)
rpm -ivh nginx-1.20.2-1.el7.ngx.x86_64.rpm
注意:国产操作系统openeuler以及麒麟系统在安装时会提示依赖报错,如遇到另外安装安装兼容包“compat-openssl10-1.0.2o-3.el8.x86_64.rpm”
启动 Nginx
systemctl daemon-reload #systemd实现服务管理
systemctl restart nginx.service
systemctl enable nginx.service
/usr/sbin/nginx -c /etc/nginx/nginx.conf #手动启动
nginx -s stop #直接kill进程
nginx -s quit #等待工作进程完成当前请求后再终止。
4.2 Nginx 部署规划(高性能)——利用keepalived软件
nginx服务安装keepalived软件
yum install keepalived -y
keepalived配置修改启动 Nginx
备份修改master节点/Backup节点/etc/keepalived/keepalived.conf,新增check_nginx.sh
配置说明:1. router_id不同, 2.state BACKUP不同 ,3.priority不同。 4.virtual_router_id必相同
高可用检查验证
1、nginx主备两台用ip addr查看IP地址:主节点网卡此时已经自动获取VIP,备节点则没有处于空闲状态。
2、停止主节点上nginx服务看服务是否自动拉起,服务是否正常访问;
3、注释check_nginx.sh脚本中拉起nginx的命令,停止nginx,查看VIP是否转移,服务是否正常访问。
keepalived101.conf
! Configuration File for keepalived
global_defs {router_id nginx_101vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state MASTERinterface enp0s3virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass Nginx@123}virtual_ipaddress {192.168.56.111}track_script {check_nginx}
}
keepalived102.conf
! Configuration File for keepalived
global_defs {router_id nginx_102vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass Nginx@123}virtual_ipaddress {192.168.56.111}track_script {check_nginx}
}
check_nginx.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
echo "检查nginx服务状态counter=$counter"
if [ "${counter}" = "0" ]; thenecho "nginx服务不存在,尝试拉起"systemctl start nginxsleep 1counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; thenecho "关闭keepalived服务"systemctl stop keepalivedfi
fi
4.3 常见执行
测试配置文件是否有语法错误
nginx -t
nginx应用内置的stub_status 状态展示模块。
nginx -V 2>&1 | grep -o with-http_stub_status_module
#如果在终端中输出 `with-http_stub_status_module` ,则说明 Nginx 已启用。
重新加载配置文件
nginx -s reload
性能测试
yum install httpd-tools
ab -n 4000000 -c 1250 http://172.30.137.177:80/ # -n 4000000 总请求数400000 -c 1250 单个时刻并发数125 172.30.137.177为nginx所在服务器IP
4,4 访问控制
配置 firewall-cmd 以指定源和目标 IP 地址访问特定的 IP 地址和端口,
systemctl status firewalld #检查防火墙状态
systemctl start firewalld #激活防火墙服务
限制允许nginx服务server listen访问端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<源IP>" destination address="<目标IP>" port protocol="tcp" port="<port>" accept'
限制允许akeepalive服务心跳端口
sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
查询配置是否生效
sudo firewall-cmd --list-all #查看所有当前激活的防火墙规则。
4.5 nginx排错
首要步骤: 遇到错误时,务必首先查看 Nginx 的错误日志 (error.log)。日志通常位于 /var/log/nginx/error.log 或 Nginx 配置中 error_log 指令指定的路径。日志会提供最直接、最具体的错误信息(如文件权限错误的具体路径、连接上游失败的地址端口等),是诊断问题的关键。
区分责任: 4xx 错误通常表明问题在客户端请求本身或服务器配置/权限;5xx 错误则表明服务器端(Nginx 本身、上游服务、资源限制)存在问题。499 是客户端主动行为。
修改配置后: 每次修改 Nginx 配置文件后,务必使用 nginx -t 测试配置语法是否正确,然后使用 systemctl reload nginx 或 /etc/init.d/nginx reload 重新加载配置使更改生效(避免重启中断服务)。
后端应用: 对于 500, 502, 504,排查重心通常在后端应用程序或其运行环境上。需要结合后端日志分析。
超时设置: 调整超时参数(如 proxy_read_timeout)需谨慎,过长的超时可能导致资源浪费和连接堆积。优先优化后端应用的响应速度。
参考:
Nginx 官方文档:https://nginx.org
F5 Nginx官方网站:http://www.f5.com.cn
Nginx 入门介绍: https://v.douyin.com/q2QNkMmgw3k/ r@e.Bg jpQ:// 11/30
Nginx 入门指南: https://www.w3cschool.cn/nginx/
Nginx架构概述:https://cloud.tencent.com/developer/article/1032001