nginx 概念作用,优点。

  • 当网站服务器用:可以直接存放和发送网页、图片、CSS 文件等静态内容给用户 。

  • 做反向代理:帮后端的程序服务器挡在前面,接收用户请求后再转发进去,保护后端安全 。

  • 做负载均衡:当访问人太多时,把流量自动分给多台服务器,防止单台机器累垮 。

  • 提供邮件服务:除了管网页,也能处理 IMAP、POP3、SMTP 这些邮件相关的协议

  • 资源占用少:内存吃得很少,启动速度特别快,对服务器配置要求不高 。

  • 抗并发能力强:能同时处理几万个连接,高流量下也不容易崩,运行很稳定 。

  • 开源免费:代码公开,大家可以免费使用,还能根据需求自己扩展功能

nginx 提供负载均衡的策略有2种,内置策略,和扩展策略,,内置策略为轮询,加强轮询,Ip hash .扩展策略就有很多了,五花八门,

轮询的话就是以此循环的查询,就是轮询,3个服务器配置相同,客户端轮流查询它们3个,

下图就是加强轮询,

服务器3配置高,权重就高,可灵活调节。加强轮询

ip hash 对客户端请求的ip ,操作,然后根据,hash 结果,将同一个客户端ip 的请求,分发给同一个服务器,进行处理。可以解决session 不共享的问题。

启动很多个服务器就有很多个Tomcat ,session ,就有N个,就不能做session 共享,更多的使用redis 实现session 共享/。

拓展知识点。

Session 核心概念

  • 定义‌:服务器为每个访客创建独立存储空间(键值对),记录登录态、购物车等临时信息,生命周期通常为 20 分钟至主动注销 。

  • 原理‌:服务端生成唯一 Session ID,通过 Cookie(首选)或 URL 重写传给客户端;后续请求携带该 ID,服务端据此检索对应数据 。

  • 特点‌:数据存服务端(安全、容量大),依赖客户端存 ID;相比 Cookie 更安全,但占用服务器资源 。‌‌

Session 共享的必要性与方案

单机无需共享;但在负载均衡集群中,若请求被分发到不同服务器,本地内存 Session 会导致“重复登录”或数据丢失,需实现共享 。常见方案如下:‌‌

  1. 集中式存储(推荐)‌:将 Session 数据统一存于 Redis/Memcached 等分布式缓存,所有应用节点读写同一中心。优势是高可用、易扩展,主流框架如 Spring Session 即基于此实现 。

  2. Session 复制‌:集群节点间同步复制 Session 对象。缺点是大集群下网络与内存开销巨大,仅适用于小规模集群 。

  3. Session 绑定(粘性会话)‌:负载均衡器通过 IP Hash 等算法将同一用户固定转发至某台服务器。缺点是无高可用性,单点故障会导致会话丢失 。

  4. Cookie 存储‌:将加密后的 Session 数据直接存在客户端 Cookie 中。缺点受容量限制(通常<4KB)、安全性低且增加带宽消耗,一般不推荐存敏感数据

动静分离。

在开发中有些请求需要后台处理,有些不需要后台处理。不需要后台处理的文件称为静态文件,让动态网页根据一定的规则把不变的资源和经常变的资源区分开来。动静资源做好拆分,就可以将其做缓存操作,提高响应速度。

nginx 的安装,

https://nginx.org/这个是nginx 的官网,一般使用稳定版本,不推荐最新的。

windows 安装非常方便,

下载之后就解压

conf 配置文件,还有些文档配置,日志,

/usr/local/nginx 默认安装路径,///

sbin是执行文件,启动nginx就需要进入文件了。

配置 worker 连接数,location 不同的的服务器前者是访问前端,后者是访问后端。

结合上面的图片,

nginx -v

图 1:Nginx 完整配置结构框架

nginx

# 全局事件模块,控制并发连接
events {
    worker_connections 1024; # 单个工作进程最大同时连接1024
}

# http核心模块,所有网站、代理、负载均衡都写在这里
http {
    # 负载均衡池定义块(对应图2红框upstream)
    upstream xx{
        // 后端服务节点列表
    }

    # 第一个虚拟主机:监听80端口HTTP网站
    server {
        listen       80;                # 监听本机80端口
        server_name  localhost;         # 匹配访问域名localhost

        # 匹配所有路径:http://localhost/xxx
        location / {
            // 通用处理逻辑
        }

        # 精准匹配 /admin 路径:http://localhost/admin
        location /admin {
            // 后台单独处理逻辑
        }
    }

    # 第二个虚拟主机:监听443端口HTTPS加密网站
    server {
        listen       443;
    }
}

