Nginx 路由转发和反向代理 location 配置

1. Nginx 配置的三种方式

  • 第一种直接替换 location 匹配部分

  • 第二种 proxy_pass 的目标地址,默认不带 /,表示只代理域名,url 和参数部分不会变(把请求的 path 拼接到 proxy_pass 目标域名之后作为代理的URL)

  • 第三种 proxy_pass 的目标地址后增加 /,则表示把 pathlocation 匹配成功的部分剪切掉之后再拼接到 proxy_pass 目标地址

第二种对应标题 4. 普通代理的例子

第三种对应标题 3. 针对 location 截取代理路径的例子


2. location配置

location [ = | ~ | ~* | ^~ ] uri {...}

uri前面的方括号中的内容是可选项,解释如下:

"=":用于标准uri前,要求请求字符串与uri严格匹配,一旦匹配成功则停止

"~":用于正则uri前,并且区分大小写

"~*":用于正则uri前,但不区分大小写

"^~":用于标准uri前,要求Nginx找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配


3. 针对 location 截取代理路径的例子

例如下面的配置演示第三种配置方案,当我们访问 http://44.179.118.54:80/shop/xxx 的时候

访问的时候 Nginx 会把 /shop/ 截取掉然后把后面的 path 拼接到 proxy_pass

那么我们实际访问的就是: http://44.179.118.54:8007/xxx 这个服务。

第二个访问 http://44.179.118.54:8007/addrdata/xxx 实际就是访问 http://44.179.118.54:8007/xxx 这个服务。

这两种配置方式达到的效果都是一致的。

主要就是 proxy_pass 地址后面加 / 和不加 / 处理逻辑完全不一样。

 # shop-service
 # 反向代理shop-service服务
location ^~ /shop/ {
       proxy_pass  http://44.179.118.54:8007/;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_read_timeout 300s;

       proxy_redirect    off;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $http_host;
       proxy_next_upstream http_502 http_504 error timeout invalid_header;
}

# 这里的效果和上面配置的效果一致
location ~ ^/addrdata/(.*) {
       proxy_pass  http://44.179.118.54:8007/$1$is_args$args;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_read_timeout 300s;

       proxy_redirect    off;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $http_host;
       proxy_next_upstream http_502 http_504 error timeout invalid_header;
}

4. 普通代理的例子

这样我们访问 http://19.11.11.70:8888/test-api/xxx 实际就是访问 http://19.11.11.71:8088/test-api/xxx,就是帮 19.11.11.71:8088 端口做了一层代理

server {
    listen       8888;
    server_name  19.11.11.70;
    client_max_body_size     10240m; #修改成自己的想要设置的å44;13Hclient_body_timeout 6000s;
    client_header_timeout 600;
    client_body_buffer_size 128m;
    send_timeout 300s;
    keepalive_timeout 300s;

    location /test-api {
        proxy_pass  http://19.11.11.71:8088/test-api;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 300s;

        proxy_redirect    off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
    }
}

5. 配置前端的例子

# 根目录配置前端
# 前端放置目录 /home/java/nginx/cn_abd-app/abd-app
location / {
    root /home/java/nginx/cn_abd-app/abd-app/;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
}

# 非根目录配置前端
# 前端放置目录 /home/java/nginx/cn_bbd-app/bbd-app
location /bbd-app {
    root   /home/java/nginx/cn_bbd-app/;
    index  index.html index.htm;
    try_files $uri $uri/ /bbd-app/index.html;
}

# 非根目录配置二级路由前端
# 前端放置目录 /home/java/nginx/cn_bbd-app/app/bbd-app
location /app/bbd-app {
    root   /home/java/nginx/cn_bbd-app/;
    index  index.html index.htm;
    try_files $uri $uri/ /app/bbd-app/index.html;
}

# 非根目录配置hash路由前端
# 前端放置目录 /home/java/nginx/cn_bbd-app/share 
location /share {
    root /home/java/nginx/cn_bbd-app/;
    index index.html index.htm;
 }

6.配置前端二级路由详解

假设有一个域名挂载了我的服务器的根目录,当前根目录被别的应用使用了,这时候就要设置配置二级路由。

1、假设 https://www.baidu.com/net/tools/diy/ 这个域名的路径挂载了我们服务器的根目录。

2、我想用 https://www.baidu.com/net/tools/diy/app_web 这个地址能访问到我们的项目。

前端静态资源打包路径:/net/tools/diy/app_web/

前端放置目录:/home/java/nginx/web/app_web

PS:当然这里的前端放置目录可以修改成其他的,修改成其他的路径之后 location 部分做对应的修改即可

# 假设有一个域名挂载了我的服务器的根目录, 当前根目录被别的应用使用了, 这时候就要设置配置二级路由
# 前端静态资源打包路径: /net/tools/diy/app_web/
# 前端放置目录: /home/java/nginx/web/app_web
location /app_web {
    root   /home/java/nginx/web;
    index  index.html index.htm;
    try_files $uri $uri/ /app_web/index.html;
}
  • 11
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值