一、Nginx简介
Nginx(发音为“engine X”)是一个轻量级、高性能的Web服务器和反向代理服务器。自2004年发布以来,它凭借高并发、低内存消耗的特点,迅速成为全球最受欢迎的服务器软件之一。
据统计,全球超过40%的高流量网站(如GitHub、Netflix、知乎等)都在使用Nginx。它不仅支持HTTP、HTTPS协议,还能处理TCP/UDP流量,是构建现代应用架构的基石工具。
二、Nginx核心概念
1. 正向代理 vs 反向代理
-
正向代理
扮演客户端代理的角色,帮助用户访问外部资源。
应用场景:企业内网的VPN翻墙访问外网,通常正向代理就是我们没有权限或者速率很慢访问某些服务器,通过正向代理服务器代表我们去访问外网,正向代理服务器常常是有能力访问目标服务器。
<PLAINTEXT>
用户 → 正向代理 → 互联网 → 目标网站
-
反向代理
作为服务端代理,隐藏真实服务器信息,处理客户端请求并返回结果。
应用场景:通过Nginx将用户请求转发到后端的Java/Python服务。例如:前后端分离开发时,当服务器有多台时端口号有多个,前端可以通过nginx实现反向代理服务器,反向代理服务器暴露给前端唯一端口号,由代理服务器将不同请求转发给相应服务器。 -
<PLAINTEXT>用户 → 反向代理(Nginx) → 真实服务器集群
2. 负载均衡
当单台服务器无法承受高并发请求时,Nginx通过负载均衡策略(如轮询、权重、IP Hash)将请求分发到多个服务器,提升应用可用性和稳定性。
假如客户端有15个请求,如果这15个请求都交给服务端,服务端的压力就会很大,但是通过nginx反向代理后,将15个请求分别分配给三个服务端,减小并发请求压力,这个过程就叫做负载均衡。
<NGINX>
http {
upstream backend {
server 192.168.1.101:8080 weight=3; # 权重高,处理更多请求
server 192.168.1.102:8080;
}
server {
location / {
proxy_pass http://backend;
}
}
}
以下是Nginx常用的几种负载均衡策略及其适用场景和配置示例:
(1). 轮询(Round Robin)
策略说明:
默认策略,按顺序将请求依次分发到不同的后端服务器,实现简单、平均分配。
配置示例:
<NGINX>
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
适用场景:
- 所有后端服务器性能相近,无需特殊权重。
- 无会话状态(如静态资源、API接口)。
(2). 加权轮询(Weighted Round Robin)
策略说明:
为服务器分配权重,权重高的服务器处理更多请求。权重越大,承担流量比例越高。
配置示例:
<NGINX>
upstream backend {
server backend1.example.com weight=3; # 处理3/4的请求
server backend2.example.com weight=1; # 处理1/4的请求
}
适用场景:
- 服务器性能差异大(如高配机器需承担更多流量)。
- 逐步下线服务器时降低权重。
(3). IP哈希(IP Hash)
策略说明:
根据客户端IP计算哈希值,固定将同一IP的请求分发到同一后端服务器,实现会话保持。
配置示例:
<NGINX>
upstream backend {
ip_hash; # 启用IP哈希策略
server backend1.example.com;
server backend2.example.com;
}
适用场景:
- 需要会话持久化的应用(如用户登录状态)。
- 非集群存储的Session场景(如本地Session未共享)。
缺点:
- 服务器增减时会导致部分会话失效。
- 哈希不均衡时可能造成某台服务器过载。
(4). 最少连接(Least Connections)
策略说明:
优先将请求分配给当前活跃连接数最少的服务器,以优化资源利用率。
配置示例:
<NGINX>
upstream backend {
least_conn; # 启用最少连接策略
server backend1.example.com;
server backend2.example.com;
}
适用场景:
- 后端服务器处理请求的时间差异大(如长连接、大文件下载)。
- 高并发下动态均衡负载。
(5). 响应时间(需Nginx Plus)
策略说明:
(仅限Nginx Plus)根据服务器的平均响应时间动态分配请求,优先选择响应快的节点。
配置示例:
<NGINX>
upstream backend {
least_time header; # 根据响应头计算时间
server backend1.example.com;
server backend2.example.com;
}
适用场景:
- 对响应速度敏感的业务(如实时API)。
- 混合部署不同性能的服务器。
(6). 基于URI的哈希(通用哈希)
策略说明:
通过自定义哈希键(如URI、请求参数)固定请求分发路径。适用于缓存优化或分片场景。
配置示例:
<NGINX>
upstream backend {
hash $request_uri consistent; # 根据URI哈希,consistent为一致性哈希
server backend1.example.com;
server backend2.example.com;
}
适用场景:
- 缓存利用率优化(同一URI请求固定到同一服务器)。
- 分片处理场景(如特定文件类型路由)。
(7). 随机策略(Random)
策略说明:
随机选择一个后端服务器,可配合权重使用。适用于简单分发无特殊要求的场景。
配置示例:
<NGINX>
upstream backend {
random; # 需安装第三方模块(如ngx_http_upstream_random_module)
server backend1.example.com;
server backend2.example.com;
}
总结
策略 | 配置指令 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
轮询 | 默认 | 均衡分配的简单场景 | 无状态、配置简单 | 无法处理性能差异 |
加权轮询 | weight | 性能不均的服务器集群 | 按权重分配流量 | 静态配置,不够动态 |
IP哈希 | ip_hash | 需会话保持的应用 | 保持同一客户端会话 | 服务器增减时影响会话 |
最少连接 | least_conn | 处理时间差异大的长连接场景 | 动态负载均衡 | 可能忽略服务器权重 |
通用哈希 | hash | 缓存优化或分片处理 | 灵活绑定请求特征 | 需要一致性哈希支持 |
实际使用建议:
- 无Session需求的API服务 → 轮询/加权轮询。
- 需要登录状态的Web应用 → IP哈希 + Redis共享Session。
- 大文件下载或长连接 → 最少连接。
- 高可用动态负载 → Nginx Plus响应时间策略。
3. 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析速度。降低单个服务器的压力。
将静态资源(HTML/CSS/图片) 和 动态请求(API接口) 分开处理:
- 静态资源直接由Nginx高效处理(减少后端压力)
- 动态请求转发至应用服务器(如Tomcat、Node.js)
<NGINX>
server {
location /static/ {
root /var/www/html; # 直接返回静态文件
}
location /api/ {
proxy_pass http://backend_server; # 转发到Java服务
}
}
三、Linux系统安装Nginx
1. Ubuntu/CentOS安装步骤
Ubuntu系统
<BASH>
# 更新软件包列表并安装
sudo apt update
sudo apt install nginx -y
# 启动服务并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 访问测试(输出Welcome即成功)
curl http://localhost
CentOS系统
<BASH>
# 添加EPEL仓库并安装
sudo yum install epel-release -y
sudo yum install nginx -y
# 启动服务
sudo systemctl start nginx
sudo firewall-cmd --permanent --add-service=http # 开放防火墙端口
sudo firewall-cmd --reload
2. 验证安装
<BASH>
nginx -v # 查看版本号
systemctl status nginx # 检查运行状态
四、Nginx常用命令
命令 | 说明 |
---|---|
nginx -t | 检查配置文件语法(排查错误必用) |
nginx -s reload | 平滑重启(不中断服务更新配置) |
nginx -s stop | 立即停止服务 |
nginx -s quit | 优雅停止(处理完当前请求) |
systemctl restart nginx | 通过Systemd重启服务(Ubuntu/CentOS) |
使用小贴士:
- 每次修改配置文件后,必须执行
nginx -t
验证语法,避免重启失败! -s reload
可在高并发场景下无感更新配置。
五、Nginx配置文件详解
1. 配置文件结构
主配置文件路径:/etc/nginx/nginx.conf
配置文件按层级划分为多个块:
<NGINX>
# 全局块:配置进程、日志等全局参数
user nginx;
worker_processes auto;该值越大,可以支持的并发处理量越多
# Events块:设置网络连接参数,主要影响nginx服务器和用户网络的连接
events {
worker_connections 1024; # 每个worker的最大连接数
}
# Http块:主体配置,包含多个server块
http {
include /etc/nginx/mime.types;
# Server块:定义虚拟主机(可多个)
server {
listen 80;
server_name localhost;
# Location块:URL路径匹配规则
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
2. 核心配置示例
反向代理设置
<NGINX>
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://localhost:8080; # 将请求转发到本地的Java应用
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
静态资源服务器配置
<NGINX>
server {
listen 80;
server_name static.yourdomain.com;
location / {
root /var/www/static; # 静态文件存放目录
autoindex on; # 开启目录列表(可选)
}
}
六、总结与学习建议
Nginx是现代Web开发的瑞士军刀,掌握它可以轻松应对高并发、负载均衡、安全防护等需求。学习建议:
- 动手实践每个配置案例,观察效果
- 结合Wireshark抓包理解代理过程
- 延展学习方向:SSL证书配置、Lua脚本扩展、性能调优
示例完整项目可参考:GitHub Nginx配置模板
遇到问题? 欢迎在评论区留言交流,共同成长!