如何在我的nginx + uwsgi环境中使用environ ['PATH_INFO']?

 Chickny的造梦空间 发布于 2023-01-19 12:21

我在/www/app.py中写了一个简单的瓶子应用程序.

import bottle

app = bottle.Bottle()
@app.route('/')
def index():
    return 'hello from bottle'

application=app

我已将我的nginx虚拟主机配置在名为/ etc/nginx/sites-enabled/foo的文件中:

server {
    listen 8080;
    root /www;
    index index.html index.htm;
    server_name foo;
    location / {
        uwsgi_pass 127.0.0.1:9090;
    }
}

我以这种方式启动nginx和uwsgi:

service nginx restart
uwsgi --socket 127.0.0.1:9090 --wsgi-file app.py

但是当我尝试访问时,我http://foo/在网页中收到此错误:

Critical error while processing request: /

我在uwsgi输出中得到这个错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.3/dist-packages/bottle.py", line 954, in wsgi
    out = self._cast(self._handle(environ))
  File "/usr/local/lib/python3.3/dist-packages/bottle.py", line 845, in _handle
    path = environ['bottle.raw_path'] = environ['PATH_INFO']
KeyError: 'PATH_INFO'

我怀疑可能是nginx + uwsgi环境没有为environ['PATH_INFO']我的应用程序提供价值,所以我写了一个裸WSGI应用程序来确认它.我将app.py中的代码替换为:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    print('----- begun environ -----')
    for k, v in environ.items():
        print('environ[{}] = {}'.format(k, v))
    print('----- ended environ -----')
    return [b'

Hello World

']

当然,我没有在uwsgi输出中看到PATH_INFO:

----- begun environ -----
environ[uwsgi.version] = b'2.0.2'
environ[HTTP_ACCEPT_ENCODING] = gzip, deflate
environ[HTTP_CACHE_CONTROL] = max-age=0
environ[wsgi.multithread] = False
environ[HTTP_HOST] = foo:8080
environ[wsgi.input] = 
environ[wsgi.url_scheme] = http
environ[HTTP_USER_AGENT] = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
environ[HTTP_ACCEPT_LANGUAGE] = en-US,en;q=0.5
environ[uwsgi.node] = b'nifty'
environ[wsgi.errors] = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
environ[wsgi.multiprocess] = False
environ[wsgi.run_once] = False
environ[wsgi.version] = (1, 0)
environ[HTTP_CONNECTION] = keep-alive
environ[HTTP_ACCEPT] = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
environ[wsgi.file_wrapper] = 
----- ended environ -----

我应该怎么做,以便我的应用程序或瓶子应用程序可以得到environ['PATH_INFO']

1 个回答
  • 根据您使用的服务器平台,应该有uwsgi_params配置文件在/etc/nginx目录中设置这些参数.您可以将它包含在您的nginx配置中,如下所示:

    server {
        listen 8080;
        root /www;
        index index.html index.htm;
        server_name foo;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9090;
        }
    }
    

    如果您没有此文件,这是我本地nginx服务器的内容,这可能对您有用:

    menno@mimic:/etc/nginx$ nginx -v
    nginx version: nginx/1.1.19
    
    menno@mimic:/etc/nginx$ cat uwsgi_params
    uwsgi_param     QUERY_STRING            $query_string;
    uwsgi_param     REQUEST_METHOD          $request_method;
    uwsgi_param     CONTENT_TYPE            $content_type;
    uwsgi_param     CONTENT_LENGTH          $content_length;
    
    uwsgi_param     REQUEST_URI             $request_uri;
    uwsgi_param     PATH_INFO               $document_uri;
    uwsgi_param     DOCUMENT_ROOT           $document_root;
    uwsgi_param     SERVER_PROTOCOL         $server_protocol;
    
    uwsgi_param     REMOTE_ADDR             $remote_addr;
    uwsgi_param     REMOTE_PORT             $remote_port;
    uwsgi_param     SERVER_PORT             $server_port;
    uwsgi_param     SERVER_NAME             $server_name;
    

    2023-01-19 12:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有