正向代理与反向代理概述
正向代理:
定义:正向代理位于客户端和目标服务器之间,客户端的请求首先发送到代理服务器,然后由代理服务器转发到目标服务器,最后将目标服务器的响应返回给客户端。
作用:正向代理可以隐藏客户端的真实IP地址,同时可以进行一些安全控制,如访问控制、内容过滤等。
反向代理:
定义:反向代理位于服务器端,客户端的请求直接发送到反向代理服务器,然后由反向代理服务器根据配置将请求转发到后端的一个或多个服务器上,最后将后端服务器的响应返回给客户端。
作用:反向代理可以负载均衡、提高安全性、缓存静态内容等。
Nginx反向代理的配置语法
Nginx 的反向代理功能是通过 ngx_http_proxy_module 模块实现的。这个模块在安装 Nginx 的时候默认就已经包含在内了。以下是一些在配置 Nginx 反向代理时常用的指令及其说明。
proxy_pass
语法 | proxy_pass URL |
---|---|
默认值 | 无默认值 |
位置 | location块 |
说明 | 将请求转发到指定的URL |
该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。
URL:为要设置的被代理服务器地址,包含传输协议(http,https://)、主机名称或IP地址加端口号、URI等要素。
例子:访问192.168.101.23后将服务跳转到192.168.101.18
192.168.101.23nginx配置
proxy_server
server {
listen 8082;
server_name localhost;
location / {
proxy_pass http://192.168.101.18;
}
}
在 192.168.101.18的index.html添加标识
浏览器访问测试
斜杠的问题
如果不加斜杠访问会提示错误
演示:
proxy_server
server {
listen 8082;
server_name localhost;
location server {
proxy_pass http://192.168.101.18;
}
}
路径不能正常访问
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1030439e6d8e4abeb5618ca0bd0cba17.png
查看错误提示对应路径中没有这个文件,因为server被加到路径中去了,但是服务器并没有这个路径
加上斜杠则能正常访问
proxy_server
server {
listen 8082;
server_name localhost;
location /server {
proxy_pass http://192.168.101.18/;
}
}
区别在于 如果不加斜杠则会把server拼接到访问路径中去,如果加上则不会.
如果location只有一个"/"则加不加都一样
proxy_set_header
语法 | proxy_set_header field value |
---|---|
默认值 | proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
位置 | http, server, location |
该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。
被代理服务器: [192.168.101.18]
server {
listen 83;
server_name 127.0.0.1;
access_log logs/access.log main;
default_type text/plain;
location / {
return 200 $http_username; #获取头信息
}
}
代理服务器: [192.168.101.23]
server {
listen 8082;
server_name localhost;
location /server {
proxy_pass http://182.168.101.18:83/;
proxy_set_header username JACK; #设置头信息
}
}
输出
代理服务器 192.168.101.23
设置多个值
server {
listen 8082;
server_name localhost;
location / {
proxy_pass http://192.168.101.18/;
}
location /server {
proxy_pass http://192.168.101.18:83/;
proxy_set_header username JACK;
proxy_set_header host $host;
}
}
被代理服务器 [192.168.101.18]
server {
listen 83;
server_name 127.0.0.1;
access_log logs/access.log main;
default_type text/plain;
location / {
return 200 $http_username=$http_host';
}
}
proxy_redirect
proxy_redirect 是 Nginx 服务器中用于处理代理请求重定向的指令。
在反向代理配置中,proxy_redirect 指令用于修改目标服务器返回的重定向响应中的Location头部信息。这样可以确保客户端在接收到重定向响应时,能够访问正确的URL。
语法 | proxy_redirect error_code http_status |
---|---|
默认值 | proxy_redirect default; |
位置 | http, server, location |
用途 | 重定向响应的URL和状态码 |
服务端[192.168.101.18]
server {
listen 85;
server_name 127.0.0.1;
location / {
root html;
index index.html;
}
}
代理服务端[192.168.101.23] 代理192.168.101.18
server {
listen 8083;
server_name 127.0.0.1;
location / {
proxy_pass http://192.168.101.18:85/;
proxy_redirect http://192.168.101.18/ http://192.168.101.23:8080/;
}
}
配置语法:proxy_redirect [redirect replacement];
- redirect:目标,Location的值
- replacement:要替换的值
proxy_redirect default;
- default;
- 将location块的uri变量作为replacement,
- 将proxy_pass变量作为redirect进行替换
请求处理流程
假设有一个客户端请求的流程:
客户端请求:
客户端向 http://example.com:8083/ 发起请求。
Nginx 接收到请求:
Nginx 在端口 8083 上监听到了这个请求,并根据 server_name 和 location / 的配置进行处理。
请求代理:
根据 proxy_pass 指令,Nginx 将这个请求转发(代理)到 http://192.168.101.18:85/
后端服务器响应:
假设后端服务器 192.168.101.18:85 返回一个重定向响应,响应头包含 Location: http://192.168.101.18/some/path。
Nginx 修改重定向响应:
根据 proxy_redirect 指令,Nginx 将 Location 头从 http://192.168.101.18/some/path 修改为 http://192.168.101.23:8080/some/path。
客户端接收到响应:
客户端收到 Nginx 修改后的重定向响应,并访问 http://192.168.101.23:8080/some/path,而不是直接访问 http://192.168.101.18/some/path。