Nginx反向代理

Nginx 作为反向代理服务器有诸多重要的用处:

一、负载均衡

  • Nginx 可以将客户端的请求分发到多个后端服务器上。例如,当有多个相同服务的服务器时,Nginx 根据配置的负载均衡策略(如轮询、最少连接数、IP 哈希等),将请求合理地分配给不同的服务器。在电商网站场景下,当大量的用户同时访问商品展示页面时,Nginx 可以将这些请求均匀地分发到后端的多个应用服务器上,避免单个服务器因请求过多而出现性能瓶颈,从而提高整个系统的并发处理能力。

二、提高安全性

  • Nginx 反向代理可以隐藏后端服务器的真实 IP 地址。这意味着,客户端只能看到 Nginx 服务器的 IP,而后端服务器的 IP 被屏蔽起来。这增加了后端服务器的安全性,使得攻击者很难直接对后端服务器进行攻击。例如,对于企业内部的一些敏感服务服务器,通过反向代理可以有效防止外部非法访问。
  • 它还可以在反向代理层面上进行安全检查。如对客户端请求进行过滤,阻止恶意请求(如包含 SQL 注入、XSS 攻击代码的请求)到达后端服务器。例如,Nginx 可以通过配置规则来识别并丢弃包含某些特殊关键字或不符合格式要求的请求,从而保护后端服务器免受安全威胁。

三、缓存

  • Nginx 可以缓存后端服务器的响应内容。对于一些经常访问且不经常更新的资源(如静态网页、图片、CSS 和 JavaScript 文件等),当第一个客户端请求这些资源时,Nginx 会从后端服务器获取并存储这些内容。后续的相同请求,Nginx 可以直接从缓存中提供这些资源,而无需再次向后端服务器请求。这可以减轻后端服务器的负担,同时加快客户端的访问速度。例如,在一个新闻网站中,文章页面的 HTML 和相关图片在短时间内被大量用户访问,Nginx 缓存这些内容后,后续的访问可以直接从缓存获取,提高用户体验。

四、SSL/TLS 加密终止

  • Nginx 可以在反向代理服务器上处理 SSL/TLS 加密和解密。这样,后端服务器就可以不用自己处理这些加密操作,减轻后端服务器的计算压力。例如,对于一个对外提供 HTTPS 服务的网站,Nginx 可以在客户端和 Nginx 之间建立加密连接,而 Nginx 和后端服务器之间可以使用更高效的非加密连接(前提是内部网络安全可靠的情况下),这样可以提高整个系统的性能。

五、URL 重写

  • Nginx 可以根据需要对客户端的请求 URL 进行重写,然后再将请求转发给后端服务器。例如,一个网站需要将旧的 URL 结构(如/old-page.html)重写为新的 URL 结构(如/new-page.html),Nginx 可以在反向代理过程中完成这个重写操作。这对于网站进行 URL 改造、优化搜索引擎排名或者进行页面整合等操作时非常有用。

六、访问控制

  • Nginx 可以对客户端的访问进行控制。例如,可以根据客户端的 IP 地址、请求的用户代理等信息来允许或拒绝访问。在企业内部应用中,可以限制只有企业内部特定 IP 范围的客户端能够访问某些后端服务器提供的内部服务,从而实现访问权限的管理。
通过Nginx 反向代理功能和内置的负载均衡算法来实现负载均衡

一、配置 upstream 模块

1. 在 Nginx 的配置文件(通常位于`/etc/nginx/nginx.conf`或`/etc/nginx/conf.d/`目录下的某个文件中)中,使用`upstream`指令来定义一组后端服务器。
     语法示例:

     upstream backend_servers {
       server backend1.example.com;
       server backend2.example.com;
       server backend3.example.com;
     }

   这里的backend_servers是一个自定义的组名,后续在服务器块中会引用它。`server`指令后面跟着的是后端服务器的地址,可以是域名或 IP 地址。

