一、什么是Nginx

Nginx是一款开源的高性能 Web 服务器软件,同时兼具反向代理负载均衡HTTP 缓存邮件代理等多种核心功能。Nginx 采用了异步非阻塞的事件驱动模型(epoll),使其能够以极低的系统资源消耗处理海量并发连接。

  • 作为 Web 服务器:快速将 HTML、图片、CSS 等静态资源交付给用户浏览器,保障页面高速加载;

  • 作为反向代理:隐藏后端服务器集群结构,接收客户端请求后智能转发至后端应用服务器(如 Java、Python 应用),再将处理结果返回客户端,提升系统安全性与响应速度;

  • 作为负载均衡器:将高并发请求均匀分发至多台后端服务器,避免单点过载,保障服务高可用与扩展性;

  • 作为 HTTP 缓存:缓存后端高频访问响应,直接返回缓存结果,减少后端服务器压力。
    ![[Pasted image 20260408103050.png]]

二、Nginx核心特性深度解析

2.1 高性能:极速响应的技术内核

核心含义:以极低延迟处理客户端请求并返回响应,尤其擅长静态资源分发。

技术原理

  • 事件驱动架构:采用 “主进程 + 多工作进程” 模式,主进程负责管理配置与工作进程,工作进程处理实际请求,避免多进程上下文切换开销;

  • 异步非阻塞 I/O:工作进程处理请求时,若需等待(如磁盘读写、后端响应),不会阻塞等待,而是立即处理其他就绪请求,待数据准备完成后再回溯处理,类似高效服务员同时服务多桌客人;

  • 高效系统调用:处理静态文件时使用sendfile系统调用,直接在内核缓冲区传输数据,避免用户态与内核态的冗余拷贝,大幅提升传输效率。实际效果:静态资源响应速度毫秒级,支撑高并发场景下的快速访问体验。

2.2 高并发:万级连接的处理能力

核心含义:单机可稳定支撑数万甚至数十万并发网络连接,轻松应对高流量场景。

技术原理

  • “单进程多连接” 模型:每个工作进程通过事件循环机制,在单个线程内管理成千上万个连接,突破传统 “一连接一进程” 的资源限制;

  • 极低连接内存占用:每个连接仅占用数百字节内存,远低于线程模型的栈内存分配,可在有限内存下支撑海量连接。实际效果:完美解决 C10K 乃至 C100K 问题,成为电商秒杀、直播带货等超高并发场景的首选服务器。

2.3 低内存占用:轻量稳定的资源控制

核心含义:相同负载下,内存占用远低于传统 Web 服务器,保障系统长期稳定运行。

技术原理

  • 精简进程模型固定数量的工作进程,内存占用稳定,不会随连接数增加线性增长;

  • 高效内存管理:内置内存池与优化数据结构,减少频繁内存分配 / 释放,避免内存碎片产生。实际效果:降低服务器硬件配置要求,减少内存耗尽导致的崩溃风险,提升服务稳定性。

2.4 反向代理:后端服务的“安全网关”

核心含义:作为客户端与后端服务器的中间层,代理转发请求与响应,隔离客户端与后端架构。

核心价值

  • 安全防护:隐藏后端服务器 IP 与结构,避免直接暴露在公网,降低攻击风险;

  • SSL 终结:集中处理 HTTPS 加密 / 解密工作,减轻后端服务器 CPU 负载;

  • 动静分离:静态请求(图片、CSS)由 Nginx 直接处理,动态请求(PHP、Java)转发至应用服务器,优化资源分配;

  • 缓存加速:缓存后端响应结果,重复请求直接返回缓存,提升访问速度。
    ![[Pasted image 20260408103141.png]]

2.5 负载均衡:集群调度的 “智能中枢”

核心含义:将客户端请求按策略分发至多台后端服务器,实现负载分担,保障服务高可用。

核心价值

  • 高可用:自动检测后端服务器状态,故障节点自动剔除,流量转发至健康节点;

  • 扩展性:通过增加后端服务器实现水平扩展,无需修改前端配置;

  • 性能优化:分散单节点负载,避免单点瓶颈,提升整体处理能力。

常用调度算法

  • 轮询:按顺序依次分发请求,适用于后端服务器性能一致场景;

  • 加权轮询:按服务器性能分配权重,高性能节点接收更多请求;

  • 最少连接:将请求转发至当前连接数最少的节点,动态适应负载差异;

  • IP 哈希:基于客户端 IP 计算哈希值,固定分发至同一节点,保障会话持久性。
    ![[Pasted image 20260408103254.png]]

