20190416 为什么要了解nginx配置中的location配置

前言

这篇文章没有详细去介绍nginx配置中的location的配置,而是以工作中遇到的问题来简单讲下nginx location配置的作用,主要是由于自己对其不理解导致的困惑,以此告诫自己要去学习location配置的规则。

正文

前因

昨天在看之前前段时间自己写的一个接口服务,又看了看nginx中location的相关配置,有点疑惑。

我的接口服务是部署在tomcat容器的java war程序,这里命名为XxxWxService吧。

由于是提供给微信小程序调用的,而微信小程序如果要上线则必须通过域名(这里假设域为xxxyyy.com)访问并且以https的方式访问,解决方法之一是通过nginx做转发。因此在nginx配置文件中有这样的设置:

location ^~ XxxWxService {
	proxy_pass http://127.0.0.1:8080/XxxWxService;
}

如此,就可以通过https的方式访问接口了,如:https://xxxyyy.com/XxxWxService/test1

当时,提出要求说要对传输数据进行加密,因此前后端又做了对称加密处理,测试时建了另外一个服务——XxxWxService2(访问地址如:https://xxxyyy.com/XxxWxService2/test1)。

我的疑惑

微信小程序端调接口时,接口地址是这么写的(能正常访问),如:
https://xxxyyy.com/XxxWxService2/test1

可是,明明在nginx中没有下面这样的配置:

location ^~ XxxWxService {
	proxy_pass http://127.0.0.1:8080/XxxWxService2;
}

为什么这个https的url请求 https://xxxyyy.com/XxxWxService2/test1 还是能被正确的转发到了8080端口上?

原因

寻思无果,请教管理服务器的同事,才知道原来是我对nginx配置中location配置中的^~理解有误。
他给了我一个例子:
在这里插入图片描述
也就是说不管我调用的接口地址(区别:服务名不同)是
https://xxxyyy.com/XxxWxService/test1
还是
https://xxxyyy.com/XxxWxService2/test1
nginx都会把其中的
https://xxxyyy.com/XxxWxService
部分替换成
http://127.0.0.1:8080/XxxWxService
再把剩余部分给拼接上去,剩余的部分分别指:
/test1

2/test1
因此,拼接之后得到的完整url是:
http://127.0.0.1:8080/XxxWxService/test1

http://127.0.0.1:8080/XxxWxService2/test1

访问https://xxxyyy.com/XxxWxService2/test1一样能被nginx转发到 http://127.0.0.1:8080/XxxWxService2/test1

关联

我又想起前段时间也因nginx location配置导致图片资源访问不了的问题。

假设我的java服务名为XxxService,那么在wwwroot下建了一个XxxServicePic,里面存放图片资源。这样照理说,通过http:xxxyyy.com/XxxServicePic/a.png就能够访问到该图片资源,可是结果却报了404错误。

负责管理服务器的同事告诉我是因为location配置的问题:

        location ^~ /XxxService {
                proxy_set_header  Host            $host;
                proxy_set_header  X-Real-IP        $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_pass http://127.0.0.1:8080;
        }

location是这么配置的,导致访问http:xxxyyy.com/XxxServicePic/a.png会被转发为http://127.0.0.1:8080/XxxServicePic/a.png,自然而言也就报了404错误了。

修改很简单,把原本的location这一行的末尾加个斜杠符号即可:

location ^~ /XxxService/

最后

本文举了两个例子,都是因为对nginx location不理解导致的。nginx很强大,可以做代理转发。
如将使用443端口的https请求转发到8080端口上,如在没有开放8080端口的服务器上通过nginx代理转发到tomcat容器里,可以处理端口不一致导致的跨域问题。

只学不用总是让人没动力学习,因此分享这篇文章,告诉自己告诉大家为什么要去学习了解nginx location的配置。

附上两篇感觉介绍nginx location挺不错的文章:
https://blog.csdn.net/heiyueya/article/details/70149270
http://m.php.cn/article/406202.html

that’s all!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值