Я использую инфраструктуру Cherrypy 3.6.0. У меня проблема с длительной загрузкой страниц (для статических файлов требуется много времени), когда я открываю страницу в нескольких браузерах. В этом случае, например, файл bootstrap.min.css, который имеет 120 КБ, может загружать 5-10 секунд. Что еще хуже, статические файлы никогда не кэшируются, поэтому при каждой загрузке страницы статические файлы снова загружаются и снова за несколько секунд до загрузки страницы. Когда сервер реагирует 304 Не изменяется, он также занимает столько же времени, что и клиентская сторона получает этот ответ (нет разницы во времени ответа независимо от того, загружен ли статический файл или ответ сервера 304). Моя порция статической конфигурации файлов:Cherrypy, обслуживающий статические файлы, занимает много времени, когда страница открыта более чем в одном браузере, файлы никогда не загружаются из кеша
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
}
}
)
Я не могу понять, как это возможно, что извлечение файла 120KB может занять столько времени ... Может быть, кто-то может дать мне посоветовать, где я могу найти причину этой проблемы?
EDIT:
Заголовки:
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
В timining перекрытием у меня есть:
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 секунд ...
Недавно я ответил на аналогичный вопрос (http://stackoverflow.com/a/27486666/2072035) и пришел к выводу, что CherryPy кэширует файлы по умолчанию. «Кэши» в смысле отправки заголовков, которые позволяют браузеру кэшировать контент. 'tools.caching' для кэширования в процессе работы, я не думаю, что это хорошая идея для статического контента. Можете ли вы показать нам заголовки в оба конца для вашего 'bootstrap.min.css'. – saaj