结丹期

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_certificatessl_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:指定缓存不同状态码的有效期,如 200302 状态的响应缓存 10 分钟。

常见的缓存应用场景

  • 静态文件缓存:如图片、CSSJS 等文件,缓存这些资源可以大幅减少服务器负载。

  • 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 的后端服务器组,包括 backend1backend2

  • 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),可以通过 allowdeny 指令来控制对特定 IP 地址的访问权限。

我们可以允许或拒绝某些 IPIP 段的访问,从而增强安全性。

配置访问控制示例

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 访问。

作用

  • 可以用于限制某些敏感区域的访问(如管理后台),只允许特定 IPIP 段访问。

  • 提升系统的安全性,阻止未授权用户的访问。


注意

  • allowdeny 的顺序很重要,Nginx 会按照配置的顺序进行匹配,一旦找到匹配的规则,就不会再继续检查后续规则。

  • 如果需要精细化的访问控制,可以根据不同的 location 块为不同路径配置不同的 IP 访问权限。

results matching ""

    No results matching ""