今天学习构建nginx镜像文件,通过portainer启动nginx和tomcat,实现用户请求的nginx所在的服务器进行转发到tomcat-ngx01或者tomcat-ngx02。效果如下图:
Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tomcat-spring{
server 10.108.3.134:8080;
server 10.108.3.111:8081;
}
server {
listen 0.0.0.0:80;
server_name _;
location / {
proxy_pass http://tomcat-spring;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffer_size 4K;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
可以看出,这里通过server节点的配置实现了监听80端口,“proxy_pass http://tomcat-spring;”表示对请求的处理交给了tomcat-spring,而tomcat-spring的具体配置如下:
upstream tomcat-spring{
server 10.108.3.134:8080;
server 10.108.3.111:8081;
}
即交给了url为tomcat-ngx-01:8080和tomcat-ngx-02:8081这两个server,8080代表10.108.3.134服务器上tomcat开启的8080端口,8081代表10.108.3.111服务器上tomcat开启的8081端口。
以上内容就是nginx的相关配置,接下来,我们看看如何制作nginx的镜像文件,也就是Dockerfile的具体内容:
首先,将原有系统中的nginx.conf文件删掉,需换成上述新建的nginx.conf即可,需要创建一个Dockerfile文件。具体内容如下:
#基础镜像
FROM nginx:stable
#作者
MAINTAINER spring [email protected]
#定义工作目录
ENV WORK_PATH /etc/nginx
#定义conf文件名
ENV CONF_FILE_NAME nginx.conf
#删除原有配置文件
RUN rm $WORK_PATH/$CONF_FILE_NAME
#复制新的配置文件
COPY ./$CONF_FILE_NAME $WORK_PATH/
#给shell文件赋读权限
RUN chmod a+r $WORK_PATH/$CONF_FILE_NAME
接下来,打开Xshell终端,在/usr/local下创建一个文件夹,将nginx.conf和Dockerfile两个文件上传上去(注意:该目录下仅有2个文件)。
创建命令:mkdir -p /usr/local/nginx-images
进入此目录,执行命令行:docker build -t nginx:1.17.9 .
注意:后面的1.17.9空格后面的点“ . ”不可缺少。
执行完后,再执行docker images,就能看到新的镜像文件了,如下图。
现在我们有了nginx的镜像,接下来要做的就是启动nginx容器,再本服务器上和另外一个服务器上启动分别启动两个tomcat容器,来实现负载均衡:
部署tomcat的方式这里就不重复演示,网上也有很多的教程参考,但需要注意一事项,若在同一台服务器上部署两台tomcat,需要更改端口及相关配置。否则另一台tomcat容器则无法启动。
启动nginx容器有两种方式,一个是用传统的docker run命令方式,另一种我们借助docker的图形工具protainer。本实战案例将继续使用portainer:
用浏览器打开portainer页面,打开后在左侧的Stacks菜单栏新建一个stack(Add Stack),如下图:
编写完docker-compose后,点击下面的“Deploy the stack”就可以了。docker-compose.yml文件如下:
version: '3.2'
services:
nginx:
image: nginx:1.17.9
ports:
- "80:80"
environment:
spring.cloud.inetutils.preferred-networks: 10.10.0
networks:
- portainer_agent_network
volumes:
- "/usr/local/nginx-images/nginx.conf:/etc/nginx/nginx.conf"
deploy:
replicas: 1
restart_policy:
condition: on-failure
labels: [type=basic]
placement:
constraints: [node.labels.type == master]
networks:
portainer_agent_network:
external: true
进行到这里,我们已经实现了 nginx+tomcat 实现负载均衡的效果。如果想要看到tomcat的负载效果,可以修改tomcat webapps下的ROOT里面的index.jsp便可看到效果了,访问服务器默认nginx的端口是80,这时会跳转到tomcat默认页,如下图。
在工作中,通常我们将war包分别部署在两个tomcat上,然后再访问“http://10.108.3.134”,这时来验证nginx已经将请求转发到了不同的tomcat上。
以上就是利用docker compose部署server负载均衡的实战,有一点问题大家可能也发现了,就是上面的案例tomcat启动都是单独来启动的,每次部署war包也会很麻烦,其实除了这种方式,我们也可以在Dockerfile中写命令将tomcat和war包复制到镜像中去,这样的话就可以通过docker的方式启动tomcat了,当然也可以尝试使用直接docker run -v 挂载目录的方式,如有兴趣的小伙伴们可以尝试下。
附件下载:基于docker的nginx.tar镜像