制作docker下Nginx动态获取zuul地址的镜像笔记

        在使用spring cloud编程过程中,采用了nginx+zuul的负载均衡模式,缺省情况下需要将zuul服务地址写在nginx的配置文件中,在运用docker容器模式来部署应用时不能动态伸缩,在网上看到可以使用eureka注册zuul,在nginx中通过lua脚本自动获取zuul注册信息更新nginx反向代理服务器的模式实现,开始了以下实践,在此记录下来,共享交流。

        关于spring cloud编程,以及如何部署eureka和zuul不属本文记载内容,请自行学习。

        本文就如何在docker中制作nginx+Lua+dynamic_eureka_balancer进行详细记录。

        首先有一台可以联外网的linux服务器,本文中为ubuntu 16.04,在DMZ区,可直接访问外网。服务器上已安装好docker,并可正常使用。

        1. 获取ubuntu 16.04镜像。

        $ docker pull ubuntu:16.04

        16.04: Pulling from library/ubuntu
        7b8b6451c85f: Pull complete
        ab4d1096d9ba: Pull complete
        e6797d1788ac: Pull complete
        e25c5c290bde: Pull complete
        Digest: sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39
        Status: Downloaded newer image for ubuntu:16.04

        2.运行ubuntu镜像,开始构建需要的模块

        $ docker run --name ubuntu -it --network host ubuntu:16.04

        进入交互模式,直接使用宿主机的网络访问。

        3.更新系统,安装必须的模块

        如果下载更新慢,可先安装vim,修改/etc/apt/sources.list文件为国内aliyun镜像地址。

        # apt-get update

        # apt-get install -y make gcc  wget libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl

        4.创新安装目录

        # mkdir /usr/servers

        # cd /usr/servers

        5. 获取Openresty安装包及用于清缓存和健康检查包

        # wget https://openresty.org/download/openresty-1.13.6.2.tar.gz

        # wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz

        # wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz

        6. 解压文件包,编译生成LuaJIT,编译生成新的openresty,即nginx执行文件 

        # tar -xvf openresty-1.13.6.2.tar.gz

        # cd openresty-1.13.6.2/bundle

        # tar -xvf  ../../2.3.tar.gz

        # tar -xvf  ../../v0.3..0.tar.gz

        # cd LuaJIT-2.1-20180420

        # make clean && make && make install

        # cd /usr/servers/openresty-1.13.6.2

        # ./configure --prefix=/usr/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2  && make && make install

        # cd ..

        # ls -l

-rw-r--r--  1 root root   11717 Dec 27 01:51 2.3.tar.gz
-rw-r--r--  1 root root   22924 Dec 27 02:06 COPYRIGHT
drwxr-xr-x  2 root root    4096 Dec 27 02:06 bin
drwxr-xr-x  6 root root    4096 Dec 27 02:03 luajit
drwxr-xr-x  6 root root    4096 Dec 27 02:06 lualib
drwxr-xr-x  6 root root    4096 Dec 27 02:06 nginx
drwxrwxr-x  6 1000 1000    4096 Dec 27 02:00 openresty-1.13.6.2
-rw-r--r--  1 root root 4635916 May 14  2018 openresty-1.13.6.2.tar.gz
drwxr-xr-x 44 root root    4096 Dec 27 02:06 pod
-rw-r--r--  1 root root  224167 Dec 27 02:06 resty.index
drwxr-xr-x  5 root root    4096 Dec 27 02:06 site
-rw-r--r--  1 root root  136542 Dec 27 01:51 v0.3.0.tar.gz
        /usr/servers/luajit :luajit环境,luajit类似于java的jit,即即时编译,lua是一种解释语言,通过luajit可以即时编译lua代码到机器代码,得到很好的性能;
        /usr/servers/lualib:要使用的lua库,里边提供了一些默认的lua库,如redis,json库等,也可以把一些自己开发的或第三方的放在这;
        /usr/servers/nginx :安装的nginx,通过/usr/servers/nginx/sbin/nginx -V 查看nginx版本和安装的模块

        7. 检查安装结果

        # cd /usr/servers/nginx/sbin

        # ./nginx -V

