前言
Nginx作为高性能的HTTP和反向代理服务器,已成为企业级应用架构的核心组件。本文从基础环境到高级配置,全面覆盖了Nginx的反向代理、静态资源、限流、SSL和负载均衡四大核心功能。
基础环境准备
# 安装Nginx
yum install -y nginx
# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
# 验证服务状态
systemctl status nginx
核心配置文件路径
- 主配置文件:/etc/nginx/nginx.conf
- 虚拟主机配置目录:/etc/nginx/conf.d/(推荐将站点配置放在此目录,以.conf结尾)
- 日志目录:/var/log/nginx/(access.log 记录访问日志,error.log 记录错误日志)
反向代理配置
反向代理是Nginx最常用的功能之一,通过将客户端请求转发至后端服务器,可实现负载均衡、隐藏真实服务地址、统一入口等效果。
基础反向代理配置
场景:将http://example.com的请求转发至后端192.168.1.100:8080服务。 创建站点配置文件/etc/nginx/conf.d/proxy.conf:
server {
listen 80;
server_name example.com; # 你的域名或服务器IP
# 日志配置
access_log /var/log/nginx/proxy_access.log main;
error_log /var/log/nginx/proxy_error.log warn;
# 反向代理核心配置
location / {
proxy_pass http://192.168.1.100:8080; # 后端服务地址
proxy_set_header Host $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)
}
}
带缓存的反向代理(优化性能)
为减少后端服务压力,可配置Nginx缓存静态资源(如图片、JS、CSS):
http {
# 全局缓存配置(放在http块中)
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2
keys_zone=PROXY_CACHE:10m
max_size=10g
inactive=7d
use_temp_path=off;
server {
# ... 其他配置同上 ...
location ~* \.(jpg|jpeg|png|gif|js|css)$ { # 匹配静态资源后缀
proxy_pass http://192.168.1.100:8080;
proxy_cache PROXY_CACHE; # 启用缓存,关联上述keys_zone
proxy_cache_valid 200 304 1d; # 200/304状态码缓存1天
proxy_cache_valid any 10m; # 其他状态码缓存10分钟
proxy_cache_key "$host$request_uri$is_args$args"; # 缓存键值(确保唯一性)
add_header X-Cache-Status $upstream_cache_status; # 响应头显示缓存状态(HIT/MISS)
}
}
}
静态资源访问配置
场景:将服务器/data/static目录下的资源(图片、JS、CSS 等)通过http://example.com/static/路径对外提供访问。 创建站点配置文件/etc/nginx/conf.d/static.conf:
server {
listen 80;
server_name example.com; # 你的域名或服务器IP
# 日志配置(单独记录静态资源访问日志,便于分析)
access_log /var/log/nginx/static_access.log main;
error_log /var/log/nginx/static_error.log warn;
# 静态资源核心配置:匹配 /static/ 路径的请求
location /static/ {
# 指向服务器本地静态资源目录(末尾必须加 /,与 location 路径对应)
root /data/;
try_files $uri$uri/ /index.html;
# 示例:访问 http://example.com/static/img/logo.png → 实际读取 /data/static/img/logo.png
autoindex off; # 禁用目录索引(避免暴露目录结构)
expires 1d; # 设置浏览器缓存时间(1天,减少重复请求)
add_header Cache-Control "public, max-age=86400"; # 配合 expires 增强缓存策略
}
# 可选:直接匹配文件后缀(覆盖未通过 /static/ 路径访问的静态资源)
location ~* \.(jpg|jpeg|png|gif|bmp|svg|js|css|ico|woff|woff2|ttf|eot)$ {
root /data/;
expires 7d; # 字体、样式文件可设置更长缓存(7天)
add_header Cache-Control "public, max-age=604800";
}
}
- root的作用是定义资源根目录,Nginx会将location匹配到的完整路径(包括location本身定义的路径),直接拼接在root指定的路径之后,形成最终的文件真实路径。
- alias 的作用是为location路径设置别名,Nginx会将location匹配到的路径(即location定义的路径部分)直接替换为alias指定的路径,剩余的请求路径(若有)再拼接到alias路径后。
静态资源压缩配置(优化传输速度)
http {
# 全局 Gzip 压缩配置
gzip on; # 启用 Gzip 压缩
gzip_min_length 1k; # 仅压缩大于 1KB 的文件(小文件压缩收益低)
gzip_buffers 4 16k; # 压缩缓冲区大小
gzip_http_version 1.1; # 支持的 HTTP 版本
gzip_comp_level 6; # 压缩等级(1-9,等级越高压缩率越高但消耗 CPU 越多,推荐 6)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss image/svg+xml; # 需压缩的文件类型
gzip_vary on; # 向客户端返回压缩标识(让浏览器知道资源已压缩)
gzip_proxied any; # 对代理请求也启用压缩
# 其他配置(如反向代理、负载均衡等)...
}
静态资源防盗链配置
server {
listen 80;
server_name example.com;
location /static/ {
root /data/;
expires 1d;
# 防盗链核心配置:仅允许指定域名引用资源
valid_referers none blocked example.com *.example.com; # 允许的引用域名(none 表示直接访问,blocked 表示无 referer 的请求)
if ($invalid_referer) {
return 403; # 非法引用时返回 403 禁止访问
# 可选:返回自定义图片(如防盗链提示图),需将 return 403 替换为:
# rewrite ^/ /static/img/anti-hotlink.png last;
}
}
}
限流配置
Nginx 通过ngx_http_limit_req_module和ngx_http_limit_conn_module模块实现限流,分别对应请求数限流和连接数限流。
求数限流(漏桶算法)
场景:限制单个IP每秒最多发起10个请求,超过部分返回503错误。
http {
# 定义限流池:名为one,容量10,每秒放10个请求(rate=10r/s)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
listen 80;
server_name example.com;
location / {
# 应用限流池one,允许突发请求数为5(超过容量时排队)
limit_req zone=one burst=5 nodelay;
# 限流后返回的错误页面(可选)
limit_req_status 503;
proxy_pass http://192.168.1.100:8080;
}
}
}
连接数限流
场景:限制单个IP同时最多建立20个连接,每个连接最多发起10个请求。
http {
# 定义连接数限流池:名为conn,容量20
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
# ... 其他配置 ...
location / {
limit_conn conn 20; # 单个IP最大连接数
limit_conn_per_ip 20; # 同limit_conn,部分版本支持
limit_req zone=one burst=5 nodelay; # 结合请求数限流
proxy_pass http://192.168.1.100:8080;
}
}
}
SSL 配置
server {
listen 443 ssl http2; # 启用HTTPS和HTTP/2
server_name example.com;
# SSL证书路径
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本
ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # 安全加密套件
ssl_session_cache shared:SSL:10m; # SSL会话缓存
ssl_session_timeout 1d; # 会话超时时间
ssl_stapling on; # 启用OCSP stapling(减少证书验证时间)
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS解析器
# 强制HTTP跳转HTTPS(可选,单独配置一个80端口的server)
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 永久重定向
}
# 反向代理配置(同第二部分)
location / {
proxy_pass http://192.168.1.100:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
负载均衡配置
定义负载均衡池
在nginx.conf的http块中定义后端服务器集群
http {
# 定义负载均衡池,名为backend
upstream backend {
# 后端服务器1,权重为2(权重越高,分配到的请求越多)
server 192.168.1.100:8080 weight=2;
# 后端服务器2,权重为1,max_fails=3表示3次连接失败标记为不可用
server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=30s;
# 后端服务器3,backup表示仅当其他节点不可用时才启用
server 192.168.1.102:8080 backup;
}
server {
listen 80;
server_name example.com;
location / {
# 转发请求至负载均衡池
proxy_pass http://backend;
# 反向代理通用配置(同第二部分)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
常用负载均衡算法
- 轮询(默认):按顺序分发请求,适合后端服务器性能一致的场景;
- 加权轮询(weight):按权重比例分发,权重越高分配越多请求;
- IP哈希(ip_hash):根据客户端IP哈希值固定分配至某台服务器,可实现会话保持;
- 最少连接(least_conn):将请求分发至当前连接数最少的服务器,适合后端服务器性能差异较大的场景