一、什么是 Nginx?
Nginx 是一个高性能、高并发的 Web 服务器和反向代理服务器,同时也可以用作负载均衡器、邮件代理服务器等。
- 属于开源软件,使用 C 语言开发。
- 设计上注重高并发连接处理能力,适用于静态资源服务和反向代理。
二、为什么用 Nginx?
| 理由 | 说明 |
|---|---|
| 高性能 | 能处理上万并发连接,占用资源少(事件驱动模型) |
| 反向代理 | 支持转发请求到后端服务器,隐藏后端 IP,提升安全性 |
| 负载均衡 | 将流量分配给多台服务器 |
| 静态资源处理快 | 处理 HTML、JS、CSS、图片等静态文件性能极高 |
| 模块丰富 | 可扩展支持缓存、限流、安全控制等功能 |
| 跨平台支持 | 可在 Linux、Windows、Mac 上运行 |
三、怎么用 Nginx?
1. 安装 Nginx
Linux(以 Ubuntu 为例):
sudo apt update sudo apt install nginxWindows: 下载官方预编译版本
2. 常见用法
启动与停止
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
配置文件路径
默认配置文件位于 /etc/nginx/nginx.conf
配置反向代理示例
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080; # 把请求转发到 SpringBoot 等后端服务
}
}
配置静态资源服务
server {
listen 80;
server_name static.example.com;
location / {
root /var/www/html; # 指定静态资源路径
index index.html;
}
}
配置负载均衡
upstream myapp {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
3. 配置检查与重载
sudo nginx -t # 检查配置文件是否有误
sudo nginx -s reload # 平滑重载配置
问题总结
Q1:什么是事件驱动模型?
事件驱动模型是一种程序设计方式,它通过监听事件(如请求到来、数据读取完成),并在事件发生时触发相应的“处理函数”,而不是阻塞等待结果。
| 阻塞模型(传统模式) | 事件驱动模型 |
|---|---|
| 打电话一直等对方接听,不接就一直占线 | 留言让对方回电,有电话来时再处理 |
事件驱动模型的流程:
- 程序启动后,进入事件循环。
- 它会监听一系列事件(如网络请求、文件读写等)。
- 一旦某个事件发生,就立即触发对应的回调函数来处理该事件。
- 执行完后继续监听下一个事件。
对比其他模型
| 模型 | 特点 |
|---|---|
| 多线程模型 | 每个连接一个线程,资源消耗大 |
| 事件驱动模型 | 单线程处理所有事件,性能优越 |
| 协程模型(如 Go) | 模拟成轻量线程,也基于事件驱动底层 |
Q2:什么是正向代理?
Q3:什么是反向代理?
Q4:前端发送的请求,是如何请求到后端服务的?
有以下两个地址:
前端请求地址:http://localhost/api/employee/login
后端接口地址:http:///ocalhost:8080/admin/employee/login
发现两个地址并不一致,那是如何请求到后端服务的呢?
上面我们了解到Nginx的反向代理,那么实践一下:
server{
listen 80;
server_name localhost;
location /api/{
proxy_pass http://localhost:8080/admin/; #反向代理
}
}
proxy_pass 是 Nginx 中用于设置代理目标地址的核心指令,支持配置为主机名、IP 地址加端口号等多种形式。
那么上面代码的含义是:
访问:http://localhost/api/user/list
实际代理请求为:http://localhost:8080/admin/user/list
Q5:什么是负载均衡?
在服务采用集群部署时,为了合理分配请求压力,Nginx 通常会配合负载均衡功能,将请求转发至多台后端服务器。
这么来看,负载均衡其实是建立在反向代理的基础之上的,它的作用就是根据设定的规则,将请求“有策略地”分发给后端服务。
1. Nginx 负载均衡配置方式
如下为 Nginx 配置示例:
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
server{
listen 80;
server_name localhost;
location /api/{
proxy_pass http://webservers/admin;#负载均衡
}
}
配置说明:
upstream:用于定义一个后端服务器组,可自定义名称(例如这里的webservers)。- 当访问
http://localhost/api/...时,请求将通过反向代理location /api/转发至http://webservers/admin,并由配置的后端服务器按策略处理。 - 默认的分发策略为轮询。
注意:
upstream名称需在配置中保持一致。
2. 负载均衡策略说明
| 策略名称 | 描述 |
|---|---|
| 轮询 | 默认方式,请求按顺序依次分发 |
| weight | 权重方式,权重越高,被分配请求越多(默认权重为 1) |
| ip_hash | 根据客户端 IP 分配,适用于保持会话一致的场景 |
| least_conn | 根据后端当前连接数,优先分配给连接数少的服务器 |
| url_hash | 根据请求的 URL 分配,确保同一 URL 落到同一服务器 |
| fair | 根据后端响应时间分配,请求优先发送到响应更快的服务器 |
3. 不同策略配置示例
3.1 轮询(默认)
upstream webservers {
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
3.2 权重(weight)
upstream webservers {
server 192.168.100.128:8080 weight=90;
server 192.168.100.129:8080 weight=10;
}
3.3 IP Hash
IP Hash 根据客户端IP通过哈希函数生成一个数值,然后将该数值对后端服务器数量取模,决定分发到哪台服务器。这样可以实现同一 IP 一致性访问,保持会话状态。
例如:
- 客户端 IP 哈希值为 12,后端有 3 台服务器
- 计算结果:12 % 3 = 0 → 分发到第一台服务器
upstream webservers {
ip_hash;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
3.4 最少连接(least_conn)
upstream webservers {
least_conn;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
3.5 URL Hash
URL Hash 使用请求的 URI 计算哈希值,从而将相同的 URL 分发到同一台服务器,有利于缓存和会话保持。
upstream webservers {
hash $request_uri;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
3.6 Fair(响应时间优先)
upstream webservers {
server 192.168.100.128:8080;
server 192.168.100.129:8080;
fair;
}
注意:
fair策略并不是 Nginx 默认内置的模块,使用前需要安装第三方模块ngx_http_upstream_fair_module。
欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1701220998@qq.com