简介
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服务器。