Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛用于负载均衡、限流和动静分离等场景。以下是这些功能的具体实现和配置方法。
1. 负载均衡
Nginx 可以通过反向代理实现负载均衡,将客户端请求分发到多个后端服务器上,以提高系统的可用性和性能。
配置示例:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
负载均衡策略:
- 轮询(默认):按顺序将请求分发到每个服务器。
- 权重(weight):根据服务器权重进行分发。
- IP 哈希(ip_hash):根据客户端 IP 地址分发请求,同一个 IP 的请求总是分配到同一个后端服务器。
- 最少连接(least_conn):将请求分发到当前活动连接最少的服务器。
示例:
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com;
}
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
2. 限流
Nginx 可以通过限流模块(ngx_http_limit_req_module)来限制客户端请求的速率,从而保护服务器免受过载攻击。
配置示例:
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
listen 80;
location / {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
参数说明:
- limit_req_zone:定义限流区域,其中 $binary_remote_addr 是客户端 IP 地址,mylimit 是区域名称,10m 是共享内存大小,rate=10r/s 表示每秒最多处理 10 个请求。
- limit_req:应用限流区域,burst=20 允许的突发请求数, nodelay 表示超过限速的请求立即返回错误而不是排队。
3. 动静分离
动静分离是指将动态请求和静态请求分开处理,以提高网站的性能。静态资源(如图片、CSS、JS 文件)可以直接由 Nginx 处理,动态请求(如 PHP、Python、Java 等)则代理到后端应用服务器。
配置示例:
server {
listen 80;
location / {
proxy_pass http://backend;
}
location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
root /var/www/static;
expires 30d;
}
}
参数说明:
- location /:匹配所有请求,并将其代理到后端服务器。
- *location ~ .(jpg|jpeg|png|gif|css|js|ico|html)$**:匹配静态资源文件,并直接由 Nginx 处理。root 指定静态资源的根目录,expires 设置浏览器缓存过期时间。
总结
Nginx 作为一个高性能的反向代理服务器,能够通过负载均衡、限流和动静分离等功能,显著提高网站的性能和可靠性。其配置灵活且高效,适用于各种规模的 web 应用。
- 负载均衡:通过反向代理和多种负载均衡策略,将请求分发到多个后端服务器。
- 限流:通过限流模块限制客户端请求速率,保护服务器免受过载攻击。
- 动静分离:将静态资源和动态请求分开处理,提高网站性能。
掌握这些配置和原理,可以有效优化 Nginx 的使用,提升 web 应用的整体表现。