查找nginx镜像
docker search nginx
拉取nginx镜像
# 这里我拉去的是nginx:alpine镜像,是nginx最小镜像
docker pull nginx:alpine
运行镜像
docker run --name nginx -p 80:80 -d nginx:alpine
查看运行效果
nginx实现反向代理tomcat,基于负载均衡
编写tomcat的docker-compose.yml文件
tomcat镜像基于之前文章构建的tomcat,可以自己修改,并且文件在tomcat目录下创建的
博客地址: docker篇-(docker安装tomcat2-基于Dockerfile构建tomcat)
如下
version: '3'
services:
tomcat:
build: .
image: tomcat:9.0.44-alpine
container_name: tomcat
hostname: www.tomcat.com.cn #设置hostname
networks:
tomcat:
ipv4_address: "10.10.10.80" #固定ip
networks: #配置网卡
tomcat: #网卡名称
driver: bridge #网卡驱动
ipam:
driver: default
config:
- subnet: 10.10.0.0/16 #配置子网
编写nginx的docker-compose.yml文件
所在目录为nginx,结构如下
version: '3'
services:
nginx:
image: nginx:alpine
container_name: nginx
#network_mode: host 模式启动,但是不能与networks并存,因此这里不适用
ports:
- 80:80
networks:
- nginx
volumes:
- ./conf.d:/etc/nginx/conf.d #挂载当前目录下的conf.d目录到nginx里面
networks:
nginx:
external:
name: tomcat_tomcat #这里使用tomcat创建的网卡,docker-compose创建的网卡名为service.name_network_name,所以tomcat的网卡为tomcat_tomcat
在conf.d目录下面创建tomcat.conf配置文件
upstream tomcat { #负载均衡模块,如果有多个tomcat,在里面添加多个server即可
ip_hash; #使用ip哈希方式负载均衡,默认使用的是轮训方式
server 10.10.10.80:8080 weight=1; #weight 为权重
#server 10.10.10.81:8080;
#server 10.10.10.82:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Real-IP $remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里
proxy_pass http://tomcat; #请求到upstream模块,实现负载均衡
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
启动tomcat
#启动tomcat的docker-compose.yml
docker-compose -f /root/tomcat/docker-compose.yml up -d
#启动nginx的docker-compose.yml
docker-compose -f /root/nginx/docker-compose.yml up -d
访问页面
查看nginx日志
实现nginx反向代理到tomcat,要实现后台应用的集群部署时,如tomcat可能扩容到10台,就可以使用此方式实现负载均衡。
如果负载均衡的tomat项目依赖了session,则需要在tomat里面加上session共享的功能,如使用redis,或者tomcat自带的等等,当然,我的建议是使用token进行接口数据交互,就不用在维护状态
nginx配置ssl
这里生成证书我使用的是cfssl进行生成,下载地址 https://pkg.cfssl.org/
或者执行以下脚本进行安装
wget -O /usr/local/sbin/certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x /usr/local/sbin/certinfo
wget -O /usr/local/sbin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x /usr/local/sbin/cfssl
wget -O /usr/local/sbin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x /usr/local/sbin/cfssljson
在nginx同级目录执行以下命令创建对应目录
这里为tomcat配置一个域名为 www.tomat.com.cn
mkdir -p ssl/tomcat && cd ssl/tomcat
编写ca-config.json文件,用于证书生成的配置文件
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"tomcat-server": {
"expiry": "876000h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
}
}
}
}
编写ca-csr.json(用于生成CA证书和私钥( 根证书和私钥))
CN为域名
{
"CN": "www.tomcat.com.cn",
"hosts": [
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
生成ca根证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
编写tomcat-server-csr.json文件(用于生成服务器证书和私钥文件)
{
"CN": "www.tomcat.com.cn",
"hosts": [
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
执行命令,生成服务器证书和私钥文件
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=tomcat-server tomcat-server-csr.json | cfssljson -bare tomcat-server
目录如下
编写nginx的docker-compose.yml和conf.d下面的tomcat.conf文件,配置ssl
docker-compose.yml如下,添加ssl目录挂载
version: '3'
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- 80:80
- 443:443
networks:
- nginx
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/opt/ssl
networks:
nginx:
external:
name: tomcat_tomcat
tomcat.conf如下,添加nginx的ssl配置
upstream tomcat {
ip_hash;
server 10.10.10.80:8080 weight=1;
}
server {
listen 443 ssl http2 default_server;
server_name www.tomcat.com.cn [::]:443 ssl http2 default_server;
ssl_certificate /opt/ssl/tomcat/tomcat-server.pem; # pem文件的路径
ssl_certificate_key /opt/ssl/tomcat/tomcat-server-key.pem; # key文件的路径
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_set_header X-Real-IP $remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里
proxy_pass http://tomcat;
}
}
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Real-IP $remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里
proxy_pass http://tomcat;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
启动nginx
docker-compose -f /root/nginx/docker-compose.yml up -d
访问页面效果如下,实现nginx https协议配置
我的nginx目录如下