Tornado中可能遇到的问题

Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。


1.遇到 404 的时候能够触发我自己声明的 write_error 函数,然而 write_error 并没有生效,输出的是 tornado 默认的 404 页面。

解决方案:RequestDispatcher 在没有找到 handler 默认设置将 handler 为 ErrorHandler,
如果指定了 default_handler_class ,就使用 default_handler_class 。
说白了 404 错误就是路由不匹配,
可以看到 ErrorHandler 继承自 RequestHandler 而并非自定义的 BaseHandler 类
所以即使你在 BaseHandler 中定义了 write_error 方法, ErrorHandler 中也不会有 write_error 的处理逻辑

2.网络异常重启引起的 TorMySQL 的并发过高,失去平缓峰值的作用。导致峰值直接击穿 MySQL

解决方案:
1.调低了连接池最大连接数
2.做几台主从,读写分离
3.在tornado中加了一个hook,在重启前add_reload_hook中增加了一个release的函数

    def release():
    from lib.query import _mysql_server
    for key in _mysql_server:
        db = _mysql_server[key]
        db.close()

    def run():
        application_settings = {
            'handlers': urls,
            'debug': DEBUG,
        }
        application = tornado.web.Application(**application_settings)
        options.parse_command_line()

        init_log(options.log_dir)
        application.listen(options.port)
        io_loop = tornado.ioloop.IOLoop.instance()

        # 这段代码是解决autoreload造成连接数没有断开的问题
        tornado.autoreload.add_reload_hook(release)
        tornado.autoreload.start(io_loop)

        io_loop.start()

URL:https://www.v2ex.com/t/262338

3.使用了代理后发现获取到的IP是127.0.0.1或是服务器端IP

解决方案:

Tornado支持通过x-real-ip或x-forwarded-for来获取IP,
        但前提是需要在你的HTTPServer实例中增加xheaders=True参数
        http_server = HTTPServer(Application(), xheaders=True) 
        或 application.listen(8080, xheaders=True)
        nginx配置x-forwarded-for时只需在反向代理规则中增加一行:
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

4.在settings里面配置好static_path后,编写代码这样是没有问题的,图片可以正常显示。但是如果图片属性是在单独的css文件中定义了,background: url(‘{{static_url(“img/button_go.gif”)}}’) repeat-x left top; 就不行.

解决方案:CSS只是被HTML文件引用,是在用户的浏览器上被载入,
没有经过tornado模板引擎的处理,{{static_url(“img/button_go.gif”)}}是不会被转换成文件的实际地址的。
直接设置 相对路径 ,或避免css文件中出现image属性


青冥有晓月

你可能感兴趣的:(python)