通过Nginx我们可以实现反向代理,这也是我在项目中使用到的一个功能,那么什么是反向代理呢?我们用户对代理是无感知的,因为我们不需要进行任何配置就可以进行访问。我们只需要将请求发送至反向代理服务器,由反向代理服务器帮我们决定需要访问哪个资源并且将资源返回给我们。此时反向代理服务器和目标服务器对外就是服务器,但是只对外暴露了代理服务器的地址,目标服务器的地址是隐藏的。
正常情况下:在nginx配置文件中中设置了 location /api/
时 浏览器访问 /api/test
反向代理到后端服务后,后端服务接收到的url地址实际还是/api/test
需要实现的功能需求:访问url路径/api/test
经过nginx反向代理后,到达后端服务的实际url地址为/test
。
location ^~/api/ {
proxy_pass http://localhost:12345/;
}
需要注意和修改的是:在proxy_pass的最后加一个/即可。
修改完成后执行 nginx -s reload 刷新nginx配置文件,然后打开浏览器测试即可
比如把/gatway/api/test
转发到后端是/test
location ^~/gateway/api/ {
add_header Cache-Control 'no-store';
client_max_body_size 100m;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
proxy_connect_timeout 1;
proxy_send_timeout 20;
proxy_read_timeout 30;
proxy_pass http://192.168.0.88:8208/;
}
location /WW_verify_U2CnZvzr2lMh0HaI.txt{
root /usr/local/packages;
}
location = /time2 {
default_type application/json;
add_header 'Access-Control-Allow-Origin' '*';
autoindex_localtime on;
add_header 'Access-Control-Allow-Credentials' 'true';
return 200 '{"code":0,"year":"2022","month":"05","day":"31","hour":"11","minute":"20","second":"21"}';
}
这个结果说明代理的时候,按照请求路径中的/api匹配到了对应的代理,代理到服务端的时候,把请求的ip和port替换为代理服务的ip和port,而对应的uri则完全没有变化,是整体的复制过去。
请求nginx:http://192.168.0.105:8087/api/system/common/doLogin
Nginx代理替换之后:http://192.168.0.105:8089/api/system/common/doLogin
代理过程:将图中红色部分替换为绿色部分,其他都不变,然后发送到服务端:
location后的路径为“/api”,代理服务的上下文为“/”(http://192.168.0.105:8089/),看下图:
服务端接收的uri为:
这个结果说明按照请求路径中的/api匹配到了对应的代理之后,把请求中的“/api”替换为代理服务上下文路径“/”,“/api”之后的路径不变,替换如下:
请求nginx:http://192.168.0.105:8087/api/system/common/doLogin
Nginx代理替换之后:http://192.168.0.105:8089/ /system/common/doLogin
代理过程:将红色的部分替换为绿色的部分,其他都不变,然后发送服务端:
location后的路径为“/api/”,代理服务的上下文为空(http://192.168.0.105:8089),看下图:
服务端接收的uri为:
这个结果和情况一是一样的,按照请求路径中的/api/匹配到了对应的代理,代理到服务端的时候,把请求的ip和port替换为代理服务的ip和port,而对应的uri则完全没有变化,是整体的复制过去。
请求nginx:http://192.168.0.105:8087/api/system/common/doLogin
Nginx代理替换之后:http://192.168.0.105:8089/api/system/common/doLogin
location后的路径为“/api/”,代理服务的上下文为“/”(http://192.168.0.105:8089/),看下图:
服务端接收的uri为:
这个结果说明和情况二是一样的,按照请求路径中的/api/匹配到了对应的代理之后,把请求中的“/api/”替换为代理服务上下文路径“/”,“/api/”之后的路径不变,替换如下:
请求nginx:http://192.168.0.105:8087/api/system/common/doLogin
Nginx代理替换之后:http://192.168.0.105:8089/system/common/doLogin
代理过程:将红色部分替换为绿色部分,其他部分不变:
location /exam/api {
add_header Cache-Control 'no-store';
client_max_body_size 100m;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
proxy_connect_timeout 1;
proxy_send_timeout 20;
proxy_read_timeout 30;
##proxy_pass http://192.168.0.88:8208;
#proxy_pass http://192.168.0.44:8082/;
#proxy_pass http://web_rtc:8082/;
proxy_pass http://192.168.0.88:8101;
#proxy_pass http://192.168.0.55:9001;
}
location /exam{
alias /usr/local/packages/edevp-exam/web/;
#root /usr/local/packages/edevp-exam/web;
#try_files $uri $uri/ @rewrite;
try_files $uri $uri/ /exam/index.html;
index index.html;
charset utf-8,gbk; # 避免中文乱码
}
Nginx不仅可以实现反向代理,还能实现正向代理,那么什么是正向代理呢?前面说到反向代理我们是无感知的,我们并不知道我们需要访问的目标,我们只是知道代理的地址。而正向代理则不同,我们是很清楚我们需要访问的目标的,但是访问过程中出现了一个代理去帮我们完成这个请求并将结果返回。 此时服务器只知道请求来自哪个代理服务器,而不知道是哪个客户端发起的请求,正向代理模式屏蔽或者隐藏了真实客户端的信息。
Nginx提供了六种不同的负载均衡策略,分别为:
location ~ /item/(\d+) {
}
- ~ 表示正则匹配
- **()**表示一个分组
- \d表示数字
- + 表示任意数量
参考:https://www.toutiao.com/article/7206699270601376296/?log_from=f0bb656c0aa24_1678347456537
upstream backend {
server 192.168.0.1:8080;
server 192.168.0.2:8080;
server 192.168.0.3:8080;
}
server {
listen 80;
server_name example.com;
# 用户ID在灰度发布组1中
if ($cookie_gray_release_group = "1") {
set $backend "http://192.168.0.2:8080";
}
# 用户ID在灰度发布组2中
if ($cookie_gray_release_group = "2") {
set $backend "http://192.168.0.3:8080";
}
# 其他情况
if ($cookie_gray_release_group = "") {
set $backend "http://192.168.0.1:8080";
}
location / {
proxy_pass $backend;
}
}
默认登录用户名:admin
初始密码为:admin