2. 可以为每个后端服务器指定不同的参数,如权重(weight)、最大失败次数(max_fails)和失败后的暂停时间(fail_timeout)等。
   权重示例:

     upstream backend_servers {
       server backend1.example.com weight = 2;
       server backend2.example.com weight = 1;
       server backend3.example.com weight = 1;
     }

     在这个例子中,backend1.example.com的权重是2,而其他两个服务器的权重是1。这意味着在负载均衡过程中,backend1.example.com会比其他两个服务器有更高的概率接收请求。例如,在轮询算法下,每3次请求中,backend1.example.com可能会接收2次请求,其他两个服务器各接收1次。

     最大失败次数和失败后的暂停时间示例:

      upstream backend_servers {
        server backend1.example.com max_fails = 3 fail_timeout = 30s;
        server backend2.example.com;
     }

   这表示如果backend1.example.com连续出现3次请求失败,那么在接下来的30秒内,Nginx不会再将请求发送给这台服务器,等待这个时间过后才会再次尝试。

二、负载均衡算法

1. 轮询(Round - Robin)(默认算法)
     这是最简单的负载均衡算法。Nginx 按照顺序依次将客户端的请求分配给后端服务器组中的服务器。例如,对于有3台后端服务器的组,第一个请求分配给服务器1,第二个请求分配给服务器2,第三个请求分配给服务器3,第四个请求又回到服务器1,依此类推。

2. 权重轮询(Weighted Round - Robin)
     这种算法考虑了服务器的性能差异。通过为每台服务器设置权重,权重值越高的服务器在分配请求时会被优先考虑。例如,如果服务器A的权重是2,服务器B的权重是1,那么在分配请求时,服务器A会接收到两倍于服务器B的请求量(相对比例)。这适合服务器性能不同的场景,能够让性能更好的服务器承担更多的负载。

3. 最少连接数(Least Connections)
     Nginx 会将新的请求分配给当前连接数最少的后端服务器。这种算法适用于会话时间较长的场景,例如一些需要长时间建立连接的视频流服务。因为如果一个服务器已经有很多连接在处理,就说明它可能比较繁忙,此时将请求分配给连接数少的服务器可以更好地平衡负载。

4. IP 哈希(IP Hash)
     IP 哈希算法通过客户端的 IP 地址进行哈希计算,然后根据哈希结果将请求分配给后端服务器。这样可以确保同一个客户端的请求总是分配到同一台后端服务器上。这在一些需要保持会话状态的应用场景下很有用,比如购物车服务,因为如果客户端的请求总是被分配到同一台服务器,就可以在该服务器上保持用户的购物车状态,而不会因为请求被分配到不同的服务器而导致购物车信息丢失。
以下是一个包含 Nginx 作为反向代理服务器一至六用处的配置示例:
server {
    listen 80;
    server_name 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;
    }
}


upstream backend {
    server backend1.example.com weight=2;
    server backend2.example.com weight=1;
    server backend3.example.com weight=1;
    server backend4.example.com max_fails=3 fail_timeout=30s;
}

# 缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;

    location /static/ {
        # 静态资源缓存
        proxy_cache my_cache;
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

# SSL/TLS 加密终止
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;

    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;
    }
}

# URL 重写
server {
    listen 80;
    server_name example.com;

    location /old-page.html {
        # 将旧 URL 重写为新 URL
        rewrite ^/old-page.html$ /new-page.html permanent;
    }
}

# 访问控制
server {
    listen 80;
    server_name example.com;

    location /restricted/ {
        # 限制只有特定 IP 范围的客户端能够访问
        allow 192.168.1.0/24;
        deny all;
        proxy_pass http://backend;
    }
}

上述配置示例实现了 Nginx 作为反向代理服务器的多种功能,包括隐藏后端服务器 IP 、负载均衡、缓存、SSL/TLS 加密终止、URL 重写以及访问控制等。

你可能感兴趣的:(服务器,nginx,运维)