一、Nginx核心认知回顾
Nginx是一款高性能的HTTP和反向代理服务器 同时支持IMAP/POP3/SMTP代理 核心优势在于"事件驱动"架构 能高效处理成千上万的并发连接
Nginx核心功能总览:静态资源服务 反向代理 负载均衡 SSL/TLS配置(HTTPS)URL重写 缓存机制 这六大功能是Nginx部署和使用的核心 也是实际工作中最常用的场景
Nginx核心功能详解
静态资源服务
功能说明
静态资源指无需后端解析 可直接返回给客户端的文件 包括HTML、CSS、JS、图片 视频 字体等Nginx对静态资源的处理效率极高 远超Apache 是部署静态网站 前端项目(如Vue、React打包后的项目)的首选
核心优势:支持文件压缩(gzip)断点续传 资源缓存 能大幅提升客户端访问速度 降低服务器带宽压力
实操配置(CentOS 8基于之前Nginx部署环境)
Nginx静态资源配置核心是"虚拟主机(server块)" 指定网站根目录 默认首页 搭配压缩 缓存配置优化访问体验
# 编辑Nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
# 静态资源服务核心配置(server块)
server {
listen 80; # 监听80端口(HTTP)
server_name www.static-test.com; # 服务器域名/IP(需解析或配置本地hosts)
# 静态资源根目录(存放HTML、CSS、JS等文件)
root /usr/local/nginx/static; # 自定义目录,需提前创建
# 默认首页(访问域名时优先加载的文件,按顺序匹配)
index index.html index.htm index.css;
# 1. 静态资源压缩配置(gzip),降低带宽占用
gzip on; # 开启gzip压缩
gzip_types text/html text/css text/javascript application/json image/jpeg image/png; # 需压缩的文件类型
gzip_min_length 1k; # 文件大小超过1k才压缩
gzip_comp_level 6; # 压缩级别(1-9,级别越高压缩率越高,占用CPU越多)
# 2. 静态资源缓存配置(客户端缓存,减少重复请求)
location ~* \.(jpg|png|gif|css|js)$ { # 匹配指定后缀的静态文件
expires 7d; # 缓存7天(客户端再次访问时直接读取本地缓存)
add_header Cache-Control "public, max-age=604800"; # 缓存控制头
}
# 3. 访问控制(允许所有IP访问,也可限制特定IP)
location / {
try_files $uri $uri/ /index.html; # 若请求文件不存在,跳转至index.html(适配前端路由)
# 限制特定IP访问(可选)
# allow 192.168.1.100; # 允许该IP访问
# deny all; # 禁止其他所有IP访问
}
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
注意事项
- 静态资源目录需提前创建 且赋予正确权限(chmod -R 755 /usr/local/nginx/static)避免Nginx无法读取文件
- gzip压缩虽能降低带宽 但会占用服务器CPU资源 生产环境建议压缩级别设为4-6 平衡性能和压缩效果
- 缓存时间需根据资源更新频率调整 静态资源(如图片、字体)可设置较长缓存(7-30天)动态更新的静态资源(如JS、CSS)可设置较短缓存(1-3天)
反向代理
功能说明
反向代理是指Nginx接收客户端的所有请求 再将请求转发到后端的应用服务器(如Tomcat、PHP-FPM、Python Flask)客户端无需直接访问后端服务器 仅与Nginx交互
核心作用:
- 隐藏后端服务器地址 提升系统安全性(避免后端服务器直接暴露在公网)
- 分担后端服务器压力 Nginx可处理静态资源请求 仅将动态请求转发至后端
- 实现端口转发(如客户端访问80端口,Nginx转发至后端8080端口)
实操配置
假设后端Tomcat服务运行在本机8080端口 Nginx监听80端口 将所有动态请求(.jsp)转发至Tomcat 静态请求由Nginx直接处理
server {
listen 80;
server_name www.proxy-test.com;
# 静态资源处理(Nginx直接返回)
root /usr/local/nginx/static;
index index.html index.htm;
# 反向代理配置:将.jsp结尾的请求转发至Tomcat
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8080; # 后端服务器地址(Tomcat地址+端口)
# 传递客户端信息至后端(重要,避免后端获取不到客户端真实IP)
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;
}
# 若需将所有请求都转发至后端(全代理),配置如下:
# location / {
# proxy_pass http://127.0.0.1:8080;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# }
}
注意事项
- proxy_pass后面的地址需正确(后端服务器IP+端口)若后端是集群 可配置 upstream 集群名称(后续负载均衡会讲解)
- proxy_set_header 必须配置 否则后端服务器获取到的客户端IP会是Nginx服务器的IP 无法定位真实客户端
- 可通过location匹配不同路径 实现"静态资源Nginx处理 动态请求转发后端" 提升整体性能
负载均衡
功能说明
当后端应用服务器集群时 Nginx可将客户端请求按照指定策略分发到不同的后端服务器 实现"负载分担"避免单台服务器压力过大 同时实现"故障转移"(某台后端服务器宕机 Nginx自动将请求转发至其他正常服务器)提升系统可用性
Nginx默认支持3种负载均衡策略 可根据后端服务器性能 业务需求选择
常用负载均衡策略
-
轮询(默认):请求按顺序分发到后端服务器 适用于后端服务器性能一致的场景 若某台服务器宕机 Nginx会自动跳过该服务器 不影响服务
-
权重(weight):根据后端服务器性能设置权重 权重越高 接收的请求越多 适用于后端服务器性能不一致的场景(如高性能服务器权重设为3 普通服务器设为1)
-
IP哈希(ip_hash):根据客户端IP地址哈希计算 将同一客户端的请求始终分发到同一台后端服务器 适用于需要会话保持的场景(如用户登录后 后续请求需访问同一台服务器获取会话信息)
实操配置
# 编辑Nginx主配置文件,在http块中配置upstream(后端集群)
http {
include mime.types;
default_type application/octet-stream;
# 1. 配置后端服务器集群(upstream名称自定义,如tomcat_cluster)
upstream tomcat_cluster {
# 轮询策略(默认,可省略weight)
server 127.0.0.1:8080; # 后端服务器1
server 127.0.0.1:8081; # 后端服务器2
server 127.0.0.1:8082; # 后端服务器3
# 权重策略(示例)
# server 127.0.0.1:8080 weight=3; # 权重3,接收3/6的请求
# server 127.0.0.1:8081 weight=2; # 权重2,接收2/6的请求
# server 127.0.0.1:8082 weight=1; # 权重1,接收1/6的请求
# IP哈希策略(示例)
# ip_hash;
# server 127.0.0.1:8080;
# server 127.0.0.1:8081;
# server 127.0.0.1:8082;
# 故障转移配置(可选,超时时间设置)
proxy_connect_timeout 5s; # 连接后端服务器超时时间
proxy_read_timeout 10s; # 读取后端服务器响应超时时间
}
# 2. 虚拟主机配置,将请求转发至集群
server {
listen 80;
server_name www.loadbalance-test.com;
location / {
proxy_pass http://tomcat_cluster; # 转发至upstream集群
# 传递客户端信息至后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
SSL/TLS配置
功能说明
HTTPS是在HTTP基础上加入SSL/TLS加密协议 实现客户端与服务器之间的数据加密传输 防止数据被窃取 篡改 是目前Web服务的必备配置(尤其是涉及用户登录 支付等敏感信息的场景)
Nginx支持SSL/TLS协议 需提前获取SSL证书(可通过Let's Encrypt申请免费证书 或购买商业证书)证书格式通常为.pem(公钥)和.key(私钥)
实操配置(基于免费SSL证书)
http {
include mime.types;
default_type application/octet-stream;
# SSL全局配置(优化加密性能)
ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议版本(禁用不安全的TLSv1.0、TLSv1.1)
ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; # 高强度加密套件
ssl_session_cache shared:SSL:10m; # SSL会话缓存,提升复用率
ssl_session_timeout 10m; # SSL会话超时时间
# HTTPS虚拟主机配置(监听443端口)
server {
listen 443 ssl; # 监听443端口(HTTPS默认端口)
server_name www.https-test.com; # 域名(需与SSL证书匹配)
# SSL证书路径(将证书上传至Nginx的conf/cert目录)
ssl_certificate cert/xxx.pem; # 证书公钥文件
ssl_certificate_key cert/xxx.key; # 证书私钥文件
# 网站根目录(静态资源)
root /usr/local/nginx/static;
index index.html index.htm;
# 反向代理(可选,转发至后端服务器)
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 配置HTTP自动跳转至HTTPS(推荐,强制使用HTTPS)
server {
listen 80;
server_name www.https-test.com;
return 301 https://$server_name$request_uri; # 301永久跳转,搜索引擎会更新地址
}
}
缓存机制(提升访问速度)
功能说明
Nginx缓存机制分为"客户端缓存"(之前静态资源配置中提到的expires)和"服务器端缓存" 服务器端缓存是指Nginx将后端服务器返回的响应数据缓存起来 当后续有相同请求时 Nginx直接返回缓存数据 无需再次请求后端 大幅提升响应速度 降低后端服务器压力
适用场景:后端接口响应较慢 数据更新频率低的场景(如商品详情页 新闻详情页)
实操配置(服务器端缓存)
http {
include mime.types;
default_type application/octet-stream;
# 配置缓存路径(自定义缓存目录,需提前创建)
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=7d use_temp_path=off;
# 说明:
# levels=1:2:缓存目录层级(1级目录+2级子目录,避免单个目录文件过多)
# keys_zone=my_cache:10m:缓存区域名称my_cache,占用内存10MB(存储缓存key)
# max_size=10g:缓存文件最大容量10GB,超过后自动删除最久未使用的缓存
# inactive=7d:缓存文件7天未被访问,自动删除
# use_temp_path=off:禁止使用临时目录,避免缓存文件频繁移动
server {
listen 80;
server_name www.cache-test.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 启用服务器端缓存
proxy_cache my_cache; # 关联上面配置的缓存区域
proxy_cache_key "$host$request_uri"; # 缓存key(根据域名+请求路径生成,确保唯一)
proxy_cache_valid 200 304 1h; # 状态码200、304的响应,缓存1小时
proxy_cache_valid any 1m; # 其他状态码的响应,缓存1分钟
proxy_cache_min_uses 3; # 请求超过3次后才缓存(避免缓存一次性请求)
proxy_cache_bypass $cookie_nocache $arg_nocache; # 满足条件时,不使用缓存(如带nocache参数的请求)
proxy_no_cache $cookie_nocache $arg_nocache; # 满足条件时,不缓存响应
}
}
}
Nginx核心功能配置注意事项汇总
-
配置文件语法:Nginx配置文件对语法要求严格,括号、分号不能遗漏,修改后需执行"/usr/local/nginx/sbin/nginx -t"检查语法,无误后再重启(reload)
-
权限问题:Nginx运行用户(默认nobody)需拥有静态资源目录、缓存目录、证书目录的读取权限,否则会出现403错误
-
日志排查:若配置生效后出现异常,可查看Nginx错误日志(/usr/local/nginx/logs/error.log),定位问题(如端口被占用、路径错误、后端连接失败)
-
性能优化:根据服务器配置调整worker_processes(工作进程数,建议设为CPU核心数)、worker_connections(每个进程最大并发连接数),提升Nginx并发处理能力
-
结合Linux安全:部署Nginx时,需配合Linux系统安全配置(如防火墙开放80、443端口,限制Nginx进程权限,定期更新Nginx版本修复漏洞)