1:webpy的简易web服务
目录 /data/webpy
结构
requirements.txt
run.py
run.sh
-static
-templates
(加”-”表示目录)
run.py
urls = [
"/", "_index",
"/json", "_json"
]
1:Location 中的 “/”
nginx的反向代理
http
upstream my_webpy {
server 127.0.0.1:8080;
}
server
location /webpy/{
proxy_pass http://my_webpy/;
# proxy_pass ;http:127.0.0.1:8080/
# the above both are right.
# cannot specify uri in prox_pass directive
}
上面的配置时正确的,并且是推荐的,/webpy/表示请求的是/webpy/目录下的文件。
proxy_pass http://my_webpy,表示在请求转发是以/作为根目录 如果没有最后一个”/”,则会以/webpy/即location中的uri作为根目录。
In a word,最后有”/”表示请求web服务的根目录,没有表示请求对应location 的根目录。
问题:如果是这样的配置
location /webpy{
proxy_pass http://my_webpy/;
}
即lcoation中少了一个”/”,那么譬如你请求 curl "127.0.0.1/webpy/"
那么nginx反向代理到webpy服务器的请求是 “//” ,没错,这是一个双//,因为这样表示的是将请求的/webpy映射到http:127.0.0.1:8080/。但是请求实际是/webpy/所以映射过来就是http:127.0.0.1:8080//
这种情况有两种解决方式,一是在nginx层做,改为推荐的配置,即第一个配置。另一点就是在webpy中做正则匹配,如
urls = [
"^/+$", "_index",
"^/+json$", "_json"
]
但是如果在urls中做的话,去请求静态资源(如果你的静态资源就放置在static目录下,而不是一个专门的静态资源服务器,并且你再html中使用了这样的相对路劲<script type='text/javascript' src="static/ajax.js"></script>)
那么你会发现html在请求静态资源时,webpy的日志时这样的
//static/ajax.js – 404 Not Found,
目前为了能正常访问我的js,css等,我是在nginx中做的。
Ajax.js
function send() {
req = {
"name": "percy",
"cip": "123.3.3.5"
}
$.ajax({
type: "POST",
url: "upass",
dataType: "json",
data: req,
success: function(data) {
alert(JSON.stringify(data.data))
}
})
}
在url这里有一个坑,
url: "/upass",这个表示当前服务的/upass,那么在单用webpy,不用nginx做反向代理是正确的,但是当使用nginx做反向代理是,这个ajax的请求是 “127.0.0.1/upass”,对比json的请求是”127.0.0.1/webpy/json”
如果配置成url: "upass",那么在使用反向代理或者不使用,直接访问webpy都是正常使用的。这猜测的原因哈:
url: "/upass”,表示当前服务器的根目录下的/upass,那么在有nginx的反向代理时,这个服务器指的是前面的nginx那么就是“127.0.0.1/upass”
url: "upass",表示当前服务的当前的目录下的upass,当前服务是nginx反向代理过来的/webpy/下所以是”127.0.0.1/webpy/json”
出现这些现象还有一个原因是这个的lcoation /webpy/却对应着后端的”/”,这其实不是一个规范的做法。最好就是location “/” 对应 “/”, location "/webpy/" 对应 “/webpy/”