2.6 nginx模块

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能

  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等

  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持

  • Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向

  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

三、Nginx实战部署与配置

3.1 环境部署(CentOS Stream 10)

第一步:环境准备。关闭安全组件,避免干扰Nginx安装与运行

# 临时关闭SELinux
sudo setenforce 0

# 永久禁用selinux(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 禁用防火墙并设置开机不自启
sudo systemctl disable --now firewalld
# 注意: 如果用的是云服务器(如 GCP, 阿里云, 腾讯云),云平台控制台还有一个 “安全组(Network SG)”。如果安全组没开 80 端口,即便你关了系统的 `firewalld`,外面还是连不上。

第二步:更换国内镜像源

# 备份现有源
sudo mkdir /etc/yum.repos.d/bak
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/

# 下载新的源配置文件(使用的系统版本较新,阿里云还没给centos 10准备好特定的.repo下载链接,现在我手动配置阿里云镜像源)
# sudo curl -o /etc/yum.repos.d/CentOS-Stream.repo https://mirrors.aliyun.com/repo/Centos-stream-10.repo
# 创建文件
sudo vim /etc/yum.repos.d/aliyun.repo

[baseos]
name=CentOS Stream 10 - BaseOS - aliyun
baseurl=https://mirrors.aliyun.com/centos-stream/10-stream/BaseOS/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official

[appstream]
name=CentOS Stream 10 - AppStream - aliyun
baseurl=https://mirrors.aliyun.com/centos-stream/10-stream/AppStream/x86_64/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/centos-stream/RPM-GPG-KEY-CentOS-Official

# 禁用官方源,避免冲突。给他改个名字
sudo mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.bak

# 刷新缓存
sudo dnf clean all && sudo dnf makecache

# 安装扩展源
sudo dnf install -y epel-release
sudo dnf makecache

第三步:安装Nginx

sudo dnf install nginx -y

# 确认安装结果
nginx -v

![[Pasted image 20260408154337.png]]

第四步:管理Nginx服务

# 启动服务
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 查看服务运行状态
sudo systemctl status nginx 

![[Pasted image 20260408154459.png]]

第五步:配置防火墙
即使nginx运行正常,如果防火墙没打开80端口,外部浏览器也访问不了。

# 允许HTTP流量(80端口)
sudo firewall-cmd --permanent --add-service=http

# 允许HTTPS流量(443端口)
sudo firewall-cmd --permanent --add-service=https

# 重新加载防火墙配置使其生效
sudo firewall-cmd --reload

3.2Nginx核心文件位置

  • 主配置文件:/etc/nginx/nginx.conf

  • 自定义配置文件存放地:/etc/nginx/conf.d/

  • 默认网页存放目录:/usr/share/nginx/html/

  • 访问日志:/var/log/nginx/access.log

  • 错误日志:/var/log/nginx/error.log

3.3主配置文件解析

请求生命周期(请求进来 -> 匹配Server -> 匹配Location -> 转发/处理 -> 返回)

# 1. 全局配置段(影响整个Nginx服务)
user nginx;                  # 运行Nginx的用户
worker_processes auto;       # 工作进程数(自动适配CPU核心数)
error_log /var/log/nginx/error.log warn;  # 错误日志路径与级别
 
# 2. 事件模块配置(网络连接相关,主要影响nginx服务器与用户的网络连接)
events {
    worker_connections 1024; # 每个工作进程最大连接数
    use epoll;               # 使用epoll事件驱动模型(Linux最优选择)
}
 
