一、环境
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
本文暂时没有评论,来添加一个吧(●'◡'●)