nginx/bottle python - 将请求路由到另一个端口

Die*_*ito 5 python port redirect nginx bottle

我已经找到了答案,我相信答案很简单,但我找不到它.我认为我缺乏对nginx的了解......

我的nginx实例在localhost:8080上运行,我的Bottle服务器在localhost:8081上运行.如果我从浏览器打开地址,它们工作正常,但当我尝试从我在localhost:8080上运行的应用程序访问时,我无法检索Bottle服务器生成的资源.

我需要做的是将对/ data/path的所有调用重定向到同一个域(localhost),而将另一个端口(8081)重定向到我的瓶子服务器正在监听的端口.

这是代码:Nginx:

server {
    listen       8080;
    server_name  localhost;
    root /Users/Diego/Desktop;

    location / {
        index  index.html index.htm;
    }

    location /data/ {
        proxy_pass http://127.0.0.1:8081;
    }
}
Run Code Online (Sandbox Code Playgroud)

瓶子服务器:

@route('/')
def printtest():
    print 'success'
    return 'loaded page'

@route('/<scenename>/data/<filename:path>')
def testMethod(scenename,filename):
    print scenename, filename

run(host='localhost', port=8081, debug=True)
Run Code Online (Sandbox Code Playgroud)

在浏览器中调用localhost:8080,显示通过nginx提供的页面,但是,如果我调用链接来检索存储在/data/directory/filename.json中的内容,则Bottle似乎不会收到请求.错误日志指出:

2013/04/16 18:50:52 [error] 3544#10612: *69 CreateFile() "C:/Users/Diego/Desktop/project1/data/directory/directory-varietal.json" failed (3: The system cannot find the path specified), client: 127.0.0.1, server: localhost, request: "GET /project1/data/directory/directory-varietal.json HTTP/1.1", host: "localhost:8081", referrer: "http://localhost:8080/project1/"
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何处理这种重定向/路由?

另外,有没有办法在nginx的日志中打印Feed?像命令print_entry或类似?

谢谢!

编辑:我试过这个但没有结果...... https://serverfault.com/questions/208656/routing-to-various-node-js-servers-on-same-machine

编辑:好一些改进,我发现可能是查询位置的问题.使用此块并请求.json文件,它实际上查询Bottle服务器.

location ~* \.(json)$ {
    proxy_pass http://localhost:8081;
}
Run Code Online (Sandbox Code Playgroud)

编辑:Yeee!我找到了一个解决方案......事实证明,该位置定义的路径存在问题.自我注意:请仔细阅读手册:http://wiki.nginx.org/HttpCoreModule#location

服务器的新代码:

server {
    listen       8080;
    server_name  localhost;
    root /Users/Diego/Desktop;

    location / {
        index  index.html index.htm;
    }

    location ~* /data/ {
        proxy_pass http://localhost:8081;
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,如果任何人有更好的解决方案或任何建议,那么欢迎更多的贡献.

Die*_*ito 3

编辑:是啊!我找到了解决办法...原来是location中定义的路径有问题。自我注意:仔细阅读手册:http://wiki.nginx.org/HttpCoreModule#location

服务器的新代码:

server {
  listen       8080;
  server_name  localhost;
  root /Users/Diego/Desktop;

  location / {
    index  index.html index.htm;
  }

  location ~* /data/ {
    proxy_pass http://localhost:8081;
  }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,如果有人有更好的解决方案或任何建议,欢迎贡献。

  • 这是它的工作原理。您的解决方案将 `~*` 添加到 nginx `location ~* /data/` 块。原始的“location /data/”与查询开头的文字字符串匹配。添加“~”使用正则表达式,“*”添加不区分大小写。这是必需的,因为 `/data/` 不会匹配 `GET /project1/data/directory/directory-varietal.json` 的开头,但正则表达式发现它没有问题。 (2认同)