nginx version: openresty/1.13.6.2
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/servers/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.13 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.5 --with-ld-opt=-Wl,-rpath,/usr/servers/luajit/lib --with-http_realip_module --with-pcre --add-module=/usr/servers/openresty-1.13.6.2/bundle/ngx_cache_purge-2.3 --add-module=/usr/servers/openresty-1.13.6.2/bundle/nginx_upstream_check_module-0.3.0 --with-stream --with-stream_ssl_module --with-http_ssl_module
        8. 下载lua功能包

        # wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http_headers.lua

        # wget https://raw.githubusercontent.com/pintsized/lua-resty-http/master/lib/resty/http.lua

       # wget https://github.com/SpringCloud/nginx-zuul-dynamic-lb/blob/master/dynamic_eureka_balancer.lua

       # exit

      以上已完成docker容器内ubuntu内nginx_lua相关内容的安装更新。

        9. 保存镜像

        $ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
8cbbbad008e6        ubuntu:16.04        "/bin/bash"         41 minutes ago      Exited (0) 7 seconds ago                       ubuntu

        $  docker commit 8cbbbad008e6 newnginx

        $ docker images

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
newnginx                 latest              9c6db2b4325e        7 seconds ago       513 MB
ubuntu                   16.04               a51debf7e1eb        5 weeks ago         116 MB
        10. 编写Dockerfile文件 ,生成自动运行的nginx镜像

        FROM newnginx

        EXPOSE 80

        CMD ["/usr/servers/nginx/sbin/nginx","-g","daemon off;"]

        $ docker build -t nginxzuul .

Sending build context to Docker daemon 563.9 MB
Step 1/4 : FROM newnginx
 ---> 9c6db2b4325e
Step 2/4 : MAINTAINER liquansheng
 ---> Running in ed27e715a2ca
 ---> 1c2280ab5e54
Removing intermediate container ed27e715a2ca
Step 3/4 : EXPOSE 80
 ---> Running in d494b2188024
 ---> 70d2fd67963f
Removing intermediate container d494b2188024
Step 4/4 : CMD /usr/servers/nginx/sbin/nginx -g daemon off;
 ---> Running in 68eae73a5537
 ---> 94d5da1fbf69
Removing intermediate container 68eae73a5537
Successfully built 94d5da1fbf69

        保存为本地文件,用于在测试或生产服务器上布署。
        $ docker save -o nginxzuul.tar nginxzuul

        11. 在docker中映射本地配置文件,实现利用eureka自动负载均衡zuul服务。

        编写nginx.conf文件 ,实现从Nginx服务的动态节点负载,Zuul集群横向扩展,在下文配置服务名与Eureka注册中心地址即可。

$ vi nginx.conf

## Nginx配置

http {
    #sharing cache area
    lua_shared_dict dynamic_eureka_balancer 128m;

    init_worker_by_lua_block {
        -- init eureka balancer
        local file = require "resty.dynamic_eureka_balancer"
        local balancer = file:new({dict_name="dynamic_eureka_balancer"})
        
        --eureka server list
        balancer.set_eureka_service_url({"127.0.0.1:8888", "127.0.0.1:9999"})
        
        --The service name that needs to be monitored
        balancer.watch_service({"zuul", "client"})
    }
    
    upstream springcloud_cn {
        server 127.0.0.1:666; # Required, because empty upstream block is rejected by nginx (nginx+ can use 'zone' instead)
        
        balancer_by_lua_block {    
        
            --The zuul name that needs to be monitored
            local service_name = "zuul"
            
            local file = require "resty.dynamic_eureka_balancer"
            local balancer = file:new({dict_name="dynamic_eureka_balancer"}) 
            
            --balancer.ip_hash(service_name) --IP Hash LB
            balancer.round_robin(service_name) --Round Robin LB
        }
    }

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass  http://springcloud_cn/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto  $scheme;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

12. 运行docke容器,将本地配置文件、静态页面文件、日志目录映射到服务中。

$ docker run --name nginxweb -d -p 80:80 -v /home/nginx/html:/usr/servers/nginx/html:rw -v /home/nginx/nginx.conf:/usr/servers/nginx/conf/nginx.conf:rw -v /home/nginx/logs:/usr/servers/nginx/logs:rw nginxzuul

 

附:aliyun本地更新的地址表文件 /etc/apt/sources.list

# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值