我正在构建一个由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
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()
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()]
body{
color: #FFFFFF;
background: #000000;
}
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;
}
}
}
答案 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的一个功能(重定向?)。无论哪种方式,此时都不是问题。