前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx - 深入了解 正向代理vs反向代理 、负载均衡算法 、 缓存策略

Nginx - 深入了解 正向代理vs反向代理 、负载均衡算法 、 缓存策略

作者头像
小小工匠
发布2024-05-26 13:53:39
1560
发布2024-05-26 13:53:39
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

Nginx基本功能与代理定义

Nginx是一款高性能的HTTP服务器和反向代理服务器。代理服务器(Proxy Server)在客户端和目标服务器之间充当中介,其主要作用包括负载均衡、缓存、内容过滤和安全增强等。

  • 反向代理:代理服务器代表目标服务器接受客户端请求,并将请求转发给目标服务器,再将响应返回给客户端。
  • 正向代理:代理服务器代表客户端发送请求,获取目标服务器的响应并返回给客户端。

Nginx反向代理

工作原理

在反向代理模式中,Nginx接收客户端的HTTP请求,将这些请求转发给内部服务器集群处理,然后将服务器的响应发送回客户端。反向代理通常用于隐藏服务器集群的实际地址、实现负载均衡、提高性能和增强安全性。

应用场景

  1. 负载均衡:将请求分配给多个后端服务器,提高服务可用性和响应速度。
  2. 缓存:缓存静态内容,减少后端服务器的负载。
  3. 安全性:隐藏后端服务器的真实IP,防止直接攻击。

示例配置

代码语言:javascript
复制
http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;

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

Nginx正向代理

工作原理

在正向代理模式中,客户端将请求发送给代理服务器,代理服务器再代表客户端向目标服务器发出请求,并将目标服务器的响应返回给客户端。正向代理通常用于访问控制、网络加速和隐私保护。

应用场景

  1. 访问控制:限制用户访问特定网站或服务。
  2. 内容过滤:过滤掉不合规或恶意内容。
  3. 隐私保护:隐藏客户端的真实IP,提高匿名性。

示例配置

代码语言:javascript
复制
events {
    worker_connections 1024;
}

http {
    server {
        listen 8888;

        location / {
            proxy_pass http://$http_host$request_uri;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

反向代理与正向代理的区别

  1. 代理对象:反向代理代理的是服务器,正向代理代理的是客户端。
  2. 应用目的
    • 反向代理:主要用于负载均衡、缓存、提升安全性。
    • 正向代理:主要用于访问控制、内容过滤和隐私保护。
  3. 配置差异:反向代理需要配置后端服务器池(upstream),正向代理直接将请求转发至目标服务器。

Nginx负载均衡算法

Nginx提供多种负载均衡算法来分配请求到后端服务器,常用的算法包括:

轮询(Round Robin):默认算法,将请求依次分配给每个后端服务器。

代码语言:javascript
复制
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

最少连接数(Least Connections):将请求分配给当前活动连接数最少的服务器。

代码语言:javascript
复制
upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

IP哈希(IP Hash):根据客户端IP地址的哈希值将请求分配给特定服务器,适用于会话保持。

代码语言:javascript
复制
upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

权重(Weight):根据服务器的权重分配请求,权重越高,分配的请求越多。

代码语言:javascript
复制
upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
}

Nginx缓存策略

缓存可以显著提高性能和减少后端服务器的负载。Nginx的缓存策略包括静态内容缓存和代理缓存。

静态内容缓存

Nginx可以直接缓存静态内容,如图片、CSS文件等。

代码语言:javascript
复制
location /static/ {
    root /var/www/html;
    expires 30d;
    add_header Cache-Control "public";
}

代理缓存

代理缓存可以缓存从后端服务器获取的动态内容。

代码语言:javascript
复制
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;
            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_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

缓存优化策略

  1. 设置合适的缓存时间:根据内容的变化频率设置合理的缓存过期时间。
  2. 缓存键:配置缓存键,以确保唯一性和有效性。
  3. 缓存清理:定期清理过期缓存,避免占用过多存储空间。

Nginx高级安全设置

提高Nginx的安全性可以保护服务器免受各种网络攻击。以下是一些常用的安全设置:

限制请求速率:防止DDoS攻击和暴力破解。

代码语言:javascript
复制
http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

    server {
        location / {
            limit_req zone=mylimit burst=20 nodelay;
        }
    }
}

SSL/TLS配置:启用HTTPS,提高传输安全性。

代码语言:javascript
复制
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    location / {
        proxy_pass http://backend;
    }
}

防止主机头攻击:只允许特定的主机头。

代码语言:javascript
复制
server {
    server_name example.com;
    
    if ($host !~* ^(example\.com)$ ) {
        return 444;
    }

    location / {
        proxy_pass http://backend;
    }
}

HTTP安全头:添加HTTP安全头以防止各种Web攻击。

代码语言:javascript
复制
server {
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Frame-Options SAMEORIGIN;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://backend;
    }
}

动态内容缓存策略

Nginx的动态内容缓存可以显著提升网站性能和响应速度。动态内容缓存指的是缓存动态生成的网页内容,以减少对后端服务器的请求次数。

动态内容缓存配置

首先,需要配置缓存路径和缓存区域:

代码语言:javascript
复制
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;
            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_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

动态内容缓存优化

缓存键优化:确保缓存键的唯一性,避免缓存混乱。

代码语言:javascript
复制
proxy_cache_key "$scheme$request_method$host$request_uri";

缓存清理策略:定期清理过期和不再需要的缓存,保持缓存空间的有效利用。

代码语言:javascript
复制
find /data/nginx/cache -type f -mtime +7 -delete

避免缓存特定内容:对于用户特定数据(如购物车信息)不进行缓存。

代码语言:javascript
复制
location /cart {
    proxy_no_cache 1;
    proxy_pass http://backend;
}

细化缓存控制:针对不同的内容设置不同的缓存时间。

代码语言:javascript
复制
location /api {
    proxy_cache_valid 200 1m;
    proxy_pass http://backend;
}

location /static {
    proxy_cache_valid 200 30m;
    proxy_pass http://backend;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nginx基本功能与代理定义
  • Nginx反向代理
    • 工作原理
      • 应用场景
        • 示例配置
        • Nginx正向代理
          • 工作原理
            • 应用场景
              • 示例配置
              • 反向代理与正向代理的区别
              • Nginx负载均衡算法
              • Nginx缓存策略
                • 静态内容缓存
                  • 代理缓存
                    • 缓存优化策略
                    • Nginx高级安全设置
                    • 动态内容缓存策略
                      • 动态内容缓存配置
                        • 动态内容缓存优化
                        相关产品与服务
                        负载均衡
                        负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档