前言
这篇文章没有详细去介绍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!