我正在使用Cherrypy3.6.0框架。当我在多个浏览器中打开页面时,加载页面的时间很长(提供静态文件需要很长的时间),我遇到了问题。例如,在这种情况下,120 10的bootstrap.min.css文件可以加载5-10秒。更糟糕的是,静态文件从来不被缓存,所以每次加载页面时,静态文件都会再次加载,页面加载需要几秒钟的时间。当服务器响应304未修改时,在客户端接收此应答之前也需要相同的时间(无论是加载静态文件还是服务器响应304,响应时间都没有差异)。我的服务静态文件配置:
cherrypy.tree.mount(None, '/static', config={
'/': {
'tools.staticdir.on': True,
'tools.staticdir.dir': static_dir,
'tools.sessions.on': False,
'tools.caching.on': True,
'tools.caching.force' : True,
'tools.caching.delay' : 0,
'tools.expires.on' : True,
'tools.expires.secs' : 60*24*365
}
}
)我不明白为什么抓取120 so的文件会花费这么多时间.也许有人能给我建议,我能在哪里找出这个问题的原因?
编辑:
标题:
Remote Address:192.168.100.100:80
Request URL:http://192.168.100.100/static/css/bootstrap.min.css
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:text/css,*/*;q=0.1
Accept-Encoding:gzip, deflate, sdch
Accept-Language:pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:session_id=.......................................
Host:192.168.100.100
If-Modified-Since:Mon, 22 Dec 2014 12:30:51 GMT
Referer:http://192.168.100.100/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Response Headersview source
Date:Fri, 14 Jan 2000 23:51:25 GMT
Server:CherryPy/3.6.0
Vary:Accept-Encoding在挖掘重叠时,我有:
Stalled: 9.619ms
Request sent: 0.171ms
Waiting (TTFB): 5.02s
Content download: 1.000ms 我检查了什么是TTFB,这是从发出HTTP请求的虚拟用户到浏览器接收的页面的第一个字节的持续时间。所以服务器响应有问题..。
EDIT2:
我已经创建了最小的应用程序,它只加载静态文件和问题仍然发生。这是应用程序代码:
服务器:
import cherrypy
def start():
import app
app.application()
cherrypy.config.update({'server.socket_host': '0.0.0.0', 'server.socket_port': 9061 })
engine = cherrypy.engine
engine.autoreload.unsubscribe()
try:
engine.start()
except:
sys.exit(1)
else:
engine.block()
if __name__ == '__main__':
start()应用程序:
import cherrypy
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('/tmp/cherry/'))
static_dir = '/media/vbox_shared/new_web/app/static'
class Test(object):
@cherrypy.expose
def index(self):
template = env.get_template('test.html')
return template.render()
def application():
cherrypy.tree.mount(Test(), '/', config = {})
cherrypy.tree.mount(None, '/static', config={
'/': {
'tools.staticdir.on': True,
'tools.staticdir.dir': static_dir
}
})html:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<link rel="stylesheet" href="/static/css/style.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/chosen.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/jquery.jgrowl.min.css"/>
<link rel="stylesheet" href="/static/css/m-buttons.min.css"/>
<title>Streams</title>
<title>test</title>
</head>
<body>
<h1>test</h1>
<script src="/static/js/jquery-1.11.1.min.js"></script>
<script src="/static/js/jstree.min.js"></script>
<script src="/static/js/functions.js"></script>
<script src="/static/js/stream.js"></script>
<script src="/static/js/chosen.jquery.min.js"></script>
<script src="/static/js/chosen.proto.min.js"></script>
<script src="/static/js/jquery.jgrowl.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>指向截图的链接:
http://i58.tinypic.com/21m8ar5.png http://i60.tinypic.com/euh6p0.png
EDIT3:
我已经将我的应用程序简化为:
import cherrypy
class HelloWorld(object):
def index(self):
return """
<html>
<head>
<link rel="stylesheet" href="/static/css/style.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/chosen.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/jquery.jgrowl.min.css"/>
<link rel="stylesheet" href="/static/css/m-buttons.min.css"/>
<title>Streams</title>
<title>test</title>
</head>
<body>
<h1>test</h1>
<script src="/static/js/jquery-1.11.1.min.js"></script>
<script src="/static/js/jstree.min.js"></script>
<script src="/static/js/chosen.jquery.min.js"></script>
<script src="/static/js/chosen.proto.min.js"></script>
<script src="/static/js/jquery.jgrowl.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>"""
index.exposed = True
conf = {
'/static':
{
'tools.staticdir.on': True,
'tools.staticdir.dir':'/media/vbox_shared/new_web/app/static'}
}
cherrypy.config.update({'server.socket_host': '0.0.0.0', 'server.socket_port': 9066 })
cherrypy.quickstart(HelloWorld(), config=conf)问题还在发生。当我打开IE,FF,Safari和Chrome的主页-一些静态文件加载超过10秒.
发布于 2014-12-23 10:10:54
您一定遗漏了一些标头和一些配置。CherryPy只为gzipped响应发送Vary: Accept-Encoding。通常它会发送Last-Modified、Content-Type、Content-Length等。还请注意,Cache-Control: max-age=0意味着您要执行一个请求刷新请求,请求服务器验证资源。
在the answer中,我在注释中链接到,通常304不修改只会花费CherryPy一个即时的os.stat调用,除非磁盘坏了。
我建议您在同一个静态目录上运行一个单独的CherryPy应用程序,只打开tools.staticdir,以避免可能出现的错误配置、会话锁定问题等。然后逐步添加配置并测量响应时间,例如使用Apache的ab -c 10 -n 1000 http://192.168.100.100/static/css/bootstrap.min.css。
https://stackoverflow.com/questions/27603945
复制相似问题