【JAVA开发】------ Nginx 核心用法与配置实战
1. Nginx 简介
Nginx(发音同 engine x)是一款高性能、轻量级的 HTTP 服务器与反向代理服务器,同时支持邮件代理、负载均衡、静态资源托管等核心功能。其核心优势在于极高的并发处理能力与极低的系统资源占用,是当前互联网领域最主流的服务器软件之一,广泛应用于网站部署、API 接口代理、前端项目发布等场景。
Nginx 核心价值:
-
提升访问速度:通过缓存静态资源、反向代理减少后端请求压力
-
实现负载均衡:分发海量请求至后端集群,避免单点故障
-
保障后端安全:隐藏真实后端地址,拦截恶意请求,充当安全屏障
1.1 反向代理
反向代理是 Nginx 最常用功能,客户端请求先发送至 Nginx,再由 Nginx 转发至后端服务,实现请求分发与后端隐藏。以下为前后端分离场景的典型配置:
nginx
server {
listen 80; # 监听80端口(HTTP默认端口)
server_name localhost; # 绑定域名/IP,可替换为实际域名(如www.example.com)
# 反向代理管理端API请求,转发至后端管理服务
location /api/admin/ {
proxy_pass http://localhost:8080/admin/; # 后端服务地址
proxy_set_header Host $host; # 传递客户端请求域名至后端
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
# 反向代理用户端API请求,转发至后端用户服务集群
location /api/user/ {
proxy_pass http://webservers/user/; # 关联负载均衡集群
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 多层代理透传IP
}
}
1.2 负载均衡
负载均衡可将高并发请求按预设策略均匀分发至后端服务集群,提升系统吞吐量与可用性,避免单台服务器过载宕机。核心是通过 upstream 模块定义后端集群,再通过 proxy_pass 关联转发。
nginx
# 定义后端服务集群(集群名称webservers,可自定义)
upstream webservers{
server 127.0.0.1:8080 weight=90; # 服务器1,权重90(承担90%请求)
server 127.0.0.1:8088 weight=10; # 服务器2,权重10(承担10%请求)
server 127.0.0.1:8089 backup; # 备份服务器,主服务全部故障时启用
}
server {
listen 80;
server_name localhost;
# 所有/api请求转发至集群,实现负载均衡
location /api/ {
proxy_pass http://webservers/;
proxy_connect_timeout 30s; # 后端连接超时时间
proxy_read_timeout 30s; # 后端响应超时时间
}
}
1.3 负载均衡策略
Nginx 提供多种负载均衡策略,可根据业务场景(如会话保持、响应速度优先)灵活选择,以下为常用策略及配置示例:
| 策略名称 | 核心说明 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按服务器顺序依次分发请求,各服务器权重均等 | 后端服务器配置一致、无会话关联需求 |
| weight(权重) | 权重越高,分配到的请求越多,默认权重为1 | 后端服务器配置差异大(如CPU/内存不同) |
| ip_hash | 根据客户端IP哈希分配,固定客户端访问同一后端服务 | 需保持会话一致性(如未做分布式会话的登录场景) |
| least_conn(最少连接) | 优先将请求分配给当前连接数最少的后端服务 | 请求处理时间不均、连接数波动大的场景 |
| url_hash | 根据请求URL哈希分配,相同URL固定转发至同一服务 | 静态资源缓存、接口结果缓存场景 |
| fair(响应时间) | 按后端服务响应时间分配,响应快的优先获得请求 | 对响应速度敏感的业务(需额外安装模块) |
各策略配置示例
轮询策略(默认,无需额外配置关键字):
nginx
upstream webservers{
server 192.168.100.128:8080; # 后端服务器1
server 192.168.100.129:8080; # 后端服务器2
}
weight 权重策略:
nginx
upstream webservers{
server 192.168.100.128:8080 weight=90; # 高配置服务器,承担主要请求
server 192.168.100.129:8080 weight=10; # 低配置服务器,承担少量请求
}
ip_hash 会话保持策略:
nginx
upstream webservers{
ip_hash; # 关键字启用ip_hash策略
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
least_conn 最少连接策略:
nginx
upstream webservers{
least_conn; # 关键字启用最少连接策略
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
url_hash 缓存优化策略:
nginx
upstream webservers{
hash $request_uri; # 按请求URL哈希($request_uri为URL变量)
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
fair 响应时间策略 (需安装 ngx_http_upstream_fair_module 模块):
nginx
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
fair; # 关键字启用响应时间策略
}
1.4 配置文件解析
Nginx 核心配置文件为 nginx.conf,默认路径为 /etc/nginx/nginx.conf(Linux 系统)。可通过 nginx -t 命令快速检查配置文件语法正确性及路径,避免配置错误导致服务异常。
配置文件结构
txt
main(全局块) # 影响Nginx整体运行的配置
├─ events(连接块) # 配置网络连接相关参数
└─ http(HTTP协议块) # 配置HTTP协议相关全局参数
├─ upstream(可选,负载均衡块) # 定义后端服务集群
└─ server(虚拟主机块) # 配置单个虚拟主机(域名/端口)
└─ location(URL路径匹配块) # 按URL路径匹配请求并处理
完整配置示例(生产环境适配)
nginx
# ===================== 1. main(全局块) =====================
# 运行用户(Ubuntu/Debian默认www-data,CentOS默认nginx)
user www-data;
# 工作进程数:auto自动匹配CPU核心数(性能最优,推荐生产环境使用)
worker_processes auto;
# 错误日志:路径+级别(生产环境用warn/error,避免debug日志过大占磁盘)
error_log /var/log/nginx/error.log warn;
# PID文件路径(记录Nginx主进程ID,用于进程管理)
pid /var/run/nginx.pid;
# 工作进程最大打开文件数(突破系统默认限制,提升并发能力)
worker_rlimit_nofile 65535;
# ===================== 2. events(连接块) =====================
events {
# 每个工作进程最大并发连接数(结合系统ulimit配置调整)
worker_connections 10240;
# Linux下高性能IO模型(epoll为最优选择,必配)
use epoll;
# 允许一个工作进程同时接受多个新连接,提升连接效率
multi_accept on;
}
# ===================== 3. http(HTTP协议块) =====================
http {
# 引入MIME类型映射表(识别文件后缀对应的Content-Type,避免静态资源解析异常)
include /etc/nginx/mime.types;
# 未知后缀文件默认以二进制流传输(防止文件解析错误)
default_type application/octet-stream;
# 自定义访问日志格式(main为格式名称,可复用)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志路径,关联main格式(生产环境可根据需求关闭非核心日志)
access_log /var/log/nginx/access.log main;
# 性能优化核心参数(生产环境必配)
sendfile on; # 开启高效文件传输模式,减少磁盘IO
tcp_nopush on; # 合并小数据包发送,提升网络传输效率
keepalive_timeout 65; # 长连接超时时间,客户端无活动则断开
charset utf-8; # 统一字符编码,避免中文乱码
# ===================== 4. upstream(负载均衡块) =====================
upstream backend_servers {
server 192.168.1.100:8080 weight=1; # 后端服务1,权重1
server 192.168.1.101:8080 weight=2; # 后端服务2,权重2
server 192.168.1.102:8080 backup; # 备份服务,主服务故障时启用
server 192.168.1.103:8080 down; # 标记为不可用,临时下线维护
}
# ===================== 5. server(虚拟主机块) =====================
# 主虚拟主机(绑定正式域名)
server {
listen 80; # 监听HTTP 80端口,HTTPS需改为listen 443 ssl并配置证书
server_name www.example.com example.com; # 绑定多个域名,用空格分隔
root /usr/share/nginx/html; # 静态文件根目录(前端项目部署路径)
index index.html index.htm index.php; # 默认首页优先级
# ===================== 6. location(URL路径匹配块) =====================
# 场景1:处理根路径请求,适配静态首页
location / {
# 核心规则:尝试访问文件→尝试访问目录→返回404(静态资源必备)
try_files $uri $uri/ =404;
}
# 场景2:API请求反向代理至后端集群
location /api/ {
proxy_pass http://backend_servers/; # 转发至负载均衡集群
# 透传客户端信息,便于后端日志排查
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时配置,避免后端阻塞导致Nginx连接耗尽
proxy_connect_timeout 30s;
proxy_read_timeout 30s;
}
# 场景3:静态资源缓存优化(JS/CSS/图片等)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 7d; # 缓存有效期7天,减少重复请求
add_header Cache-Control "public, max-age=604800"; # 缓存响应头
access_log off; # 关闭静态资源访问日志,减少IO开销
}
# 场景4:URL重定向(301永久重定向,适配旧路径迁移)
location /old {
rewrite ^/old/(.*)$ /new/$1 permanent; # $1捕获旧路径参数,传递至新路径
}
# 场景5:禁止访问隐藏文件(如.git/.env,防止敏感信息泄露)
location ~ /\. {
deny all; # 拒绝所有访问
access_log off;
log_not_found off; # 不记录404日志
}
}
# 测试环境虚拟主机(独立配置,不影响正式环境)
server {
listen 80;
server_name test.example.com;
root /usr/share/nginx/test; # 测试项目根目录
index index.html;
location / {
try_files $uri $uri/ =404;
expires 1d; # 测试环境缓存1天,兼顾效率与更新
}
}
}
核心配置块说明
| 配置块 | 核心作用 | 关键参数/关键词 |
|---|---|---|
| main | 全局基础配置,影响Nginx整体运行 | worker_processes、error_log、worker_rlimit_nofile |
| events | 网络连接优化,决定并发能力上限 | worker_connections、epoll、multi_accept |
| http | HTTP协议全局配置,统一管控所有虚拟主机 | sendfile、keepalive_timeout、log_format、charset |
| upstream | 定义后端服务集群,配置负载均衡规则 | weight、backup、down、ip_hash、least_conn |
| server | 配置虚拟主机,实现多域名/多端口独立部署 | listen、server_name、root、index |
| location | 按URL路径匹配请求,精准处理不同场景 | proxy_pass、try_files、expires、deny、rewrite |
1.5 Nginx 常用命令
以下为Linux系统下Nginx核心命令,所有命令需在终端执行,部分命令需root权限(前缀加sudo):
bash
nginx # 启动Nginx服务
nginx -c filename # 指定配置文件启动(适用于自定义路径配置文件)
nginx -V # 查看Nginx版本、编译参数及加载模块(大写V)
nginx -t # 检查配置文件语法正确性,同时显示配置文件路径
nginx -s quit # 优雅停止Nginx(处理完所有请求后关闭,推荐生产环境)
nginx -s stop # 快速停止Nginx(强制关闭进程,可能丢失请求)
nginx -s reload # 重新加载配置文件(无需重启服务,平滑生效)
nginx -s reopen # 重新打开日志文件(适用于日志切割场景)
ps aux | grep nginx # 查看Nginx进程状态(验证是否启动成功)
小结
Nginx 的核心能力在于反向代理与负载均衡,通过合理配置可大幅提升系统并发能力与可用性。生产环境中需重点关注:配置文件语法正确性(nginx -t 校验)、性能参数优化(worker_processes、epoll模型)、静态资源缓存策略,同时根据业务场景选择合适的负载均衡策略,兼顾性能与业务需求。掌握上述用法,可覆盖绝大多数Java后端项目的Nginx部署与运维场景。