在使用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