Loading... ## 7层反向代理(HTTP) 使用模块:[ngx_http_proxy_module](https://nginx.org/en/docs/http/ngx_http_proxy_module.html) ### 基础配置 **反向代理 HTTP 站点:** 访问 `https://hello.qwerto.cc/index.html` 时,nginx 会转发到 `http://test.qwerto.cc/index.html` ``` location / { proxy_pass http://test.qwerto.cc; } ``` **反向代理 HTTPS 站点:** 访问 `https://hello.qwerto.cc/index.html` 时,nginx 会转发到 `https://test.qwerto.cc/index.html` HTTPS 站点的反向代理,需要在 HTTP 站点反向代理的基础上,增加 `proxy_ssl_server_name on;` 配置。 因为 Nginx 反向代理默认不会发送 SNI,当这个配置项启用后,建立 SSL 连接时就会把 `server_name` 传给上游服务器。 ``` location / { proxy_pass https://test.qwerto.cc; proxy_ssl_server_name on; } ``` ### 进阶配置 #### 常用参数 ``` location / { proxy_pass https://test.qwerto.cc; proxy_http_version 1.1; #proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Range $http_range; proxy_set_header If-Range $http_if_range; proxy_redirect off; proxy_ssl_server_name on; } ``` #### `proxy_http_version 1.1` 指定了使用 HTTP 1.1 协议与后端服务器进行通信,如果不设置默认值为HTTP 1.0 #### `proxy_set_header Host $http_host` 设置被代理请求中的 Host 头部信息,这里使用 `$http_host` 变量,包含了完整的 Host 头部和端口 #### `proxy_set_header Upgrade $http_upgrade` 用于设置 Upgrade 头部,通常用于 WebSocket 协议等需要升级连接的情况 #### `proxy_set_header Connection "upgrade"` 设置 Connection 头部为 "upgrade",也是用于支持 WebSocket 协议等需要升级连接的情况 #### `proxy_set_header X-Real-IP $remote_addr` 设置 X-Real-IP 头部,将客户端真实 IP 地址发送给后端服务器。 可选变量 `$remote_addr`、`$proxy_protocol_addr` #### `proxy_set_header X-Forwarded-For $remote_addr` 设置 X-Forwarded-For 头部,指示原始客户端的 IP 地址列表。 可选变量 `$remote_addr`、`$proxy_add_x_forwarded_for`、`$proxy_protocol_addr` #### `proxy_set_header X-Forwarded-Proto $scheme` 设置 X-Forwarded-Proto 头部,指示原始请求的协议 可选变量 `$scheme`,可选值 `http`、`https`。 #### `proxy_set_header Range $http_range` 设置 Range 头部,用于支持断点续传或分段传输。 #### `proxy_set_header If-Range $http_if_range` 设置 If-Range 头部,用于支持断点续传或分段传输。 #### `proxy_redirect off` 禁用代理请求的重定向功能,以避免代理服务器修改后端服务器返回的 Location 头部信息。 #### `proxy_ssl_server_name on` 在与后端服务器建立 SSL 连接时,传递客户端请求中的 Host 头部信息。 ### 反向代理路径规则 * 如果 proxy_pass 不带路径 + proxy_pass 末尾有斜杠,不会拼接 location 的路径 * 如果 proxy_pass 不带路径 + proxy_pass 末尾无斜杠,会拼接 location 的路径 * 如果 proxy_pass 带路径 + proxy_pass 末尾有斜杠,不会拼接 location 的路径 * 如果 proxy_pass 带路径 + proxy_pass 末尾无斜杠 + location 末尾无斜杠,不会拼接 location 的路径 * 如果 proxy_pass 带路径 + proxy_pass 末尾无斜杠 + location 末尾有斜杠,会拼接 location 的路径 #### 栗子: | location | proxy_pass | 外部访问 | 实际访问 | | :------: | :--------------------------: | :--------------------------------: | :--------------------------------: | | `/api` | `http://127.0.0.1:1234/` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/login` | | `/api/` | `http://127.0.0.1:1234/` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/login` | | `/api` | `http://127.0.0.1:1234` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/api/login` | | `/api/` | `http://127.0.0.1:1234` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/api/login` | | `/api` | `http://127.0.0.1:1234/v50/` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/v50//login` | | `/api/` | `http://127.0.0.1:1234/v50/` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/v50/login` | | `/api` | `http://127.0.0.1:1234/v50` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/v50/login` | | `/api/` | `http://127.0.0.1:1234/v50` | `https://test.qwerto.cc/api/login` | `http://127.0.0.1:1234/v50login` | ## 4层反向代理(TCP) 使用模块:[ngx_http_upstream_module](https://nginx.org/en/docs/http/ngx_http_upstream_module.html) ### 通过服务名称分流到不同的后端端口 栗子: ```ini # 4层配置 stream { map $ssl_preread_server_name $backend { test1.qwerto.cc test-1; # 服务名称为 test1.qwerto.cc 时,转发到test-1(127.0.0.1:1001) test2.qwerto.cc test-2; # 服务名称为 test2.qwerto.cc 时,转发到test-2(127.0.0.1:1002) test3.qwerto.cc test-2; # 服务名称为 test3.qwerto.cc 时,转发到test-2(127.0.0.1:1002) default web; # 默认值。没有匹配到上面任意服务名称时,转发到web(127.0.0.1:444) } # 上游服务器 # upstream test-1 { server 127.0.0.1:1001; # test-1 的后端 } upstream test-2 { server 127.0.0.1:1002; # test-2 的后端 } upstream web { server 127.0.0.1:444; # web 的后端 } server { listen 443 reuseport; # 监听443端口 listen [::]:443 reuseport; # 监听443端口(ipv6) proxy_pass $backend; ssl_preread on; # 开启预读取,只有开启预读取才能支持按照服务名称分流 proxy_protocol on; # 启用 Proxy Protocol,需要和后端同时启用 } } # web后端 server { listen 444 ssl; http2 on; ...... } ``` 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 1 如果觉得我的文章对你有用,请随意赞赏