
nginx.jpg
Nginx 代理服务
正向代理
定义: 正向代理是指客户端通过代理服务器访问目标服务器。客户端配置了代理服务器的地址和端口,所有请求都先发送到代理服务器,再由代理服务器转发到目标服务器,最后将目标服务器的响应返回给客户端。
应用场景:
- 内网用户通过代理服务器访问外网资源。
- 控制和监控内网用户对外网的访问。
- 提高访问速度,通过缓存机制减少重复请求。
工作流程:
- 客户端配置代理服务器: 客户端配置代理服务器的地址和端口。
- 客户端发送请求: 客户端将请求发送到代理服务器。
- 代理服务器转发请求: 代理服务器根据请求中的目标地址,将请求转发到目标服务器。
- 目标服务器响应: 目标服务器处理请求并返回响应。
- 代理服务器返回响应: 代理服务器将目标服务器的响应返回给客户端
配置示例
1 2 3 4 5 6 7 8 9 10 11
| server { resolver 8.8.8.8; # 指定 DNS 服务器 IP 地址,默认使用 53 端口,是必须的指令 resolver_timeout 3s; # DNS 服务器域名解析超时时间 listen 82; # 监听 82 端口
location / { proxy_pass http://$http_host$request_uri; # 设置代理服务器协议和地址 #$http_host:这是客户端请求中的 Host 头字段,表示目标服务器的主机名。 #$request_uri:这是客户端请求中的 URI(统一资源标识符),表示请求的具体路径和查询参数。 } }
|
客户端访问流程
客户端配置了 http_proxy 和 https_proxy 环境变量,指定了代理服务器的地址和端口。
1 2
| export http_proxy=http://proxy.com:82/ export https_proxy=http://proxy.com:82/
|
客户端发送的请求可能是
1 2
| GET / HTTP/1.1 Host: www.example.com
|
- 客户端配置:客户端通过 http_proxy 和 https_proxy 环境变量将请求发送到 http://proxy.com:82。
- DNS 解析:客户端自动解析 proxy.com 的域名,将其转换为代理服务器的 IP 地址 192.168.1.100。
- 代理服务器监听:代理服务器在指定的端口上监听,接收并处理客户端的请求。
- 代理服务器解析目标地址:代理服务器使用 resolver 指令中指定的 DNS 服务器将目标域名解析为 目标IP 地址。
- 代理服务器转发请求:代理服务器将请求转发到目标服务器。
- 目标服务器响应:目标服务器处理请求并返回响应。
- 代理服务器返回响应:代理服务器将目标服务器的响应返回给客户端。
Linux 中配置代理服务器
在 Linux 中,可以通过设置环境变量来配置系统级别的代理服务器。
1 2
| export http_proxy=http://proxy.com:82/ export https_proxy=http://proxy.com:82/
|
反向代理
定义: 反向代理是指客户端访问代理服务器,代理服务器再将请求转发到后端的真实服务器。客户端不知道后端服务器的存在,只与代理服务器交互。
应用场景:
- 负载均衡:将请求分发到多个后端服务器,提高系统性能。
- 安全性:隐藏后端服务器的真实地址,增加安全性。
- 缓存:通过缓存机制减少后端服务器的负载。
工作流程:
- 客户端发送请求: 客户端将请求发送到代理服务器。
- 代理服务器转发请求: 代理服务器根据配置将请求转发到后端服务器。
- 后端服务器响应: 后端服务器处理请求并返回响应。
- 代理服务器返回响应: 代理服务器将后端服务器的响应返回给客户端。
proxy_pass
指令
proxy_pass
指令用于设置被代理的服务器的地址,可以使主机名、IP 加端口,也可以是一组后端服务器。
示例 1: 单个后端服务器
1 2 3 4 5 6 7
| server { listen 80; server_name www.demo.de; location / { proxy_pass http://www.demo.de/uri; } }
|
示例 2: 使用一组后端服务器
1 2 3 4 5 6 7 8 9 10 11 12 13
| upstream proxy_team { server http://192.168.27.10/uri; server http://192.168.27.11/uri; }
server { listen 80; server_name www.demo.de;
location / { proxy_pass proxy_team; } }
|
收起代码
示例 3: 不同的 upstream
配置方式
1 2 3 4 5 6 7 8 9 10 11 12 13
| upstream proxy_team { server 192.168.27.10/uri; server 192.168.27.11/uri; }
server { listen 80; server_name www.demo.de;
location / { proxy_pass http://proxy_team; } }
|
收起代码
proxy_pass
URL 参数中的 URI
- 如果
proxy_pass
URL 参数中不带 URI,则不会改变原地址的 URI。
- 如果
proxy_pass
URL 参数中带有 URI,则会改变源地址的 URI。
示例 4: 不带 URI
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.demo.de;
location /demo/ { proxy_pass http://192.168.27.12; } }
|
示例 5: 带 URI
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.demo.de;
location /demo/ { proxy_pass http://192.168.27.12/test; } }
|
其他常用配置
用于设置代理请求头。
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; server_name www.demo.de;
location / { proxy_pass http://backend_server; 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_set_header X-Forwarded-Proto $scheme; } }
|
收起代码
proxy_connect_timeout
指令
设置与后端服务器建立连接的超时时间。
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.demo.de;
location / { proxy_pass http://backend_server; proxy_connect_timeout 60s; } }
|
proxy_read_timeout
指令
设置从后端服务器读取响应的超时时间。
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.demo.de;
location / { proxy_pass http://backend_server; proxy_read_timeout 60s; } }
|
proxy_send_timeout
指令
设置向后端服务器发送请求的超时时间。
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name www.demo.de;
location / { proxy_pass http://backend_server; proxy_send_timeout 60s; } }
|
反向代理配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| # 定义用户和工作进程数 user nginx; # 指定 Nginx 工作进程运行的用户 worker_processes auto; # 自动设置工作进程数,通常与 CPU 核心数相同
# 错误日志配置 error_log /var/log/nginx/error.log warn; # 设置错误日志文件路径和日志级别 pid /var/run/nginx.pid; # 设置 Nginx 主进程 ID 文件路径
# 事件处理配置 events { worker_connections 1024; # 每个工作进程可以同时处理的最大连接数 }
# HTTP 配置块 http { # 包含 MIME 类型配置文件 include /etc/nginx/mime.types; # 包含 MIME 类型配置文件 default_type application/octet-stream; # 默认的 MIME 类型
# 日志格式配置 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 定义日志格式
# 访问日志配置 access_log /var/log/nginx/access.log main; # 设置访问日志文件路径和格式
# 发送文件配置 sendfile on; # 启用 sendfile 系统调用提高性能 tcp_nopush on; # 启用 TCP_NOPUSH 选项 tcp_nodelay on; # 启用 TCP_NODELAY 选项 keepalive_timeout 65; # 设置保持连接的超时时间 types_hash_max_size 2048; # 设置 MIME 类型哈希表的最大大小
# 包含额外的配置文件 include /etc/nginx/conf.d/*.conf; # 包含额外的配置文件
# 定义上游服务器组 upstream backend { server 192.0.2.1:80; # 目标服务器1 server 192.0.2.2:80; # 目标服务器2 # 可以添加更多的服务器 }
# 配置代理服务器 server { listen 82; # 监听 82 端口 server_name proxy.com; # 代理服务器域名
# DNS 解析配置 resolver 8.8.8.8 valid=300s; # 使用 Google 的公共 DNS 服务器进行域名解析,缓存时间为 300 秒 resolver_timeout 5s; # 设置 DNS 解析超时时间为 5 秒
# 日志配置 access_log /var/log/nginx/proxy_access.log main; # 设置代理服务器的访问日志文件路径和格式 error_log /var/log/nginx/proxy_error.log warn; # 设置代理服务器的错误日志文件路径和日志级别
# 默认位置配置 location / { # 将请求转发到上游服务器组 proxy_pass http://backend; # 将请求转发到上游服务器组 backend
# 设置代理头信息 proxy_set_header Host $host; # 设置 Host 头为客户端请求的 Host 头 proxy_set_header X-Real-IP $remote_addr; # 设置 X-Real-IP 头为客户端的真实 IP 地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置 X-Forwarded-For 头 proxy_set_header X-Forwarded-Proto $scheme; # 设置 X-Forwarded-Proto 头
# 设置连接超时时间 proxy_connect_timeout 60s; # 设置连接超时时间为 60 秒 proxy_read_timeout 60s; # 设置读取超时时间为 60 秒 proxy_send_timeout 60s; # 设置发送超时时间为 60 秒
# 设置缓冲区大小 proxy_buffer_size 128k; # 设置代理缓冲区大小 proxy_buffers 4 256k; # 设置代理缓冲区数量和大小 proxy_busy_buffers_size 256k; # 设置忙碌缓冲区大小 proxy_temp_file_write_size 256k; # 设置临时文件写入大小 }
# 错误页面配置 error_page 500 502 503 504 /50x.html; # 定义错误页面 location = /50x.html { root /usr/share/nginx/html; # 定义错误页面的具体路径 } } }
|
收起代码