高性能web服务器4——Nginx反向代理A


Nginx 反向代理

Nginx 的反向代理功能是其最强大的特性之一,它允许 Nginx 作为中间层来接收客户端的请求,并将这些请求转发到后端服务器。这种架构不仅可以提高安全性,还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向代理的基本概念、配置方法以及一些高级用法。

1. 反向代理的基本概念

1.1 什么是反向代理?

  • 定义:反向代理是一种代理服务器类型,它代表一组后端服务器接受和转发客户端的请求。与正向代理不同,反向代理位于客户端看不见的位置。
  • 作用:提高安全性、负载均衡、缓存、内容过滤等。

1.2 反向代理的工作原理

  • 接收请求:客户端向反向代理服务器发送请求。
  • 转发请求:反向代理服务器根据配置将请求转发到一个或多个后端服务器。
  • 返回响应:后端服务器处理请求并返回响应,反向代理再将响应转发给客户端。

1.3 反向代理转发模块

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预

定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主

要在不同的场景使用以下模块实现不同的功能

  • ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
  • ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
    #等指令引用的后端服务器分组
  • ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
  • ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
  • ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需

要经过处理才能被访问

2. 配置反向代理

2.1 定义后端服务器

在 Nginx 中,你可以定义一个或多个后端服务器,并将它们组合成一个上游组。

示例
nginx 复制代码
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里定义了一个名为 backend 的上游组,包含两个后端服务器。

2.2 配置反向代理

接下来,你需要在 location 块中配置反向代理规则。

示例
nginx 复制代码
location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

这里,proxy_pass 指令将请求转发到前面定义的 backend 上游组。

2.3 配置负载均衡

Nginx 支持多种负载均衡算法,包括轮询、最少连接数、哈希等。

示例
nginx 复制代码
upstream backend {
    least_conn;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里,least_conn 指令使得请求被转发到当前连接数最少的后端服务器。

3. 高级配置

3.1 会话保持

会话保持确保来自同一客户端的请求总是被转发到同一个后端服务器。

示例
nginx 复制代码
upstream backend {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里,ip_hash 指令实现了基于客户端 IP 地址的会话保持。

3.2 健康检查

Nginx 支持对后端服务器进行健康检查,确保只转发请求到健康的服务器。

示例
nginx 复制代码
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000 down;
    server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;
}

这里,down 表示服务器目前不可用,max_failsfail_timeout 用于配置健康检查。

3.3 缓存

Nginx 可以缓存后端服务器的响应,以减少对后端服务器的请求次数。

示例
nginx 复制代码
location / {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_valid 200 60m;
}

这里,proxy_cache 指令配置了缓存,proxy_cache_valid 指令定义了缓存的有效期。

3.4 SSL/TLS 终结

Nginx 可以作为 SSL/TLS 终结点,处理加密通信,减轻后端服务器的负担。

示例
nginx 复制代码
server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    proxy_pass http://backend;
}

这里,ssl_certificatessl_certificate_key 指令配置了 SSL/TLS 证书。

4. 配置示例

4.1 简单的反向代理

假设你有一个简单的后端服务器,你需要配置 Nginx 作为反向代理来转发请求。

配置文件
nginx 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://192.168.1.10:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.2 负载均衡

假设你有两个后端服务器,你需要配置 Nginx 来实现负载均衡。

配置文件
nginx 复制代码
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

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

4.3 会话保持

假设你有两个后端服务器,你需要配置 Nginx 来实现基于客户端 IP 地址的会话保持。

配置文件
nginx 复制代码
upstream backend {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

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

4.4 SSL/TLS 终结

假设你需要配置 Nginx 来处理 HTTPS 请求,并将请求转发到 HTTP 后端服务器。

配置文件
nginx 复制代码
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    location / {
        proxy_pass http://192.168.1.10:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5. 注意事项

  • 确保正确配置 SSL/TLS 证书,以避免安全警告。
  • 监控后端服务器的健康状态,及时调整负载均衡策略。
  • 测试反向代理配置,确保所有功能按预期工作。
  • 考虑到安全性,不要暴露后端服务器的 IP 地址。
相关推荐
gs801403 分钟前
安装node 报错需要:glibc >= 2.28
linux·服务器·前端·node.js
hgdlip28 分钟前
一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性
服务器·网络协议·tcp/ip·电脑
Random_index3 小时前
#名词区别篇:npx pnpm npm yarn区别
前端·npm
GDAL3 小时前
Puppeteer-Cluster:并行处理网页操作的新利器
运维·服务器·nodehtmltoimage
B.-3 小时前
Remix 学习 - 路由模块(Route Module)
前端·javascript·学习·react·web
limengshi1383923 小时前
通信工程学习:什么是GFP通用成帧规范
服务器·网络·网络协议·学习·信息与通信
sone121383 小时前
计算机网络(第8版)第三章 数据链路层(3.4)
服务器·网络·计算机网络
不修×蝙蝠3 小时前
Javascript应用(TodoList表格)
前端·javascript·css·html
望获linux3 小时前
Linux网络协议栈的实现
linux·服务器·arm开发·网络协议·操作系统·嵌入式操作系统
robot_大菜鸟4 小时前
linux-L5.linux查看应用占用的资源top
linux·运维·服务器