核心结构划分

  1. events:底层网络并发设置,控制能同时接多少用户访问

  2. http:总入口,所有网站、反向代理、负载均衡、缓存、压缩都写在这里

  3. upstream:后端服务集群池(图 2 重点),专门做负载均衡

  4. server:虚拟主机,一个server对应一个网站(80 是 http,443 是 https)

  5. location:路径匹配器,同一网站下不同 URL 走不同处理规则

图 2:负载均衡 + 反向代理完整示例

1. 上方红框 upstream 负载均衡池

nginx

upstream kuangstudy {
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=1;
}
  • 作用:定义两台后端业务服务(比如两个 SpringBoot 项目,分别跑在 8080、8081)

  • weight=1:权重,两台服务器平分流量;改成weight=2就会多分配一倍请求

  • Nginx 会自动把用户请求分发到这两台后端,实现负载均衡,单台宕机自动切换另一台

2. 下方红框 proxy_pass 反向代理核心语句

nginx

location / {
    proxy_pass http://kuangstudy;
}
  • proxy_pass:反向代理指令,意思是把当前收到的所有请求转发给 upstream 定义的集群 kuangstudy

  • 访问流程:用户访问 http://localhost → Nginx 接收 → 转发给 8080/8081 后端服务 → 后端返回数据给 Nginx → Nginx 返回给浏览器

  • 通俗理解:Nginx 做中间人,隐藏后端真实服务地址,同时分发流量

两张图结合完整流程

用户访问 localhost → 匹配 80 端口 server 块 → 匹配/路径 → proxy_pass 转发到 kuangstudy 集群 → upstream 自动分发到 8080/8081 后端

二、Nginx 其余常用功能实现方式

1. 反向代理(单台后端,不用 upstream)

只转发给一台服务,无需定义集群:

nginx

location / {
    proxy_pass http://127.0.0.1:8080; # 直接转发单后端
    proxy_set_header Host $host;       # 透传原始域名给后端
    proxy_set_header X-Real-IP $remote_addr; # 把用户真实IP传给后端
}

2. HTTPS 加密(443 端口 SSL 证书)

对应图 1 下方 listen 443 的 server 块,实现全站 https:

nginx

server {
    listen 443 ssl;
    server_name www.kuangstudy.com;
    ssl_certificate cert/xxx.pem;   # 证书公钥
    ssl_certificate_key cert/xxx.key; # 证书私钥
    # 强制http跳转https
    return 301 https://$host$request_uri;
}

3. 静态资源服务器(图片 / 前端页面,不转发后端)

不用 proxy_pass,直接读取本地文件:

nginx

location /static/ {
    root /data/www; # 本地文件根目录
    expires 7d;     # 浏览器缓存7天,加速访问
}

4. 路径分离代理(图 1 的 location /admin)

前台、后台分开转发:

nginx

# 前台页面转发8080
location / {
    proxy_pass http://127.0.0.1:8080;
}
# /admin后台单独转发8081管理服务
location /admin {
    proxy_pass http://127.0.0.1:8081;
}

5. 负载均衡高级策略(upstream 扩展)

  • 轮询(默认):weight 权重,图 2 示例

  • ip_hash:同一用户始终分配同一台后端(解决 session 丢失)

nginx

upstream kuangstudy {
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081 backup; # backup备用机,主机器挂了才启用
}

6. Gzip 压缩,减小传输体积,提速

写在 http {} 全局内:

nginx

gzip on;
gzip_types text/css application/javascript image/jpeg;
gzip_min_length 1k; # 大于1kb才压缩

7. 访问限制、防盗链

限制单 IP 最大访问频率(防爬虫)

nginx

limit_req_zone $binary_remote_addr zone=rate:10m rate=10r/s;
location / {
    limit_req zone=rate burst=20;
}

防盗链(防止别人盗图)

nginx

location ~* \.(jpg|png|gif)$ {
    valid_referers none blocked www.kuangstudy.com;
    if ($invalid_referer) { return 403; }
}

8. 跨域配置(前端分离项目常用)

nginx

location /api {
    proxy_pass http://后端服务;
    add_header Access-Control-Allow-Origin *;
}

9. 动静分离(生产最常用)

静态资源(图片 /js/css)Nginx 直接返回,动态接口转发后端,减轻后端压力:

nginx

# 静态资源直接本地读取
location ~* \.(html|js|css|png|jpg)$ {
    root /html;
    expires 10d;
}
# 接口转发后端集群
location /api {
    proxy_pass http://kuangstudy;
}

三、简单总结

  1. upstream + proxy_pass 组合 = 负载均衡 + 反向代理(两张图核心)

  2. server 区分不同网站 / 80http、443https

  3. location 精准控制不同 URL 的处理逻辑

  4. Nginx 附加能力:静态资源托管、SSL 加密、缓存、压缩、限流防盗、动静分离、跨域等。