【问题标题】:How do I fix this strange Nginx / CherryPy behaviour when serving static files?在提供静态文件时如何解决这种奇怪的 Nginx / CherryPy 行为?
【发布时间】:2015-06-02 14:37:59
【问题描述】:

我正在构建一个由 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;

        }
    }
}

【问题讨论】:

    标签: nginx configuration webserver cherrypy


    【解决方案1】:

    问题仅在于 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 的一个特性(重定向?)。无论哪种方式,目前都不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2011-07-22
      • 1970-01-01
      • 2013-05-08
      • 2016-01-28
      • 2015-03-18
      • 2014-01-12
      • 2018-10-23
      相关资源
      最近更新 更多