如何在提供静态文件时修复这种奇怪的Nginx / CherryPy行为?

时间:2015-03-29 16:24:45

标签: nginx configuration webserver cherrypy

我正在构建一个由CherryPy应用程序和一些静态文件(CSS,JavaScript,图像等)组成的网站。我使用Nginx作为反向代理来提供静态文件本身并为应用程序提供服务。我按照此处所述的配置进行了配置:How to Deploy Python WSGI Applications Using a CherryPy Web Server Behind Nginx

但是在尝试提供静态文件时,我从这个配置中得到了一个奇怪的行为。请求任何静态文件时,将返回应用程序的内容。例如,我有两个完全不同的文件wsgi.py,它们返回一个html文档和style.css。如果我导航到style.css,它就存在,但其内容的内容是应用程序的输出。

此外,在我尝试导航的任何地方,甚至是不存在的文件,返回的内容都是应用程序的内容。但如果我导航到localhost/static/*,我会收到404错误。其他任何地方(例如任何像localhost/asha9rghu/ay98394h/jasdhiuah这样的乱码)都会返回。

错误和访问日志表示在返回不需要的内容时一切正常。

以下是问题仍然存在的最简单形式的设置:

根目录

cherrypy_app
     |
     |----server.py
     |----wsgi.py
     |----style.css

server.py

from wsgi import application

import cherrypy

if __name__ == '__main__':

    cherrypy.tree.graft(application, "/")

    cherrypy.server.unsubscribe()

    server = cherrypy._cpserver.Server()

    server.socket_host = "0.0.0.0"
    server.socket_port = 8080
    server.thread_pool = 30

    server.subscribe()

    cherrypy.engine.start()
    cherrypy.engine.block()

wsgi.py

def website():
    website_html= """<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="/style.css" />
    </head>

    <body>
        <p>Cute bunny rabbits.</p>
    </body>
</html>"""
    return (website_html)

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')]
    return [website()]

的style.css

body{
    color:      #FFFFFF;
    background: #000000;
}

nginx.conf

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    upstream app_servers {

        server 127.0.0.1:8080;
    }

    server {
        listen 80;

        location ~ ^/(images|javascript|js|css|flash|media|static)/  {
            root /home/user/cherrypy_app;
        }

    }

        location / {
            proxy_pass         http://app_servers;
            proxy_redirect     off;
            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_set_header   X-Forwarded-Host $server_name;

        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题仅在于Nginx配置文件。解决方案只是创建一个或多个我指定的目录并将静态文件放入其中。

基本上,在配置文件中,我已经指定Nginx有许多目录(图像,javascript,等等),并且它们位于/ home / user / cherrypy_app。但事实上,这些目录不存在。因此,当Nginx收到其中一个目录中的文件请求时,它希望它们在那里,但它们不是。在这种情况下,Nginx会产生404错误。

#Specifies the existence of these directories
location ~ ^/(images|javascript|js|css|flash|media|static)/  {
    #specifies the location of the directories
    root /home/user/cherrypy_app;

当我尝试转到明确不存在的文件时,我不确定为什么会获得CherryPy应用程序的应用程序内容。也许这是CherryPy的一个功能(重定向?)。无论哪种方式,此时都不是问题。