结丹期
8. Nginx 如何处理负载均衡?常见的负载均衡策略有哪些?
Nginx
是一个高性能的反向代理服务器,它可以通过 负载均衡 将请求分发给多个后端服务器,以提升性能和容错能力。
Nginx
支持多种负载均衡策略,常见的有以下几种:
轮询:默认策略,依次将请求均匀分配给每个后端服务器。
upstream backend { server backend1.example.com; server backend2.example.com; } server { location / { proxy_pass http://backend; } }
权重:可以为每个后端服务器设置权重,权重越高,接收到的请求越多。
upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=1; }
最少连接:将请求发送给当前处理连接数最少的服务器,适用于长连接的场景。
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
IP 哈希:根据客户端
IP
地址分配请求,使得同一IP
地址的请求始终发送到同一个后端服务器。upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
9. Nginx 中的 location
块是什么?如何根据 URL 路径匹配请求?
location
块 用于指定如何处理与特定 URL
路径匹配的请求。
location
指令可以根据 URL 的前缀或正则表达式匹配来确定将请求路由到哪个处理块。
前缀匹配:
匹配以某个前缀开头的
URL
路径。location /images/ { root /data/images; }
所有以
/images/
开头的 URL 将在/data/images
目录下查找文件。
精确匹配
用
=
来实现完全匹配。location = /login { proxy_pass http://backend/login; }
只有完全匹配
/login
的请求会被处理。
正则表达式匹配
使用
~
表示区分大小写的正则匹配,~*
表示不区分大小写。location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; }
所有以
.php
结尾的请求将交给 FastCGI 处理。
优先级
- Nginx 会根据精确匹配、前缀匹配和正则匹配的顺序来处理请求。先匹配精确,后匹配前缀,再匹配正则。
10. 如何在 Nginx 中配置 SSL 以支持 HTTPS?
生成或获取 SSL 证书和私钥
- 可以使用
Let’s Encrypt
免费获取证书,或者从认证机构购买证书。
在 Nginx 配置文件中启用 SSL
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/html;
index index.html;
}
}
listen 443 ssl
:表示监听HTTPS
请求的443
端口,并启用SSL
。ssl_certificate
和ssl_certificate_key
:分别指定SSL
证书和私钥的路径。ssl_protocols
:指定使用的SSL/TLS
协议版本。ssl_ciphers
:指定安全加密套件。
HTTP 到 HTTPS 重定向:
server {
listen 80;
server_name example.com;
# 将 HTTP 请求重定向到 HTTPS。
return 301 https://$host$request_uri;
}
11. 如何在 Nginx 中设置缓存?Nginx 缓存的常见应用场景有哪些?
Nginx
通过 代理缓存 或 静态文件缓存 来提升性能,减少后端服务器的负担。
Nginx
可以缓存后端服务器的响应数据,当再次请求相同的内容时,直接从缓存中返回,避免重复访问后端。
配置 Nginx 缓存的示例
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend_server;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}
proxy_cache_path
:定义缓存存储的位置和参数,如keys_zone
表示缓存区域大小,max_size
限制缓存大小为1GB
。proxy_cache
:在location
中启用缓存。proxy_cache_valid
:指定缓存不同状态码的有效期,如200
和302
状态的响应缓存10
分钟。
常见的缓存应用场景
静态文件缓存:如图片、
CSS
、JS
等文件,缓存这些资源可以大幅减少服务器负载。API 响应缓存:对频繁访问的
API
响应进行缓存,减轻后端应用的压力。代理缓存:在反向代理场景下缓存后端服务器的响应,提高响应速度。
12. Nginx 中的 upstream
指令是什么?如何使用它来配置后端服务器组?
upstream
指令 用于定义后端服务器组,Nginx
可以将请求分发到多个后端服务器,从而实现负载均衡和高可用性。
配置 upstream
指令的示例
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://backend_servers;
}
}
upstream backend_servers
:定义了一个名为backend_servers
的后端服务器组,包括backend1
和backend2
。proxy_pass
:将请求转发给后端服务器组。
作用
实现负载均衡,将请求分发给多个后端服务器。
提供高可用性,当某个服务器出现故障时,
Nginx
会自动将请求转发到可用的服务器。
13. 如何在 Nginx 中限制请求速率?
Nginx
提供了 限速 功能,用于限制客户端的请求速率,以防止恶意访问或过载攻击。
配置请求速率限制示例
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location / {
limit_req zone=one burst=10 nodelay;
proxy_pass http://backend_server;
}
}
}
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s
:根据客户端IP
地址定义速率限制,最大允许5
个请求/秒。limit_req
:在location
中启用限速,burst=10
表示允许短时突发请求最多10
个,nodelay
表示立即处理突发请求。
作用
防止某些用户恶意请求导致服务器过载。
保护后端服务器,减少流量激增带来的压力。
14. 如何在 Nginx 中设置访问控制,允许或拒绝特定 IP 的访问?
Nginx
提供了 访问控制列表(ACL),可以通过 allow
和 deny
指令来控制对特定 IP
地址的访问权限。
我们可以允许或拒绝某些 IP
或 IP
段的访问,从而增强安全性。
配置访问控制示例
server {
listen 80;
server_name example.com;
location / {
# 允许特定的 IP 地址访问
allow 192.168.1.10;
allow 192.168.1.0/24; # 允许特定的 IP 段
deny all; # 拒绝所有其他 IP 访问
root /var/www/html;
index index.html;
}
}
allow 192.168.1.10
:允许 IP 地址192.168.1.10
访问该服务器。allow 192.168.1.0/24
:允许 IP 段192.168.1.0/24
的所有地址访问。deny all
:拒绝所有未在allow
列表中的IP
访问。
作用
可以用于限制某些敏感区域的访问(如管理后台),只允许特定
IP
或IP
段访问。提升系统的安全性,阻止未授权用户的访问。
注意
allow
和deny
的顺序很重要,Nginx
会按照配置的顺序进行匹配,一旦找到匹配的规则,就不会再继续检查后续规则。如果需要精细化的访问控制,可以根据不同的
location
块为不同路径配置不同的IP
访问权限。