Nginx

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)

简介

Nginx是一款高性能的HTTP和反向代理Web服务器,它以其高并发处理能力、低资源消耗和模块化设计著称,常用于Web服务器、反向代理、负载均衡和动静分离等场景。

为什么需要Nginx

公司早期项目部署在一台服务器上,所有情况全部打这个台服务器,而单台服务器的处理能力有限,当后续访问量变大,单台服务器CPU就处理不过来了
这时候就需要将java项目部署到多个服务器上,让多台服务器来分担压力,这时候前端怎么访问不同服务器上的同一个项目呢

这时候就需要Nginx中间件了

让Nginx作为总服务器帮我们自动的代理到其他服务器

Nginx的特点

反向代理:隐藏后端服务器,接收客户端请求并转发给后端服务器,再将响应返回给客户端。

负载均衡:将请求分发到多个后端服务器,提升系统性能和可靠性。

动静分离:将静态资源(如图片、CSS、JS)和动态内容(如PHP、Java)分开处理,提升性能。

反向代理

反向代理通过Nginx接收客户端请求并转发给后端服务器,再将响应返回给客户端。

实现

这里 监听80,我们服务ip:localhost
我们访问80端口会自动被nginx监听并拦截

proxy_pass:指定后端服务器地址。
proxy_set_header:设置请求头,确保后端服务器获取正确的客户端信息。
server:实际处理的后端服务器ip:port

server {
    listen 80;
    server_name localhost;

    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;
    }
}

upstream backend_server {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

这里直接访问localhost:80
在这里插入图片描述

负载均衡

负载均衡通过Nginx将请求分发到多个后端服务器,提升系统性能和可靠性。
我们每台服务器的处理能力是不一样的,所有通过Nginx来均衡每台服务器的访问量

实现

Nginx默认是轮询方式,其他的还有加权负载均衡,iphash

轮询(默认策略)

特点:依次将请求分发到每台服务器。

upstream backend_servers {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}
加权

特点:根据权重分配请求,权重越高,分配的请求越多。

适用场景:服务器性能不一致时,为性能更强的服务器分配更多请求。

upstream backend_servers {
    server 192.168.1.101:8080 weight=3;  # 权重为3
    server 192.168.1.102:8080 weight=2;  # 权重为2
    server 192.168.1.103:8080 weight=1;  # 权重为1
}
IP哈希(IP Hash)

特点:根据客户端IP地址分配请求,确保同一客户端始终访问同一台服务器。

适用场景:需要会话保持的场景(如Session)。

upstream backend_servers {
    ip_hash;  # 启用IP哈希策略
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

总结

负载均衡的核心:通过 upstream 定义后端服务器组,使用 proxy_pass 转发请求。

常见策略:轮询、加权轮询、IP哈希、最少连接。

高级功能:健康检查、备份服务器。

适用场景:高并发、高可用性要求的系统。

动静分离

在传统Java Web项目中(如Spring Boot),静态文件(HTML/CSS/JS)通常会被打包到Jar/War文件中,由Tomcat等Servlet容器处理

当用户请求静态文件时,请求会经过Tomcat(Spring Boot内置的Servlet容器),虽然Tomcat能处理静态文件,但性能不如Nginx高效,尤其在高并发场景下。

实现

通过Nginx直接处理静态资源,动态请求转发给后端(如Spring Boot),实现方式如下:

资源类型 处理方式 示例路径
静态资源 由Nginx直接读取本地文件 /css/style.css
动态请求 转发到Spring Boot服务器 /api/user

场景假设
静态资源目录:/data/www/static(存放CSS、JS、图片)

动态请求地址:Spring Boot运行在 http://localhost:8080

配置
server {
    listen 80;
    server_name example.com;

    # 静态资源处理(直接由Nginx返回)
    location /static/ {
        alias /data/www/static/;  # 路径映射
        expires 7d;               # 设置缓存过期时间
        access_log off;           # 关闭日志(可选)
    }

    # 动态请求转发到Spring Boot
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

location /static/
匹配所有以 /static/ 开头的请求(如 /static/css/style.css)。

alias /data/www/static/:将请求路径映射到服务器的物理路径。

示例:请求 /static/css/style.css 会对应到服务器上的 /data/www/static/css/style.css。

expires 7d

设置浏览器缓存静态资源的时间(减少重复请求)。

动态请求的 proxy_pass

所有非 /static/ 的请求(如 /api/user)会被转发到Spring Boot服务器。