Nginx 配置与集群部署指南
Nginx 概述
在现代 Web 架构中,客户端请求如何被正确分发至后端服务器是一个关键问题。随着系统规模扩大,单台服务器难以支撑所有请求,因此需要引入负载均衡机制。
通过部署 Nginx 作为反向代理,可有效管理多个后端服务节点,并实现请求的智能转发:
服务器A
客户端 → Nginx → 服务器B → 数据库
服务器C
Nginx 最初由俄罗斯开发者 Igor Sysoev 开发,用于应对 Rambler 网站的高并发需求。其主要优势包括:
- 稳定可靠,支持长时间连续运行
- 配置灵活,提供丰富的功能模块
- 资源占用低,具备强大的并发处理能力
环境准备与基础配置
使用 Docker Compose 快速部署 Nginx 服务:
version: '3.1'
services:
nginx-service:
image: nginx:1.9.1
container_name: nginx-container
ports:
- "80:80"
volumes:
- ./config/conf.d:/etc/nginx/conf.d
核心配置文件 nginx.conf 结构如下:
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
反向代理配置实践
正向代理由客户端配置,用于隐藏客户端身份;而反向代理部署在服务端,用于隐藏后端服务器结构。
配置示例:将请求转发至 Tomcat 服务
server {
listen 80;
server_name localhost;
location /app/ {
proxy_pass http://192.168.1.100:8080/;
}
location /api/ {
proxy_pass http://192.168.1.101:8080/api/;
}
}
路径匹配规则优先级:
- 精确匹配 (
=) - 前缀匹配 (
^~) - 正则匹配 (
~,~*) - 普通前缀匹配
- 通用匹配 (
/)
负载均衡策略
Nginx 支持多种负载均衡算法:
轮询模式
upstream backend_pool {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
location / {
proxy_pass http://backend_pool;
}
}
权重分配
upstream weighted_pool {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
}
IP 哈希绑定
upstream sticky_pool {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
动静分离优化
通过分离静态与动态资源处理,提升系统整体性能:
server {
listen 80;
server_name example.com;
# 静态资源处理
location /static/ {
root /var/www;
expires 1d;
add_header Cache-Control public;
}
# 动态请求转发
location /api/ {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
高可用集群架构
为避免单点故障,构建包含主备 Nginx 和负载均衡器的高可用架构:
Docker 构建脚本
FROM nginx:1.13-alpine
RUN apk add --no-cache keepalived haproxy
COPY startup.sh /startup.sh
RUN chmod +x /startup.sh
CMD ["/startup.sh"]
启动脚本
#!/bin/sh
keepalived -D -f /etc/keepalived/keepalived.conf
nginx -g "daemon off;"
服务编排配置
version: '3.1'
services:
nginx-primary:
build: .
networks:
cluster-net:
ipv4_address: 172.20.0.10
cap_add:
- NET_ADMIN
nginx-secondary:
build: .
networks:
cluster-net:
ipv4_address: 172.20.0.11
cap_add:
- NET_ADMIN
load-balancer:
image: haproxy:1.7-alpine
ports:
- "80:80"
networks:
- cluster-net
networks:
cluster-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
Keepalived 主节点配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secret123
}
virtual_ipaddress {
172.20.0.100
}
}
HAProxy 负载配置
frontend http_front
bind *:80
default_backend nginx_cluster
backend nginx_cluster
balance roundrobin
server primary 172.20.0.10:80 check
server secondary 172.20.0.11:80 check
部署完成后,可通过虚拟 IP 地址访问服务。当主节点失效时,备用节点自动接管流量,确保服务持续可用。