1. Nginx 简介
1.1 Nginx是什么
Nginx : nginx [engine x]是HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器,最初由Igor Sysoev编写。
- 特别是在高并发下,应用广泛
- 功能丰富
- 插件繁多
- 配置灵活
- 低消耗
1.2 正向代理和反向代理
正向代理:是代理的用户本机的请求,比如:翻墙、网络加速器等,安装在用户的电脑上。
反向代理:是代理的服务端的请求,比如:Nginx ,安装在服务器上。
1.3 Nginx作用
- 静态服务器:图片服务器、视频服务器 可以抗万级并发
- 动态服务器,可以代理:php\Java\数据库
- 可以实现负载均衡
- 缓存服务器
1.4 Nginx优点
- 占用资源,2万并发,10个线程,只需要占用几百M
- 简单、灵活
- 支持类型的多:http、负载均衡、邮件、tcp
- 配置 实现IP限速、预过滤等
- 高并发支持
1.5 Nginx负载均衡算法
Nginx作为负载均衡服务器,就需要对所有的请求进行分发,那么这个分发策略,有哪些?
轮询
默认
权重
根据权重分配请求 权重大的分配的概率高
IP_hash
根据IP进行分配
最少连接分配
- fair
最小响应时间
2. Nginx应用
2.1 安装Nginx
默认监听 80 端口
Docker 实现 Nginx 的安装:
- 下载镜像
docker pull nginx:latest
- 创建文件夹并准备配置
- 创建文件夹:
mkdir -p /docker/nginx/
- 拷贝配置文件:
vim /docker/nginx/nginx.conf
拷贝如下内容:——来源:windows上下载的 nginx 解压后找到 nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| worker_processes 1;
events { worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server { listen 80; server_name localhost;
location / { root html; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
}
|
创建默认页面
创建目录:mkdir -p /docker/nginx/html/
拷贝页面 index.html 50x.html 到该目录
创建 Nginx 容器
运行:docker run -d --name nginx81 -p 81:80 -v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx/html:/usr/share/nginx/html nginx
访问 Nginx 容器
输入:http://IP地址:81端口/
2.2 基于Nginx实现负载均衡
基于Nginx搭建Tomcat的集群,实现的话,需要提前准备多个Tomcat容器。
比如准备3个Tomcat容器,实现Nginx负载均衡
使用 3个 Tomcat的不同端口实例,模拟 3台实际的服务器实现负载均衡。
- 搭建3台Tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mkdir -p /docker/tomcat/webapp8081 mkdir -p /docker/tomcat/webapp8082 mkdir -p /docker/tomcat/webapp8083
docker run -d --name tomcat8081 -p 8081:8080 -v /docker/tomcat/webapp8081:/usr/local/tomcat/webapps/ tomcat docker run -d --name tomcat8082 -p 8082:8080 -v /docker/tomcat/webapp8082:/usr/local/tomcat/webapps/ tomcat docker run -d --name tomcat8083 -p 8083:8080 -v /docker/tomcat/webapp8083:/usr/local/tomcat/webapps/ tomcat
依次上传3个本地war包到3台Tomcat容器中,对应的webapp8081、webapp8082、webapp8083
依次访问3台Tomcat,确保都可以正常访问
|
- 修改Nginx配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| vim /docker/nginx/nginx.conf
worker_processes 1; events { worker_connections 1024; } user root; upstream lxtomcat { server 172.18.0.6:8080 weight=4; server 172.18.0.7:8080 weight=2; server 172.18.0.9:8080 weight=3; } Tomcat8081 172.18.0.6 Tomcat8082 172.18.0.7 Tomcat8083 172.18.0.9 server_name lxtomcat; location / { proxy_connect_timeout 5; proxy_read_timeout 10; proxy_send_timeout 20; proxy_pass http://lxtomcat; }
docker restart nginx
访问 http://IP地址:81端口/tomcat可访问页
|
3. Nginx 负载均衡基础配置
首先,搭建一个基础的 Nginx 负载均衡器,用于将流量分发到多个后端服务器上。
步骤 1:安装 Nginx
在每台要作为负载均衡器的服务器上,安装 Nginx。可以使用包管理工具进行安装,例如在 Ubuntu 上执行以下命令:
1 2
| sudo apt update sudo apt install nginx
|
步骤 2:配置 Nginx 负载均衡
Nginx 的核心是配置文件 nginx.conf,我们可以在其中定义后端服务器池以及负载均衡策略。以下是一个简单的 Nginx 负载均衡配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| upstream backend { server backend1.example.com weight=5; server backend2.example.com weight=3; server backend3.example.com weight=2; health_check interval=10s fails=3 passes=2; }
server { listen 80; server_name loadbalancer.example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
|
配置详解:
upstream 指令:定义了后端服务器池(backend
),并为各服务器分配了不同的权重,Nginx 根据权重将流量按照比例分发到后端服务器。
健康检查:此配置会定期检查后端服务器是否可用,确保当某个服务器宕机时,不会继续向其发送请求。
proxy_pass:将客户端请求代理到后端服务器池。
步骤 3:启动和测试 Nginx
确保配置无误后,启动或重启 Nginx 服务:
1 2
| sudo nginx -t sudo systemctl restart nginx
|
测试:通过访问 http://loadbalancer.example.com,验证请求是否被均匀分发到后端服务器。
4. 高可用性配置(Keepalived + Nginx)
单独使用 Nginx 进行负载均衡仍然会面临单点故障问题。如果前端的 Nginx 宕机,整个服务将不可用。因此,我们需要通过 Keepalived 实现高可用的 Nginx 集群。
步骤 1:安装 Keepalived
在每台 Nginx 服务器上安装 Keepalived。以 Ubuntu 为例:
1
| sudo apt install keepalived
|
步骤 2:配置 Keepalived
Keepalived 通过虚拟 IP 地址(VIP)实现故障转移。当主服务器宕机时,VIP 自动切换到备用服务器,确保服务的高可用性。
在主 Nginx 服务器上,编辑 Keepalived 的配置文件 /etc/keepalived/keepalived.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.0.100 } track_script { chk_nginx } }
|
在备用 Nginx 服务器上,将 state 设置为 BACKUP,并将 priority 设置为较低的值,例如 90。
步骤 3:监控 Nginx 状态
Keepalived 可以通过监控 Nginx 的运行状态来决定是否切换 VIP。创建一个监控脚本 /etc/keepalived/check_nginx.sh:
1 2 3 4 5
| #!/bin/bash if ! pidof nginx > /dev/null then systemctl stop keepalived fi
|
将此脚本添加为可执行:
1
| sudo chmod +x /etc/keepalived/check_nginx.sh
|
在 Keepalived 的配置文件中添加监控脚本:
1 2 3 4
| vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 }
|
步骤 4:启动 Keepalived
完成配置后,启动或重启 Keepalived 服务:
1
| sudo systemctl restart keepalived
|
测试:关闭主服务器的 Nginx,VIP 应该自动切换到备用服务器,确保服务不中断。
5. Nginx 健康检查和动态扩展
Nginx 可以结合健康检查功能,确保只有状态正常的服务器参与负载均衡。另外,动态扩展是应对突发流量的关键。以下是相关配置和实战方案。
步骤 3.1:配置健康检查(开源版本)
Nginx 开源版本不自带健康检查模块,可以通过第三方模块(如 ngx_http_healthcheck_module)实现健康检查。假设已安装此模块,配置如下:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 使用第三方模块实现健康检查
check interval=5000 rise=2 fall=5 timeout=2000;
}
步骤 3.2:动态扩展后端服务器
结合容器化技术(如 Docker 或 Kubernetes),可以根据流量自动扩展后端服务器。例如,在 Kubernetes 集群中可以使用 Horizontal Pod Autoscaler (HPA) 自动扩展应用服务的副本数。
以下是在 Kubernetes 中配置自动扩展的示例:
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: backend-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: backend minReplicas: 3 maxReplicas: 10 targetCPUUtilizationPercentage: 70
|
通过这种方式,后端服务可以根据负载动态扩展,Nginx 通过配置服务发现机制可以自动识别新的后端服务器。
6. Nginx SSL/TLS 配置
在生产环境中,启用 HTTPS 是必不可少的。以下是启用 SSL/TLS 的配置:
步骤 4.1:生成或获取 SSL 证书
使用 Let’s Encrypt 生成免费的 SSL 证书:
1 2
| sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d yourdomain.com
|
步骤 4.2:配置 Nginx 使用 SSL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| server { listen 443 ssl; server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }
|