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

Posted

技术标签:

【中文标题】nginx/bottle python - 将请求路由到另一个端口【英文标题】:nginx/bottle python - route request to another port 【发布时间】:2013-04-09 15:39:23 【问题描述】:

我一直在寻找答案,我相信答案很简单,但我找不到。我认为由于我对 nginx 的了解不足......

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

我需要做的是将所有对 /data/ 路径的调用重定向到同一个域 (localhost) 但另一个端口 (8081),即我的 Bottle 服务器正在侦听的端口。

代码如下: 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;
    

瓶服务器:

@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)

在浏览器中调用 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/"

谁能告诉我如何处理这种重定向/路由?

另外,有没有办法从 nginx 打印日志中的提要?像命令 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;

编辑:耶​​!我找到了解决方案……原来是该位置定义的路径有问题。自我提醒:仔细阅读手册: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;
    

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

【问题讨论】:

很高兴听到您解决了这个问题——感谢您回来发布解决方案! @Dieghito,请发布您的更新作为正确答案。可以回答您自己的问题。 我对您描述中的端口与您的代码感到困惑。您说 nginx 实例在 localhost:8080 上运行,而我的 Bottle 服务器正在侦听 localhost:8081 ,但 nginx 配置显示 listen 8081; 和 bottle port=8080 感谢,已编辑并修复 【参考方案1】:

编辑:耶​​!我找到了解决方案……原来是该位置定义的路径有问题。自我提醒:仔细阅读手册: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;
  

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

【讨论】:

这是它的工作原理。您的解决方案将 ~* 添加到 nginx location ~* /data/ 块。原始的location /data/ 匹配查询开头 处的文字字符串。添加~ 使用正则表达式,而* 添加不区分大小写。这是必需的,因为 /data/ 不会匹配 GET /project1/data/directory/directory-varietal.json 的开头,但正则表达式发现它没有问题。 是的,这正是我从这次经历中学到的!事实上,我不得不添加更多规则,并且我遵循了这个原则。感谢您的评论和解释! 值得检查一下,proxy_pass 中的端口号后是否需要一个斜杠。这让我们有一段时间有点沮丧!

以上是关于nginx/bottle python - 将请求路由到另一个端口的主要内容,如果未能解决你的问题,请参考以下文章

将 *** 与 python 请求一起使用

Python 将 Ajax 请求与正常页面视图分开

如何使用python请求将经过身份验证的POST请求编码到API?

如何将此curl语句转换为python请求?

python+requests——高级用法——将请求打包

将字典嵌套到 JSON 以用于 POST 请求 Python