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 中,你可以定义一个或多个后端服务器,并将它们组合成一个上游组。
示例
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
这里定义了一个名为 backend
的上游组,包含两个后端服务器。
2.2 配置反向代理
接下来,你需要在 location
块中配置反向代理规则。
示例
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
这里,proxy_pass
指令将请求转发到前面定义的 backend
上游组。
2.3 配置负载均衡
Nginx 支持多种负载均衡算法,包括轮询、最少连接数、哈希等。
示例
upstream backend {
least_conn;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
这里,least_conn
指令使得请求被转发到当前连接数最少的后端服务器。
3. 高级配置
3.1 会话保持
会话保持确保来自同一客户端的请求总是被转发到同一个后端服务器。
示例
upstream backend {
ip_hash;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
这里,ip_hash
指令实现了基于客户端 IP 地址的会话保持。
3.2 健康检查
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_fails
和 fail_timeout
用于配置健康检查。
3.3 缓存
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 终结点,处理加密通信,减轻后端服务器的负担。
示例
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
proxy_pass http://backend;
}
这里,ssl_certificate
和 ssl_certificate_key
指令配置了 SSL/TLS 证书。
4. 配置示例
4.1 简单的反向代理
假设你有一个简单的后端服务器,你需要配置 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 来实现负载均衡。
配置文件
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 地址的会话保持。
配置文件
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 后端服务器。
配置文件
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 地址。