zoukankan      html  css  js  c++  java
  • docker +haproxy+python web

    1、python web 端的dockerfile

    FROM python:2.7
    WORKDIR /code
    ADD . /code
    EXPOSE 80
    CMD python index.py

    2、index.py 网站首页py文件

    #!/usr/bin/python
    
    import sys
    import BaseHTTPServer
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    import socket
    import fcntl
    import struct
    import pickle
    from datetime import datetime
    from collections import OrderedDict
    
    class HandlerClass(SimpleHTTPRequestHandler):
        def get_ip_address(self,ifname):
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            return socket.inet_ntoa(fcntl.ioctl(
                s.fileno(),
                0x8915,  # SIOCGIFADDR
                struct.pack('256s', ifname[:15])
            )[20:24])
        def log_message(self, format, *args):
            if len(args) < 3 or "200" not in args[1]:
                return
            try:
                request = pickle.load(open("pickle_data.txt","r"))
            except:
                request=OrderedDict()
            time_now = datetime.now()
            ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
            server = self.get_ip_address('eth0')
            host=self.address_string()
            addr_pair = (host,server)
            if addr_pair not in request:
                request[addr_pair]=[1,ts]
            else:
                num = request[addr_pair][0]+1
                del request[addr_pair]
                request[addr_pair]=[num,ts]
            file=open("index.html", "w")
            file.write("<!DOCTYPE html> <html> <body><center><h1><font color="blue" face="Georgia, Arial" size=8><em>HA</em></font> Webpage Visit Results</h1></center>");
            for pair in request:
                if pair[0] == host:
                    guest = "LOCAL: "+pair[0]
                else:
                    guest = pair[0]
                if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d %H:%M:%S')).seconds < 3:
                    file.write("<p style="font-size:150%" >#"+ str(request[pair][1]) +": <font color="red">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color="blue">"+guest+"</font>&gt to WebServer &lt<font color="blue">"+pair[1]+"</font>&gt</p>")
                else:
                    file.write("<p style="font-size:150%" >#"+ str(request[pair][1]) +": <font color="maroon">"+str(request[pair][0])+ "</font> requests " + "from &lt<font color="navy">"+guest+"</font>&gt to WebServer &lt<font color="navy">"+pair[1]+"</font>&gt</p>")
            file.write("</body> </html>");
            file.close()
            pickle.dump(request,open("pickle_data.txt","w"))
    
    if __name__ == '__main__':
        try:
            ServerClass  = BaseHTTPServer.HTTPServer
            Protocol     = "HTTP/1.0"
            addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
            port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
            HandlerClass.protocol_version = Protocol
            httpd = ServerClass((addr, port), HandlerClass)
            sa = httpd.socket.getsockname()
            print "Serving HTTP on", sa[0], "port", sa[1], "..."
            httpd.serve_forever()
        except:
            exit()

    3、index.html 空文件

    4、haproxy.cfg 配置文件

    global
      log 127.0.0.1 local0
      log 127.0.0.1 local1 notice
    
    defaults
      log global
      mode http
      option httplog
      option dontlognull
      timeout connect 5000ms
      timeout client 50000ms
      timeout server 50000ms
    
    listen stats
        bind 0.0.0.0:70
        stats enable
        stats uri /
    
    frontend balancer
        bind 0.0.0.0:80
        mode http
        default_backend web_backends
    
    backend web_backends
        mode http
        option forwardfor
        balance roundrobin
        server weba weba:80 check
        server webb webb:80 check
        server webc webc:80 check
        option httpchk GET /
        http-check expect status 200

    5、docker-compose.yml 文件

    weba:
      build: ./web
      expose:
        - 80
    
    webb:
      build: ./web
      expose:
        - 80
    
    webc:
      build: ./web
      expose:
        - 80
    
    haproxy:
      image: haproxy
      volumes:
        - /opt/compose-haproxy-web/haproxy:/haproxy-override
        - /opt/compose-haproxy-web/haproxy:/usr/loacl/etc/haproxy
      links:
        - weba
        - webb
        - webc
      ports:
        - "81:80"
        - "71:70"
      expose:
        - "80"
        - "70"

    路径结构

     在compose-haproyx-web 目录下 执行docker-compose up 来启动项目

  • 相关阅读:
    python之各种包
    正则表达式
    import/模块的导入
    迭代器/可迭代对象/生成器
    Day2 列表list
    Day1 字符串格式化
    Day1 字符编码及编码函数
    Python 学习笔记 之 随着学习不断更新的Python特性搜集
    Day1 input&print
    Newtonsoft.Json日期转换
  • 原文地址:https://www.cnblogs.com/plefan/p/13748604.html
Copyright © 2011-2022 走看看