7-nginx代理服务

Nginx 代理服务

正向代理

定义: 正向代理是指客户端通过代理服务器访问目标服务器。客户端配置了代理服务器的地址和端口,所有请求都先发送到代理服务器,再由代理服务器转发到目标服务器,最后将目标服务器的响应返回给客户端。

应用场景:

  • 内网用户通过代理服务器访问外网资源。
  • 控制和监控内网用户对外网的访问。
  • 提高访问速度,通过缓存机制减少重复请求。

工作流程:

  1. 客户端配置代理服务器: 客户端配置代理服务器的地址和端口。
  2. 客户端发送请求: 客户端将请求发送到代理服务器。
  3. 代理服务器转发请求: 代理服务器根据请求中的目标地址,将请求转发到目标服务器。
  4. 目标服务器响应: 目标服务器处理请求并返回响应。
  5. 代理服务器返回响应: 代理服务器将目标服务器的响应返回给客户端

配置示例

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/

反向代理

定义: 反向代理是指客户端访问代理服务器,代理服务器再将请求转发到后端的真实服务器。客户端不知道后端服务器的存在,只与代理服务器交互。

应用场景

  • 负载均衡:将请求分发到多个后端服务器,提高系统性能。
  • 安全性:隐藏后端服务器的真实地址,增加安全性。
  • 缓存:通过缓存机制减少后端服务器的负载。

工作流程

  1. 客户端发送请求: 客户端将请求发送到代理服务器。
  2. 代理服务器转发请求: 代理服务器根据配置将请求转发到后端服务器。
  3. 后端服务器响应: 后端服务器处理请求并返回响应。
  4. 代理服务器返回响应: 代理服务器将后端服务器的响应返回给客户端。

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; # 使用 upstream 定义的后端服务器组
}
}
收起代码

示例 3: 不同的 upstream 配置方式

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream proxy_team {
server 192.168.27.10/uri; # 后端服务器地址,不加 http://
server 192.168.27.11/uri; # 后端服务器地址,不加 http://
}

server {
listen 80;
server_name www.demo.de;

location / {
proxy_pass http://proxy_team; # 使用 upstream 定义的后端服务器组,需要加 http://
}
}
收起代码

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; # 不带 URI,保留原始 URI
# 当访问 www.demo.de/demo 时,会转向为 http://192.168.27.12/demo
}
}

示例 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; # 带 URI,替换原始 URI
# 当访问 www.demo.de/demo 时,会转向为 http://192.168.27.12/test
}
}

其他常用配置

proxy_set_header 指令

用于设置代理请求头。

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; # 设置 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 指令

设置与后端服务器建立连接的超时时间。

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; # 设置连接超时时间为 60 秒
}
}

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; # 设置读取超时时间为 60 秒
}
}

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; # 设置发送超时时间为 60 秒
}
}

反向代理配置示例

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; # 定义错误页面的具体路径
}
}
}
收起代码