最近同事们在搞一个nginx的配置下发接口,项目用tornado redis yaml来实现,我这里就簡單分享下关于nginx配置api实现。


#coding:utf-8
#xiaorui.cc
import tornado.httpserver
import yaml
import tornado.gredis
import tornado.ioloop
import tornado.web
import redis
import gevent
from gevent.queue import Queue, Empty
from gevent.pool import Group
from gevent import getcurrent
from gevent.coros import BoundedSemaphore
# define one "add" 在模板传递两个数,他会自己做运算,这个和jinja2的filter很像
def add(x, y):
    return (x+y)
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        print self.get_argument('nginxid')
        f=open('%s.yaml'%self.get_argument('nginxid'))
        ldata=yaml.load(f)
        f.close()
        print ldata
        items = ["item1","item2","item3"]
        # 可以直接传递list和字典                                               
        self.render("templates/nginx.upstream", items=items, add=add,ldata=ldata)
application = tornado.web.Application([
    (r"/nginxupstream", MainHandler),
])
if __name__ == "__main__":
     http_server = tornado.httpserver.HTTPServer(application)
     http_server.listen(8889)
     tornado.ioloop.IOLoop.instance().start()


后端的模板程序:

upstream {{ ldata['upstream_name'] }} {                                         
    {{ ldata['upstream_mode'] }};
    {% for i in ldata['upstream_rs'] %}
    {% if i['server_info']['kp'] %}keepalive {{ i['server_info']['kp'] }};{% end %}
    {% for a in i['server_info']['rs'] %}
    server {{ a['real_server']['ip'] }} {{ a['real_server']['port'] }};
    {% end %}
    {% end %}
}



通过tornado的api 去做get请求,返回的不同主机的 nginx upstream的操作块配置。


wKioL1NGCluzKqofAADTHgA0_OI044.jpg



wKiom1NGCq-Rv1X3AAFY2Phmyug187.jpg


这里是服务器端的日志打印情况。可以看到yaml loads之后,他就是一个很大的json串 。


wKiom1NGCsHjAjlXAAdtnBJuOOY594.jpg


已经把很多服务器nginx的upstream集群池配置导入到了yaml配置里面。python提供了好用的模块,可以舒服的针对yaml增删改查。

wKioL1NGCrKhtMq1AASc4RjEbg8031.jpg


咱们来看看nginx的yaml的格式,配置。 你自己可以做更多的扩展,比如在upstream里面的backup,max_fails,fail_timeout等参数。

wKioL1NGC9uCbWqWAANjBswesOc789.jpg

原文:http://rfyiamcool.blog.51cto.com/1030776/1393371


这样的方式下发配置,还是很靠谱的,最少我已经把lvs、nginx的配置应用进去了。

其他的想法,这个方法可以用在saltstack上面的,看到我写的关于salt lvs的文章,大家会有思路的。不想用yaml的话,可以换成mongodb做。对于平台来说,mongodb更方便的。