【JAVA开发】—— Nginx服务器

【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部署与运维场景。

相关推荐
扶苏-su2 小时前
Java---Properties 类
java·开发语言
cypking2 小时前
四、CRUD操作指南
java
WorldWelcome3 小时前
springboot3整合knife4j,并nginx映射到外网
nginx·springboot3·knife4j·jdk21
2301_780669863 小时前
文件字节流输出、文件复制、关闭流的方法
java
一条咸鱼_SaltyFish3 小时前
远程鉴权中心设计:HTTP 与 gRPC 的技术决策与实践
开发语言·网络·网络协议·程序人生·http·开源软件·个人开发
我即将远走丶或许也能高飞4 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
沐知全栈开发4 小时前
SQL LEN() 函数详解
开发语言
剑锋所指,所向披靡!4 小时前
C++之类模版
java·jvm·c++
钟离墨笺4 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang