计算机系统应用教程网站

网站首页 > 技术文章 正文

做服务的负载均衡,你也可以(docker 中部署 nginx)

btikc 2024-09-12 12:04:42 技术文章 24 ℃ 0 评论

一、环境

Linux、Docker

二、安装nginx

1、下载nginx镜像

拉取nginx镜像:docker pull nginx

查看nginx镜像:docker images


2、创建目录及配置

a、创建目录

mkdir /home/nginx/{conf,conf.d,logs,cert}

b、配置文件

进入配置目录:cd /home/nginx

vi conf/nginx.conf,把下面内容拷贝到到nginx.conf文件里,按esc,输入 :wq 保存

nginx.conf 配置(位置:conf/nginx.conf)

user nginx; #运行用户

worker_processes 4; #启动进程,通常设置成和cpu的数量相等或2倍

#错误日志的存放目录,日志级别有dubug,info,notice,warn,error,crit

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;#指定pid存放路径

#文件描述符数量,如果不设的话上限就是系统的ulimit –n的数字,一般设置woker_connections的3-4倍 worker_rlimit_nofile 51200;

events {

#使用的网络I/O模型,Linux系统推荐采用epoll模型,FreeBSD系统推荐采用kqueue模型

use epoll;

multi_accept on;

#允许的连接数

worker_connections 65535;

}

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; #日志,关闭:access_log off;

sendfile on;

proxy_connect_timeout 3; #默认连接超时时间

proxy_read_timeout 3; #默认读取超时时间

proxy_send_timeout 3; #默认发送超时时间

client_header_buffer_size 16k;

large_client_header_buffers 4 64k;

client_max_body_size 8m;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 120;

include /etc/nginx/conf.d/*.conf;#包含conf.d目录下的所有 .conf 文件

}

创建负载均衡默认配置(位置:conf.d/default.conf),可以创建多个,比如一个域名一个配置文件,如api.xxx.com.conf,多个监听端口,可以配置多个【upstream】和【server】,一个conf文件可以包含多个upstream和server(upstream和server一一对应)

vi conf.d/default.conf ,拷贝以下内容,其中ip地址改成自己的服务器地址,按esc,输入 :wq 保存

#做负载的服务地址:weight权重 max_fails允许失败次数 fail_timeout多长时间内

upstream webserver { #webserver:名字自定义

server 172.19.111.151:8007 weight=3 max_fails=3 fail_timeout=30;

server 172.19.111.151:8008 weight=1 max_fails=3 fail_timeout=30;

server 172.19.11.151:8009 backup weight=1 max_fails=3 fail_timeout=30;

}

server {

#监听端口,可以多个

listen 8000; #监听8000端口

listen 80; #监听80端口

#https支持 开始

listen 443 ssl http2; #监听443端口

#docker中路径只能在系统路径中,如/etc/...,否则无法识别,其中“api.test.com”换成自己的证书名称,同时把证书文件(api.test.com.crt、api.test.com.key)拷贝到 /home/nginx/cert(证书路径映射位置) 中

ssl_certificate /etc/nginx/cert/api.test.com.crt;

ssl_certificate_key /etc/nginx/cert/api.test.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_session_timeout 10m;

ssl_session_cache builtin:1000 shared:SSL:10m;

ssl_buffer_size 1400;

add_header Strict-Transport-Security max-age=15768000;

ssl_stapling on;

ssl_stapling_verify on;

#https支持 结束

server_name 172.19.111.150 api.test.com;#服务器地址或域名,多个用空格隔开,这里的IP地址一定是主机的ip地址,非容器内部地址

location / {

proxy_pass http://webserver; #上面upstream自定义的名字

proxy_store off;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_connect_timeout 15; #连接超时(秒)

proxy_send_timeout 300; #发送超时(秒)

proxy_read_timeout 300; #读取超时(秒)

}

}

3、运行nginx容器

docker run -d -p 80:80 -p 443:443 -p 8000:8000 -p 8003:8003 \

--privileged=true -v /home/nginx/cert:/etc/nginx/cert \ #证书路径映射

--privileged=true -v /home/nginx/conf.d:/etc/nginx/conf.d \ #配置文件路径映射

--privileged=true -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ #nginx.conf 文件路径映射

--privileged=true -v /home/nginx/logs:/var/log/nginx \ #logs文件夹路径映射

--restart always --name nginx_test nginx[:latest]

run命令说明:

-d:指定容器运行于前台还是后台,默认为false

--restart:指定容器停止后的重启策略:

  • no:容器退出时不重启
  • on-failure:容器故障退出(返回值非零)时重启
  • always:容器退出时总是重启

-p:指定端口映射,格式为:主机(宿主)端口:容器端口,多个端口,可以重复

--name:指定容器名称

-v: 绑定一个卷,把容器内的路径映射到主机(宿主)的路径上

--privileged=true:赋予容器内的root拥有真正的root权限

nginx[:latest]:容器镜像名称,latest代表的tag,如果是latest,可以省略

其他命令:

启用容器:docker start 容器名/容器ID,如:docker start nginx_test

停止容器:docker stop 容器名/容器ID,如:docker stop nginx_test

重启容器:docker restart 容器名/容器ID,如:docker restart nginx_test

查看容器运行状态:docker ps -a


进入nginx容器内部:docker exec -it nginx_test bash

比如我们更改了nginx配置文件,则可以先进入容器内部,测试配置文件更改是否正确:

docker exec -it nginx_test bash

nginx -t



4、至此服务负载均衡部署完成,通过以下形式能够访问你的服务:

http://172.19.111.150/xxx

http://api.test.com/xxx

https://api.test.com/xxx

5、其他

a、主机(宿主)与容器网络

主机宿主:是指docker所运行的服务器,操作系统可以linuex,也可以是window,它的IP地址是我们能够直接访问的

容器网络:是docker中的网络,如果没有映射出来,在容器外访问不到。

查看docker网络情况:docker network ls


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表