Nginx进阶

反向代理

正向代理服务器

反向代理服务器

## 反向代理
location {
    proxy_pass http://192.168.221.20;
# 反向代理优化
proxy_set_header Host $host;      # 修改请求头,添加Host字段
proxy_set_header X-Real-IP $remote_addr;   # 修改请求头,添加X-Real-IP字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   # 修改请求头,添加X-Forwarded-For字段
client_max_body_size 10m;        # 允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;    # 缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;        # nginx跟后端服务器连接超时时间\(代理连接超时\)
proxy_send_timeout 90;           # 后端服务器数据回传时间\(代理发送超时\)
proxy_read_timeout 90;           # 连接成功后,后端服务器响应时间\(代理接收超时\)
proxy_buffer_size 4k;            # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;             # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k;     # 高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;  # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

proxy_pass: nginx反向代理指令

在本机服务器(192.168.221.129)上编辑nginx.conf文件

vim /usr/local/nginx/conf/nginx.conf
+++++++++++++++++++++++++++++++++++++
# 把最后一个location的root和index注释掉
## 反向代理
proxy_pass http://192.168.221.20;
+++++++++++++++++++++++++++++++++++++
# 检测语法
/usr/local/nginx/sbin/nginx -t
# 重启Nginx
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
## 此时用浏览器输入192.168.221.129就会自动跳转到代理的Apache页面
## 在代理服务器(192.168.221.20)上下载httpd——Centos7版本
systemctl start httpd
# 如果上面这步有问题,可以检查端口80是否被占用,比如之前被Nginx占用,就关闭它,然后继续
netstat -tulpn | grep :80 
# 编辑一个新的首页
vim /var/www/html/index.html(如果原本有首页就mv到bak再vim)
# 随便写点html内容,保存退出,重启
systemctl restart httpd
## 此时再刷新浏览器就会变成刚设置的html首页了
​

## 在代理服务器(192.168.221.131)上下载apache2——Ubuntu版本
# 下载apache2
apt install apache2
systemctl restart apache2
# 删除首页,编辑配置文件
vim /var/www/html/index.html
systemctl restart apache2

负载均衡upstream

在本机服务器(192.168.221.129)上编辑nginx.conf文件

## 在proxy后面补充以下内容
-----------------------------
# 保留原始Host头
proxy_set_header Host $host;
# 传递真实客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 传递经过代理链的客户端IP列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递请求协议(http/https)
proxy_set_header X-Forwarded-Proto $scheme;

在代理服务器Ubuntu(192.168.221.131)上操作

# 下载Apache2
apt install apache2
systemctl restart apache2
# 删除首页,编辑配置文件
vim /var/www/html/index.html
systemctl restart apache2
# 然后打开浏览器刷新就可以来回打开这两个网站

在本机服务器(192.168.221.129)上编辑nginx.conf文件

## 编辑配置文件,可以在gzip on下面添加两个代理ip
vim /usr/local/nginx/conf/nginx.conf
upstream web1 {
        server 192.168.221.20;
        server 192.168.221.131;
    }
proxy_pass http://web1;
保存重启nginx后,就可以刷新浏览器查看这两个网站的内容了
  • 负载均衡

    • 模式(算法)

      • 轮询(默认,RR,Round Robin):将请求按顺序平均分配给所有服务器,适合服务器性能相似的场景;

      • 最小连接数(Least Connections):负载均衡服务器会记录每台后端服务器的连接数,它会智能地将最新请求发送给连接数最少的服务器,适合连接数波动较大的场景,如长连接服务;

      • IP哈希(IP Hash):通过请求的客户端IP进行哈希运算,将来自同一IP地址的请求分发到同一台服务器上,适合有会话保持需求的场景。

      • 权重(Weight):为不同的服务器分配权重,Nginx 将根据设置的权重值来分发请求,权重越高的服务器将承担更多的流量,适合服务器性能不均衡的场景。“权重+轮询=加权轮询”

# 设置集群分组
upstream web1 {
    server 192.168.221.11;   #轮询——按顺序平均分配
    server 192.168.221.12;
    server 192.168.221.13;
    server 192.168.221.14;
    ...
}
​
upstream web2 {
    least_conn;  #最小连接数
    server 192.168.221.11;
    server 192.168.221.12;
    server 192.168.221.13;
    server 192.168.221.14;
    ...
}
​
upstream web3 {
    ip_hash;  #IP哈希模式,算出来一个IP地址固定
    server 192.168.221.11;
    server 192.168.221.12;
    server 192.168.221.13;
    server 192.168.221.14;
    ...
}
​
upstream web4 {
    server 192.168.221.11 weight=3;  #权重
    server 192.168.221.12;
    server 192.168.221.13;
    server 192.168.221.14 weight=5;
    ...
}
​


### 其他配置
weight=number: 设置向这台上游服务器转发的权重,默认为1。
​
max_fails=number: 该选项与 fail_timeout 配合使用,指在 fail_timeout 时间段内,如果
向当前的上游服务器转发失败次数超过 number,则认为在当前的 fail_timeout 时间段内这台
上游服务器不可用。max fails 默认为1,如果设置为 0,则表示不检查失败次数。
​
fail_timeout=time: fail_timeout 表示该时间段内转发失败多少次后就认为上游服务器暂时
不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的
响应超时时间等完全无关。fail_timeout 默认为10秒。
​
down: 表示所在的上游服务器永久下线,只在使用ip_hash 配置项时才有用
​
backup: 在使用 ip_hash 配置项时它是无效的。它表示所在的上游服务器只是备份服务器,
只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。

优化配置

灰度发布

  • 灰度发布:增量发布,逐步用新版本替换旧版本,实现平稳过渡;新版本出现问题时,方便及时回滚;

    • 降低风险:

      • 通过逐步部署,可以及时发现和修复新版本中的问题,避免大规模故障。

    • 快速反馈:

      • 可以在真实环境中快速获得用户反馈,帮助改进新版本。

    • 灵活回滚:

      • 如果发现问题,可以快速回滚到旧版本,减少对用户的影响。

    • 数据驱动决策:

      • 可以根据监控数据和用户反馈做出部署决策,提高发布的可靠性。

灰度发布的策略:

  • 基于权重的灰度发布

    • 在Nginx配置中,通过为不同版本的服务设置不同的权重,来控制请求被分配到各个版本的比例。例如,初始阶段可以将新版本的权重设置为20%,旧版本的权重设置为80%。

    • 随着新版本的表现逐渐稳定,可以逐步增加新版本的权重,直到最终将所有请求都切换到新版本。

  • 基于Cookie的灰度发布

    • 在应用端设置一个标识用户是否参与灰度测试的Cookie,例如is_gray=1表示参与,is_gray=0表示不参与。

    • 在Nginx配置中,通过读取用户请求中的Cookie信息,来决定将请求路由到哪个版本的服务。当用户的请求中带有is_gray=1的Cookie时,Nginx会将请求路由到新版本的服务;否则,请求将被路由到旧版本的服务。

  • 基于IP地址的灰度发布

    • 根据用户的IP地址来控制请求的路由。例如,可以指定某个IP段(如192.168.1.0/24)的用户能够访问新版本的服务。

    • 在Nginx配置中,使用geo模块来根据用户的IP地址分配不同的后端服务。

平滑升级

  • Nginx平滑升级(了解):在不停止nginx服务的情况下,更新nginx的版本;

具体升级步骤:

  • 关闭 Nginx 服务 /usr/local/nginx/sbin/nginx -s stop 或者 kill QUIT PID

  • 升级 Nginx 二进制文件

  • 启动 Nginx 服务 /usr/local/nginx/sbin/nginx

  • 注意,请将Nginx 的路径替换成真实的路径

  • worker进程数量和最大连接数;

    #启动工作进程数量
    worker_processes  4;
    #指定运行的核的编号,采用掩码的方式设置编号
    worker_cpu_affinity   0001 0010 0100 1000;
    events {
    #单个工作进程维护的请求队列长度
        worker_connections  1024;
    }
  • gzip on;是否压缩,压缩数据可以节省带宽;

    # 开启gzip
    gzip on;
    #Nginx做为反向代理的时候启用:
    off – 关闭所有的代理结果数据压缩
    expired – 如果header中包含”Expires”头信息,启用压缩
    no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
    no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
    private – 如果header中包含”Cache-Control:private”头信息,启用压缩
    no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
    no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
    auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
    any – 无条件压缩所有结果数据
    gzip_proxied any;
    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
    gzip_comp_level 1;
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
    # 增加响应头”Vary: Accept-Encoding”
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    # 禁用IE 6 gzip
    gzip_disable "MSIE [1-6]\.";
    # 设置压缩所需要的缓冲区大小     
    gzip_buffers 32 4k;
    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.0;
  • 长连接:减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销;

    keepalive_timeout  0;     # 0代表关闭
    #keepalive_timeout  100;
    #keepalive_requests 8192;
  • 本地缓存静态文件;将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。

    expires指令:开启缓存并指定静态缓存时间
    location ~*  \.(png|gif)$ {
                  expires 1h;
             }

好的,关于Nginx进阶的话题非常广泛,我们可以从多个角度深入探讨。以下是一个常见的进阶需求:**如何在Nginx中实现基于IP的访问控制**。 ### 实现基于IP的访问控制 #### 问题描述 有时我们需要限制某些IP地址对网站或API的访问,或者只允许特定的IP地址访问某些资源。这可以通过Nginx的`allow`和`deny`指令来实现。 #### 解决方案 以下是一个示例配置,展示如何使用Nginx限制IP访问: ```nginx http { server { listen 80; server_name example.com; # 定义允许和拒绝的IP地址 location /admin { allow 192.168.1.1; # 允许此IP访问 deny 192.168.1.2; # 拒绝此IP访问 allow 192.168.1.0/24; # 允许整个子网访问 deny all; # 拒绝所有其他IP访问 proxy_pass http://localhost:8080; } location / { proxy_pass http://localhost:8080; } } } ``` #### 代码解释 1. **`allow`指令**:指定允许访问的IP地址或子网。 2. **`deny`指令**:指定拒绝访问的IP地址或子网。 3. **顺序很重要**:Nginx会按照配置文件中的顺序检查`allow`和`deny`规则。如果某个请求匹配到`allow`,则允许访问;如果匹配到`deny`,则拒绝访问。 4. **`deny all`**:最后的`deny all`确保没有被明确允许的IP都被拒绝。 --- ### 进一步扩展:基于地理位置的访问控制 除了基于IP的访问控制,Nginx还可以结合`geoip`模块实现基于地理位置的访问控制。 #### 示例配置 ```nginx http { geoip_country /usr/share/nginx/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default no; US yes; # 允许来自美国的访问 CN yes; # 允许来自中国的访问 } server { listen 80; server_name example.com; location / { if ($allowed_country = no) { return 403; # 拒绝访问 } proxy_pass http://localhost:8080; } } } ``` #### 代码解释 1. **`geoip_country`**:加载GeoIP数据库,用于识别客户端的国家信息。 2. **`map`指令**:根据国家代码(如US、CN)定义是否允许访问。 3. **`if`条件**:如果客户端的国家不在允许列表中,则返回403 Forbidden。 --- ### 总结 以上展示了两种常见的Nginx进阶用法: 1. 基于IP的访问控制。 2. 基于地理位置的访问控制。 如果你有更具体的需求或想了解其他进阶功能,请告诉我!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值