高性能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 地址。
相关推荐
真正的醒悟43 分钟前
2025【1460天】网络工程师经验之道
运维·服务器
dy17173 小时前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
Tim风声(网络工程师)4 小时前
不同射频对应不同mac地址(查找无线用户连接AP信息)
服务器·网络·tcp/ip·智能路由器·无线ap
2501_915918416 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂7 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技7 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip7 小时前
JavaScript二叉树相关概念
前端
鳄鱼杆7 小时前
服务器 | Docker应用开发与部署的实践以及阿里云镜像加速配置
服务器·阿里云·docker
羚羊角uou7 小时前
【Linux】命名管道
linux·运维·服务器
曾经的三心草8 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器