# 3. HTTP模块配置(HTTP协议相关)
http {
    # 定义访问日志的打印格式(access_log使用)
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main; # 访问日志启用
    
    include /etc/nginx/conf.d/*.conf; # 引入子配置文件
    
    # default_type:默认传输的文件类型(如application/octet-stream)
    # sendfile on:开启高效文件传输模式
    
    # 4. 虚拟主机配置(单个服务实例)
    server {
        listen 80;           # 监听端口(HTTP默认80)
        server_name localhost; # 绑定域名/IP
        root /usr/share/nginx/html; # 网页根目录
        index index.html index.htm; # 默认首页文件
        
        # 5. 路径匹配配置(URI请求处理)
        location / {
            allow all;       # 允许所有IP访问
            try_files $uri $uri/ /index.html; # 尝试匹配静态文件,不存在则返回首页
        }
        
        # 错误页面配置
        error_page 404 /404.html; # 404错误返回页面
        error_page 500 502 503 504 /50x.html; # 服务器错误返回页面
    }
}

----------------------------------------------------------分割线,以下内容为http块补充内容
# Upstream块(负载均衡)
# 用于定义一组后端服务器,实现负载均衡
upstream my_backend {
    server 192.168.1.10:8080 weight=2; # 权重
    server 192.168.1.11:8080;
    ip_hash; # 同一IP转发到固定服务器,解决Session问题
}

# Server块(虚拟主机)
# 一个http块可以包含多个server块。每个server块代表一个独立的网站或服务。
listen:监听的端口
server_name:域名

# Location块(路由匹配)
# 这是server块内部最核心的部分,决定了nginx如何根据请求的URI(路径)来处理请求。
处理逻辑:
	静态处理:通过root或alias指定本地磁盘路径,直接返回文件
	动态转发:通过proxy_pass将请求转发给后端的Tomcat/PHP/Python。

# root会把location的路径拼接到后面,而alias则是直接替换。	
server {
   listen 80;
   server_name www.kgc.com;
   location /nwes {
        root /data/nginx/html/pc/;
        #相当于追加,将文件夹news追加到/data/nginx/html/pc/news
        }
   location /study{
        alias /mnt/nginx/sports/;
        #相当于替换,你访问study就是访问/mnt/nginx/sports
        }
}

3.4 location匹配

在一个server中location配置段可存在多个,用于实现从url到文件系统的路径映射;ngnix会根据用户请求的url来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个url,url是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

语法规则

##语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }

=              	#用于标准url前,需要请求字串与url精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~            	#用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对url的最左边部分做匹配检查,不区分字符大小写
~              	#用于标准url前,表示包含正则表达式,并且区分大小写
~*            	#用于标准url前,表示包含正则表达式,并且不区分大写
不带符号   	  	 #匹配起始于此url的所有的url

#\            	#用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

四、虚拟主机配置实战

虚拟主机允许单台Nginx服务器托管多个网站,按配置维度分为三类:

4.1 基于域名的虚拟主机(最常用)

通过不同域名区分网站,需配置 DNS 解析或本地 hosts 映射,配置文件/etc/nginx/conf.d/domain-host.conf

# 域名www.abc.com对应的网站
server {
    listen 80;
    server_name www.abc.com;
    root /www/abc;
    index index.html;
}
 
# 域名www.def.com对应的网站
server {
    listen 80;
    server_name www.def.com;
    root /www/def;
    index index.html;
}

配置本地 hosts 映射(Linux:/etc/hosts,Windows:C:\Windows\System32\drivers\etc\hosts):

34.92.187.50 www.abc.com www.def.com

创建测试文件并生效:

sudo mkdir -p /www/{abc,def}
sudo echo "Domain: www.abc.com" > /www/abc/index.html
sudo echo "Domain: www.def.com" > /www/def/index.html
sudo nginx -t && sudo systemctl restart nginx

4.2 基于端口的虚拟主机

通过不同端口区分网站,无需额外 IP,配置文件/etc/nginx/conf.d/port-host.conf

# 端口10001对应的网站
server {
    listen 10001;
    server_name 34.92.187.50;
    root /www/port10001;
    index index.html;
}
 
# 端口10002对应的网站
server {
    listen 10002;
    server_name 34.92.187.50;
    root /www/port10002;
    index index.html;
}

创建测试文件并生效:

sudo mkdir -p /www/port{10001,10002}
sudo echo "Port: 10001" | sudo tee /www/port10001/index.html
sudo echo "Port: 10002" | sudo tee /www/port10002/index.html
sudo nginx -t && sudo systemctl restart nginx

访问验证:http://34.92.187.50:10001http://34.92.187.50:10002

#注意 关系到端口问题,需要考虑到防火墙规则,由于使用的是云平台GCP,所以防火墙规则上需要允许10001、10002端口。经过测试,GCP上的防火墙规则起主导作用,服务器的防火墙的开关不影响端口的访问。

4.3 基于IP的虚拟主机

通过不同 IP 地址区分网站,需先为服务器配置多 IP:

# 为网卡添加额外IP(以ens160为例)
nmcli c modify ens160 +ipv4.addresses 192.168.58.101/24
nmcli c modify ens160 +ipv4.addresses 192.168.58.102/24
nmcli c up ens160 # 应用配置

创建虚拟主机配置文件/etc/nginx/conf.d/ip-host.conf

# 第一个虚拟主机(IP:192.168.58.101)
server {
    listen 80;
    server_name 192.168.58.101;
    root /www/ip101; # 网站根目录
    index index.html;
}
 
# 第二个虚拟主机(IP:192.168.58.102)
server {
    listen 80;
    server_name 192.168.58.102;
    root /www/ip102;
    index index.html;
}

创建网站目录与测试文件:

mkdir -p /www/ip{101,102}
echo "This is 192.168.58.101" > /www/ip101/index.html
echo "This is 192.168.58.102" > /www/ip102/index.html
nginx -t # 验证配置
systemctl restart nginx # 重启生效

五、HTTPS配置(加密通信)

5.1 HTTPS 工作流程

HTTPS 通过 SSL/TLS 协议实现加密通信,核心流程:

1.客户端发送ClientHello:携带支持的协议版本、加密算法列表;

2.服务器返回ServerHello:确认协议版本、选择加密算法,并发送 SSL 证书;

3.密钥交换:客户端验证证书合法性,生成会话密钥并通过证书公钥加密发送给服务器;

4.加密通信:双方使用会话密钥(对称加密)传输数据,保障安全性。

5.2 生成SSL证书(自签名,测试用)

# 创建证书存放目录
mkdir -p /etc/nginx/certs
cd /etc/nginx/certs
 
# 生成私钥(无密码)
openssl genrsa -nodes 2048 > server.key
 
# 生成自签名证书(有效期365天)
openssl req -new -x509 -days 365 -key server.key -out server.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Test/OU=IT/CN=www.test.com/emailAddress=test@test.com"

5.3 HTTPS服务器配置

创建配置文件/etc/nginx/conf.d/https.conf

# HTTPS服务配置
server {
    listen 443 ssl; # 监听443端口(HTTPS默认端口)
    server_name www.test.com;
    root /www/https;
    index index.html;
    
    # SSL证书配置
    ssl_certificate /etc/nginx/certs/server.crt; # 证书路径
    ssl_certificate_key /etc/nginx/certs/server.key; # 私钥路径
    
    # SSL优化配置
    ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; # 加密套件
}
 
# HTTP重定向HTTPS(强制加密访问)
server {
    listen 80;
    server_name www.test.com;
    return 301 https://$host$request_uri; # 永久重定向
}

配置 hosts 映射并生效:

echo "192.168.58.100 www.test.com" >> /etc/hosts
mkdir -p /www/https && echo "HTTPS Test Page" > /www/https/index.html
nginx -t && systemctl restart nginx

访问验证:https://www.test.com(自签名证书需手动信任)

六、故障排查与监控

6.1 日志分析

Nginx 日志是故障排查的核心依据,关键日志解析:

  • 访问日志(/var/log/nginx/access.log):记录每个请求的来源 IP、时间、请求方法、状态码等,示例:
192.168.58.1 - - [10/Oct/2024:14:30:00 +0800] "GET /index.html HTTP/1.1" 200 123 "https://www.test.com" "Mozilla/5.0..."
# 字段含义:来源 IP - 用户名 [访问时间] "请求行" 状态码 响应大小 "referer" "用户代理"
  • 错误日志(/var/log/nginx/error.log):记录服务错误信息(如配置错误、后端连接失败),示例:
2024/10/10 14:35:00 [error] 1234#0: *5 connect() failed (111: Connection refused) while connecting to upstream
# 含义:连接后端服务器失败(拒绝连接)
6.2 状态监控配置

启用 Nginx 内置状态模块,实时查看服务状态:

# 在http模块或server模块中添加
server {
    listen 8080;
    server_name localhost;
    
    location /nginx_status {
        stub_status on; # 启用状态监控
        access_log off; # 关闭访问日志
        allow 127.0.0.1; # 仅允许本地访问
        deny all; # 拒绝其他IP
    }
}

重启 Nginx 后访问监控页面:

curl http://127.0.0.1:8080/nginx_status

返回结果解析:

Active connections: 2 # 当前活跃连接数
server accepts handled requests
 100 100 200 # 总接受连接数、处理连接数、总请求数
Reading: 0 Writing: 1 Waiting: 1 # 读取请求数、写入响应数、等待连接数
6.3 常用排查命令
# 验证配置文件语法
nginx -t
 
# 查看Nginx进程
ps aux | grep nginx
 
# 查看监听端口
netstat -lntup | grep nginx
ss -lntup | grep nginx
 
# 实时查看访问日志
tail -f /var/log/nginx/access.log
 
# 实时查看错误日志
tail -f /var/log/nginx/error.log
 
# 压力测试(需安装httpd-tools)
ab -n 1000 -c 100 http://192.168.58.100/ # 1000个请求,并发100
6.4常用状态码
403(权限/索引文件缺失)

404(路径写错)

502(后端服务挂了)

504(后端响应超时)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