使用docker部署多个nginx站点并配置负载均衡

news/2024/7/10 2:24:58 标签: nginx, docker, 负载均衡

项目前端部署在docker。该前端有时会出现无法访问,重启docker容器后又可以。猜测是不是单个docker容器压力过大,就想引入负载均衡试试效果。

一、负载均衡的好处

负载均衡跟集群结合效果才好,docker容器分布于不同的服务器。但我们没有这个条件。不过,同一份程序,多部署几个docker容器,我猜测多少会有点好处:
1)减少单点故障风险
2)如果docker容器有连接数限制,则多个容器可以减轻压力
3)减轻单个容器运算压力

二、部署

1、部署结构

部署3个docker容器,一个负责转发,做负载均衡服务器;其余两个是应用的前端。负载均衡服务器会根据一定的规则将用户请求分摊到每个前端头上。
在这里插入图片描述

docker_12">2、创建负载均衡docker容器

为方便更新,创建容器时采用挂载宿主机文件夹的方式。从脚本可知,外置了nginx的配置文件,日志。

sudo docker run --name nginx-szdata-lb --privileged -it -p 80:80 \
-v /home/admin/szdata/nginx/conf/lb.conf:/etc/nginx/nginx.conf:ro \
-v /home/admin/szdata/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
-v /home/admin/szdata/nginx/logs:/var/log/nginx \
-d nginx

docker_22">3、创建应用前端的docker容器

类似地,有:
1)应用1

sudo docker run --name nginx-szdata-web1 --privileged -it -p 8001:80 \
-v /home/admin/szdata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /home/admin/szdata/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
-v /home/admin/szdata/web:/usr/share/nginx/html:rw \
-v /home/admin/szdata/nginx/logs:/var/log/nginx \
-d nginx

2)应用2

sudo docker run --name nginx-szdata-web2 --privileged -it -p 8002:80 \
-v /home/admin/szdata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /home/admin/szdata/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
-v /home/admin/szdata/web:/usr/share/nginx/html:rw \
-v /home/admin/szdata/nginx/logs:/var/log/nginx \
-d nginx

可见应用1和应用2都使用了同一份程序代码。

三、配置

1、配置文件概况

lb.conf,负载均衡服务器配置;nginx.conf,应用的配置。
在这里插入图片描述
conf.d/default.conf是一份公共配置。每个nginx容器如果想使用这份公共配置的话,引入就好。当然也可以不用。

include /etc/nginx/conf.d/*.conf;

在这里插入图片描述

2、负载均衡服务器的配置

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

	# 以下内容是重点
    upstream szdata-web{
	   server 192.168.175.128:8001;
	   server 192.168.175.128:8002;
    }
    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;    
    	
        location / {
    	  proxy_pass http://szdata-web;
    	}
    }
}

szdata-web,自己起的名字。

3、应用的配置

1)nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

}

2)conf.d/default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

四、conf.d

如上所述,conf.d/default.conf是公共配置片段,里面内容只有一个“server”。我有时装的nginx,有这个东东,有时又没有。也没啥,知道是公共片段,用作引用就好。不引用,无非就多写点冗余代码而已。

五、docker部署nginx的优越性
采用docker部署nginx,实在方便,启动、停止,都很爽。如果直接跑在操作系统下,想停止、重启就麻烦了,需要杀掉相关进程。

不过,要结合挂载方式才能体现该优越性。否则配置文件也跟着删掉。

nginx负载均衡的5种策略及原理


http://www.niftyadmin.cn/n/389363.html

相关文章

网工内推 | 上海网工专场,NP认证,朝九晚六,多次调薪机会

01 上海伍贤信息技术股份有限公司 🔷招聘岗位:网络工程师 🔷职责描述: 1、在网络基础设施方面提供日常支持,例如,WIFI、局域网、视频会议等。 2、协助管理亚太地区的网络安全服务(防火墙/代理/…

桶排序--C++实现

文章目录 1. 描述2. 源代码3. 理解4. ref 1. 描述 计数排序是一个桶对应一个数值,而桶排序则是一个桶内有多个数值。桶内部进行插入或者其他的排序。最后再根据桶基数大小排序成最后的结果。 步骤 哈希分桶根据哈希值将待排序值放入桶各个桶内排序将桶中的元素输…

【消息队列】| 队列的优势介绍及应用场景

目录 🦁 前言🦁 那么MQ的优势在哪里?🦁 应用场景🦁 最后 🦁 前言 消息队列:MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统…

《模板的进阶》

本文主要介绍C模板知识,包括模板的参数类型,模板的特化,模板的分离编译 文章目录 思维导图一、非类型模板参数二、模板的特化2.1模板特化的概念2.2函数模板特化2.3类模板的特化2.3.1全特化2.3.2偏特化 2.4非类型模板参数也是可以特化的 三、模…

Allegro16.6详细教程(一)

第一章User Interface 本章的主要內容介紹allegro操作介面,透過本章學習可以對Allegro的工作介面有了大致的瞭解,同時也能體驗出Allegro PCB Layout時的強大功能。 A.程式的啟動 除了以上Allegro主程式,我們還會常用到以下幾個常用工具: • Padstack Designer (Padstack…

五种经典IO模型详解

目录 同步和异步同步阻塞IO模型基本概念应用场景优缺点 同步非阻塞IO模型基本概念应用场景优缺点 IO多路复用模型信号驱动IO模型回顾复习1.信号2.产生信号的条件3.可重入函数4.为什么中断处理函数不能直接调用不可重入函数5.如何写出可重入的函数 基本概念应用场景优缺点 异步I…

Spring Security 6.x 系列【51】授权篇之动态权限规则

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 概述2. 需求场景3. 实现思路4. 案例演示5. 测试1. 概述 在开始阅读本篇…

SpringBoot框架面试专题(初级-中级)-第九节

欢迎大家一起探讨相关问题,我们共同进步,喜欢的话可以关注点赞,后续会持续更新,谢谢~ 问题; 1.如何在Spring Boot中实现自定义异常处理?常用的异常处理方式有哪些? 解析&#xff…