Nginx 学习总结
1. Nginx 配置结构与流量访问逻辑
1.1 核心配置文件结构
Nginx 的主配置文件(通常是 /etc/nginx/nginx.conf)采用模块化、层级化结构,核心分为以下几个层级:
perl
# 全局块(最外层,影响全局)
user nginx; # 运行Nginx的用户
worker_processes auto; # 工作进程数(建议等于CPU核心数)
error_log /var/log/nginx/error.log warn; # 错误日志路径
pid /var/run/nginx.pid; # PID文件路径
# events块(影响Nginx与用户的网络连接)
events {
worker_connections 1024; # 单个进程最大连接数
use epoll; # 事件驱动模型(Linux默认epoll)
multi_accept on; # 批量接收新连接
}
# http块(核心配置,处理HTTP/HTTPS请求)
http {
include /etc/nginx/mime.types; # 媒体类型映射
default_type application/octet-stream;
# 日志格式定义
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;
sendfile on; # 开启高效文件传输模式
keepalive_timeout 65; # 长连接超时时间
# 虚拟主机配置(server块,可多个)
server {
listen 80; # 监听端口
server_name localhost; # 主机名/域名
location / { # 路由匹配规则
root /usr/share/nginx/html; # 静态文件根目录
index index.html index.htm; # 默认首页文件
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
层级关系总结:
全局块 → events块 → http块 → server块 → location块,层级越靠下,配置优先级越高(同层级内按匹配规则决定)。
1.2 流量访问逻辑(请求处理流程)
用户请求从发送到 Nginx 返回响应,会经历以下核心步骤:
-
客户端建立连接:客户端通过 TCP 协议连接 Nginx 监听的端口(如 80/443),三次握手完成连接。
-
请求解析与分发:Nginx 读取请求头,解析请求的 IP、端口、域名、请求路径等信息。
-
匹配 server 块 :Nginx 根据
listen端口和server_name域名,匹配对应的虚拟主机(server块),匹配优先级:- 先匹配
listen端口; - 端口相同则优先匹配精确域名,再匹配通配符域名,最后匹配正则域名;
- 若都不匹配,使用第一个默认的
server块。
- 先匹配
-
匹配 location 块:进入匹配到的
server块后,根据请求路径匹配location规则,匹配优先级(从高到低):=精确匹配(如location = /index.html)^~前缀匹配(不检查正则,直接匹配前缀)~/~*正则匹配(区分 / 不区分大小写)- 普通前缀匹配(最长匹配优先)
-
执行 location 配置 :根据
location中的配置执行逻辑,比如返回静态文件、反向代理到后端、重定向、防盗链等。 -
构建响应并返回:Nginx 处理完成后,生成响应头和响应体,通过 TCP 连接返回给客户端,最后关闭或复用连接(长连接)。
2. Nginx 安装(二进制 + 多 OS 软件包方式)
2.1 软件包方式(多 OS 通用,简单快捷)
(1)CentOS/RHEL 系列
ini
# 安装依赖
yum install -y yum-utils
# 添加官方Nginx源
cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 安装Nginx
yum install -y nginx
# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
(2)Ubuntu/Debian 系列
ruby
# 安装依赖
apt update && apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# 添加官方Nginx源
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| tee /etc/apt/sources.list.d/nginx.list
# 安装Nginx
apt update && apt install -y nginx
# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
2.2 二进制源码编译安装(自定义模块,灵活可控)
(1)准备依赖
r
# CentOS/RHEL
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel wget
# Ubuntu/Debian
apt install -y gcc g++ make libpcre3-dev zlib1g-dev libssl-dev wget
(2)下载并编译安装
bash
# 下载Nginx源码(以1.26.0为例)
wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0
# 配置编译选项(可添加自定义模块,如--with-stream开启四层代理)
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream # 开启四层代理模块(后续代理MySQL/Redis需要)
# 编译并安装
make && make install
# 创建软链接,方便直接调用
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
# 启动Nginx
nginx
# 停止/重启
nginx -s stop # 强制停止
nginx -s reload # 平滑重启(不中断服务)
3. Nginx HTTPS 配置、防盗链、重定向实践
3.1 HTTPS 配置(Let's Encrypt 免费证书为例)
(1)获取免费 SSL 证书
bash
# 安装certbot工具
yum install -y certbot # CentOS
apt install -y certbot # Ubuntu
# 自动获取证书(需域名解析到当前服务器)
certbot certonly --webroot -w /usr/share/nginx/html -d yourdomain.com -d www.yourdomain.com
# 证书默认路径:/etc/letsencrypt/live/yourdomain.com/
(2)配置 HTTPS 虚拟主机
在nginx.conf的http块中添加server块:
ruby
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 优化SSL配置,提升安全性和性能
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
# 配置HTTP自动跳转到HTTPS
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
3.2 防盗链配置(防止图片 / 资源被其他网站盗用)
通过校验请求头中的Referer字段实现防盗链:
ini
server {
listen 80;
server_name yourdomain.com;
root /usr/share/nginx/html;
# 对图片资源开启防盗链
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
valid_referers none blocked server_names *.yourdomain.com; # 允许的来源
if ($invalid_referer) {
# 盗链请求返回403或替换为提示图片
return 403;
# rewrite ^/.*$ /403.png break; # 也可以返回自定义提示图
}
}
}
说明:
none:允许没有 Referer 的请求(如直接访问);blocked:允许 Referer 被防火墙屏蔽的请求;*.yourdomain.com:允许本域名及子域名的请求。
3.3 重定向配置(常见场景)
(1)HTTP 301 永久重定向(跳转到 HTTPS,上面已演示)
(2)域名跳转(旧域名跳转到新域名)
perl
server {
listen 80;
server_name olddomain.com www.olddomain.com;
return 301 https://www.newdomain.com$request_uri;
}
(3)路径重定向(旧路径跳转到新路径)
bash
server {
listen 80;
server_name yourdomain.com;
# 精确匹配重定向
location = /old.html {
return 301 /new.html;
}
# 正则匹配重定向(带参数)
location ~* ^/blog/(.*)$ {
rewrite ^/blog/(.*)$ /article/$1 permanent;
}
}
说明:permanent表示 301 永久重定向,redirect表示 302 临时重定向。
4. Nginx 虚拟主机配置(IP / 多端口 / 多域名)
虚拟主机的核心是同一台服务器上通过不同标识区分多个网站,Nginx 支持三种方式实现:
4.1 基于 IP 的虚拟主机(多 IP 对应不同网站)
ini
# 服务器有两个IP:192.168.1.10和192.168.1.11
server {
listen 80;
server_name 192.168.1.10;
root /usr/share/nginx/html/site1;
index index.html;
}
server {
listen 80;
server_name 192.168.1.11;
root /usr/share/nginx/html/site2;
index index.html;
}
4.2 基于端口的虚拟主机(同一 IP 不同端口对应不同网站)
ini
server {
listen 80;
server_name 192.168.1.10;
root /usr/share/nginx/html/site1;
index index.html;
}
server {
listen 8080;
server_name 192.168.1.10;
root /usr/share/nginx/html/site2;
index index.html;
}
4.3 基于域名的虚拟主机(同一 IP 同一端口不同域名对应不同网站)
最常用的方式,也是企业中主流的实现:
ini
server {
listen 80;
server_name www.site1.com;
root /usr/share/nginx/html/site1;
index index.html;
}
server {
listen 80;
server_name www.site2.com;
root /usr/share/nginx/html/site2;
index index.html;
}
注意:需要将两个域名都解析到服务器的 IP 上,Nginx 会根据Host请求头匹配对应的server_name。
5. Nginx 反向代理与动静分离演示
5.1 反向代理基础配置
反向代理的核心是proxy_pass指令,将客户端请求转发到后端服务器(如 Tomcat、Node.js、Java 应用等)。
ini
http {
# 定义后端服务器组(方便负载均衡,这里先配置单台)
upstream backend_server {
server 127.0.0.1:8080; # 后端Java应用地址
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://backend_server; # 转发到后端
# 代理头配置(传递客户端真实信息给后端)
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;
}
}
}
5.2 动静分离配置(静态资源由 Nginx 处理,动态请求转发到后端)
原理:静态资源(HTML、CSS、JS、图片)直接由 Nginx 返回,减少后端服务器压力;动态请求(API、数据库交互)转发到后端应用。
bash
http {
upstream backend_server {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name yourdomain.com;
root /usr/share/nginx/html; # 静态资源根目录
# 静态资源直接由Nginx处理
location ~* .(html|css|js|jpg|jpeg|png|gif|ico)$ {
expires 7d; # 设置静态资源缓存7天,提升性能
add_header Cache-Control "public, max-age=604800";
}
# 动态请求转发到后端
location /api/ {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
动静分离的优势:
- Nginx 处理静态资源性能极高,能大幅降低后端服务器负载;
- 静态资源可单独做 CDN 加速,提升用户访问速度;
- 后端服务器只专注处理业务逻辑,架构更清晰。
6. Nginx 四层代理实践(代理 MySQL/Redis)
四层代理工作在传输层(TCP/UDP 协议),通过stream模块实现,和之前的http模块是同级的。
6.1 配置代理 MySQL(默认端口 3306)
ini
# 在nginx.conf中,和http块同级添加stream块
stream {
# 定义MySQL后端服务器组
upstream mysql_backend {
server 192.168.1.20:3306; # MySQL服务器地址
}
# 代理MySQL
server {
listen 3306; # Nginx监听的端口,客户端连接这个端口
proxy_pass mysql_backend;
proxy_connect_timeout 10s;
proxy_timeout 300s;
}
}
客户端连接:mysql -h 你的Nginx服务器IP -P 3306 -u root -p,Nginx 会将请求转发到后端 MySQL 服务器。
6.2 配置代理 Redis(默认端口 6379)
ini
stream {
# 定义Redis后端服务器组
upstream redis_backend {
server 192.168.1.30:6379; # Redis服务器地址
}
# 代理Redis
server {
listen 6379;
proxy_pass redis_backend;
proxy_connect_timeout 5s;
proxy_timeout 300s;
}
}
客户端连接:redis-cli -h 你的Nginx服务器IP -p 6379,Nginx 会将请求转发到后端 Redis 服务器。
7.Nginx 面试高频问答合集
基础认知类
1. 说一说 Nginx 是什么,它有什么特点?
答
Nginx 是一款轻量级、高性能的HTTP 反向代理服务器、Web 静态服务器、四层 / TCP 代理服务器,由俄罗斯程序员开发,开源免费。
核心特点:
- 高并发 :采用事件驱动模型(epoll) ,异步非阻塞架构,单机可支撑十万级并发连接;
- 轻量低耗:代码精简,内存占用极小,CPU 消耗低;
- 模块化设计:功能以模块形式扩展,按需编译安装;
- 稳定性极强:单机常年不间断运行极少宕机;
- 功能丰富:支持反向代理、负载均衡、HTTPS、动静分离、限流、缓存、防盗链、重定向、四层代理等;
- 跨平台:支持 Linux、Windows、Mac 等主流系统,企业主流部署在 Linux。
2. Nginx 和 Apache 区别是什么?
答
-
架构模型
- Nginx:异步非阻塞、事件驱动,多进程 + 多线程,单进程处理大量连接;
- Apache:同步阻塞,多进程 / 多线程模型,一个连接占用一个线程,高并发性能差。
-
并发能力
Nginx 远超 Apache,高并发场景首选 Nginx。
-
资源占用
Nginx 内存、CPU 占用更低。
-
静态资源处理
Nginx 静态文件转发、读取速度碾压 Apache。
-
模块扩展
Apache 原生模块生态更老更全;Nginx 依赖第三方模块拓展。
-
使用场景
现在企业基本统一用 Nginx 做前端入口网关。
进程架构面试题
3. 讲一下 Nginx 进程模型?
答:
Nginx 采用主进程 + 多个工作进程架构:
-
Master 主进程
- 负责读取、解析配置文件;
- 管理 Worker 工作进程;
- 接收运维命令:启动、停止、重启、重载配置;
- 监控 Worker 进程状态,进程挂掉自动拉起。
-
Workr 工作进程
- 实际处理客户端网络请求;
- 默认数量等于 CPU 核心数,最优配置
worker_processes auto;; - 多个 Worker 进程相互独立,抢占式监听端口。
-
Cache Loader 缓存加载进程:加载磁盘缓存到内存。
-
Cache Manager 缓存管理进程:清理过期缓存。
优点:进程隔离,一个 Worker 异常不影响整体服务,稳定性极高。
4. Nginx 平滑重启原理是什么?
答
执行 nginx -s reload 即为平滑重启,不中断业务访问:
- Master 进程读取新配置,校验配置语法是否合法;
- 启动一批新的 Worker 进程,使用新配置处理新请求;
- 老的 Worker 进程不再接收新连接,继续处理已建立的旧请求;
- 旧请求全部处理完成后,旧 Worker 进程自动退出;
- 全程服务无断开,实现无间断更新配置。
配置与请求流程类
5. Nginx 客户端请求完整访问流程?
答
- 客户端发起 TCP 连接,三次握手建立连接;
- 发送 HTTP 请求报文;
- Nginx 读取请求头,解析域名、端口、请求路径;
- 优先匹配 listen 监听端口;
- 同端口下匹配 server_name 虚拟主机;
- 匹配成功进入对应 server 块,再匹配内部 location 路由规则;
- 执行 location 内逻辑:返回静态资源 / 反向代理后端 / 重定向 / 限流拦截;
- 组装响应报文返回客户端;
- 根据 keepalive 决定断开连接或复用长连接。
6. Nginx location 匹配优先级顺序是什么?
答(从高到低)
=精确匹配,优先级最高;^~前缀匹配,匹配成功不再走正则;~区分大小写正则匹配、~*不区分大小写正则;- 普通前缀匹配(最长路径优先匹配);
/通用默认匹配,最后兜底。
7. root 和 alias 的区别?
答
-
root拼接规则:
root路径 + 访问路径示例:
root /html;访问/test/1.jpg→ 找/html/test/1.jpg -
alias:直接精准替换访问路径,不会拼接
示例:
alias /html/test/;访问test/1.jpg→ 直接找/html/test/1.jpg -
总结:
- 日常静态站点多用 root;
- 路径别名映射、单独目录挂载优先用 alias;
- alias 结尾必须加
/避免路径出错。
反向代理 & 正向代理高频题
8. 正向代理和反向代理区别,各自场景?
答
-
正向代理
- 代理客户端,替客户端访问外网;
- 客户端明确知道代理存在,需要手动配置代理地址;
- 作用:隐藏本机 IP、内网翻墙、内网统一出口上网;
- Nginx 很少做正向代理。
-
反向代理
- 代理后端服务器,对外统一入口;
- 客户端无感知,以为访问的就是真实业务服务器;
- 作用:隐藏后端服务地址、负载均衡、统一 SSL 加密、动静分离、网关拦截;
- 企业项目99% 都是 Nginx 反向代理。
9. 反向代理为什么要配置 proxy_set_header 一系列请求头?
答
默认反向代理后,后端拿到的客户端 IP、域名全是 Nginx 服务器信息,丢失真实客户端信息,必须手动传递:
bash
proxy_set_header Host $host; # 传递真实访问域名
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 多层代理溯源IP
proxy_set_header X-Forwarded-Proto $scheme; # 传递http/https协议
业务后端可通过这些请求头获取真实访客 IP、访问域名、请求协议,用于日志统计、登录校验、黑白名单、地区限流等。
负载均衡面试必考
10. Nginx upstream 五种负载均衡策略详解?
答
-
轮询(默认)
请求按顺序轮流分发所有后端节点,节点性能一致使用。
-
加权轮询 weight
给配置高的服务器加大权重,接收更多流量,适配服务器性能不均场景。
-
ip_hash
根据客户端 IP 哈希固定分配后端节点,实现会话保持;
缺点:后端宕机容易会话错乱,集群扩容后会话重新打散。
-
least_conn 最少连接
把请求分发到当前活跃连接数最少的节点,适合接口耗时不一致业务。
-
url_hash(第三方模块)
根据访问 URL 哈希定向分发,多用于静态资源缓存服务器集群。
11. Nginx 负载均衡后端节点状态参数有哪些?
答
backup:备用服务器,主节点全部宕机才启用;down:标记节点永久不可用;max_fails:最大失败连接次数;fail_timeout:失败后暂停转发时长;max_conn:限制后端最大并发连接数。
示例:
ini
upstream web{
server 127.0.0.1:8080 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8081 backup;
}
动静分离面试题
12. 什么是动静分离,为什么要做?
答
-
定义:将网站静态资源和动态接口请求拆分处理:
- 静态资源:html、css、js、图片、视频、字体等,Nginx 直接返回;
- 动态请求:登录、下单、查询数据等接口,转发后端 Java/PHP 服务。
-
好处:
- 极大减轻后端应用服务器压力;
- Nginx 处理静态资源效率远超业务服务;
- 静态资源可加浏览器缓存,提升页面加载速度;
- 架构解耦,静态资源可独立部署 CDN。
HTTPS 与安全类面试
13. Nginx 配置 HTTPS 流程,以及 HTTP 强制跳转 HTTPS 思路?
答
-
部署流程
- 域名完成备案与 DNS 解析;
- 申请 SSL 证书(免费 Let's Encrypt / 商业证书);
- Nginx 开启
ssl_module模块; - 443 端口配置证书路径、加密协议、加密套件;
-
强制跳转思路
- 单独监听 80 端口,匹配所有域名,使用
301永久重定向跳转到 HTTPS; - 线上正式环境统一使用 301,利于 SEO 收录。
- 单独监听 80 端口,匹配所有域名,使用
14. Nginx 如何配置图片防盗链?原理是什么?
答
-
原理:浏览器访问资源时会携带
Referer请求头,记录来源网站地址,Nginx 校验来源合法性,非法来源直接拦截。
-
配置核心:
valid_referers配置合法域名,匹配失败$invalid_referer生效,返回 403 拦截盗链。
限流、缓存高频面试
15. Nginx 实现请求限流有哪几种方式?
答
- limit_req 限制每秒请求数(令牌桶),防高频刷接口;
- limit_conn 限制单 IP 并发连接数,防恶意大量连接攻击;
- 搭配黑白名单、IP 区域封禁实现多层防护。
16. Nginx 静态资源缓存如何配置,作用是什么?
答
通过 expires 设置浏览器缓存过期时间:
ini
location ~* .(png|jpg|css|js)${
expires 7d;
add_header Cache-Control public;
}
作用:用户首次加载缓存静态文件,7 天内重复访问直接走本地缓存,大幅减少服务器请求量,提升访问速度。
四层代理 Stream 面试题
17. Nginx http 模块和 stream 模块区别?
答
-
http 模块 :工作在应用层,专门代理 HTTP/HTTPS 网页请求;
-
stream 模块 :工作在传输层 TCP/UDP,属于四层代理;
-
使用场景:
- stream 用于代理数据库 MySQL、缓存 Redis、SSH、MQ 等 TCP 服务;
- 两个模块同级并列,不能互相嵌套。
故障排查 & 面试题
18. Nginx 常见报错 403、404、502、503 原因分别是什么?
答
-
403 权限拒绝
文件权限不足、目录无默认首页、防盗链拦截、IP 黑名单拦截;
-
404 资源不存在
访问路径错误、root/alias 路径配置错误、文件删除;
-
502 Bad Gateway
反向代理后端服务宕机、端口不通、后端进程卡死;
-
503 Service Unavailable
后端负载过高、限流限制、upstream 所有节点全部不可用。
19. 日常 Nginx 排错常用命令?
答
nginx -t:检查配置文件语法错误;nginx -s reload:平滑重启;nginx -s stop:快速停止;- 查看错误日志:
/var/log/nginx/error.log; - 查看访问日志:
/var/log/nginx/access.log; netstat -tulpn | grep nginx:查看监听端口。
高阶面试压轴题
20. 大型项目中 Nginx 在整体架构中处于什么位置?
答
整体流量架构层级:
用户浏览器/APP → 域名DNS → CDN → 高防IP → Nginx负载均衡网关 → 业务网关Gateway → 微服务集群 → 数据库/缓存
Nginx 是整个后端服务最外层流量入口,承担:流量接入、SSL 解密、限流防攻击、动静分离、负载分发、请求过滤、灰度发布前置能力。