docker部署nginx,配置ssl,代理minio
docker部署nginx,配置ssl,代理minio
最近碰到个业务,需要在外网部署系统,而我们有两个服务,分别放在两台云服务器上,一台A部署着前后端服务,一台B部署数据库、文件存储系统啥的生产环境数据,现在是需要A去访问B的minio文件系统,但是A服务已经配置了ssl,所以是访问不到B中http的minio上存储的文件,花了些时间解决了这个问题分享出来。
思路:
- 首先要有域名,因为ssl证书是给域名颁发的
- 域名是在阿里云买的
- 两个服务器要有两个域名,一个根域名,一个子域名,根域名是要买的,子域名是免费的。
- 域名是根据ip地址映射的。
- ssl证书
- 我这里使用的阿里云的证书,阿里云的ssl证书每个自然年可以免费申请20次ssl证书,每个证书有3个月的有效期。【在阿里云登陆后,在控制台中搜索,数字证书管理服务(原SSL证书)】
- 因为有两个域名,所以要申请两个ssl证书。
- 部署minio
- 部署nginx
- 两台服务器上都部署nginx,并且配置ssl
- 配置的ssl要根据映射的域名来配置,不能乱配。例如我的ip是192.168.0.1,映射域名是jyy.com,那么为jyy.com申请的ssl证书,就必须要配置在192.168.0.1这台服务器上!!!
- nginx代理minio
其实minio本身也支持配置https,但是我没有解决,还是走nginx代理
这篇文章是解决完这个业务后写的,由于服务器、域名、证书都是公司的资产,我就不重新走一遍流程了,希望大家谅解!!!
1、docker部署minio
docker run -d \
-p 9000:9000 \
-p 9090:9090 \
--name minio \
-v /opt/develop/docker/minio/data:/data \
-v /opt/develop/docker/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123" \
--restart unless-stopped \
minio/minio:RELEASE.2025-03-12T18-04-18Z-cpuv1 server /data --address ":9000" --console-address ":9090"
-d
- -d 表示以“分离模式”(detached mode)运行容器,容器在后台运行,终端不会被阻塞。
-p 9000:9000 -p 9090:9090
- -p 是端口映射选项,格式为 主机端口:容器端口。
- -p 9000:9000:将主机的 9000 端口映射到容器的 9000 端口(MinIO 的服务端口,用于存储访问)。
- -p 9090:9090:将主机的 9090 端口映射到容器的 9090 端口(MinIO 的控制台端口,用于 Web 界面管理)。
- 作用:外部可以通过主机的 9000 端口访问 MinIO 服务,9090 端口访问 Web 控制台。
–name minio
- 指定容器的名称为 minio。
- 作用:方便后续通过名字管理容器,例如 docker stop minio 或 docker logs minio。
-v /opt/develop/docker/minio/data:/data
- -v 是卷挂载选项,格式为 主机路径:容器路径。
- 将主机上的 /opt/develop/docker/minio/data 目录挂载到容器内的 /data 目录。
- 作用:MinIO 会将存储的对象数据(如文件)保存到 /data 目录,挂载后数据会持久化到主机上。
-v /opt/develop/docker/minio/config:/root/.minio
- 将主机上的 /opt/develop/docker/minio/config 目录挂载到容器内的 /root/.minio 目录。
- 作用:MinIO 的配置文件和元数据(如用户凭证、配置信息)默认存储在 /root/.minio 中,挂载后这些配置会持久化到主机。
-e “MINIO_ROOT_USER=admin”
- -e 是环境变量选项,用于设置容器内的环境变量。
- 设置 MinIO 的根用户(管理员用户)为 admin。
- 作用:登录 MinIO 时使用此用户名。
-e “MINIO_ROOT_PASSWORD=admin123”
- 设置 MinIO 的根用户密码为 admin123。
- 作用:登录 MinIO 时使用此密码。
- 注意:生产环境中建议使用更强的密码。
–restart unless-stopped
- 设置容器的重启策略为 unless-stopped。
- 作用:容器会在 Docker 重启或主机重启时自动重启,除非手动停止(例如 docker stop minio)。
minio/minio:RELEASE.2025-03-12T18-04-18Z-cpuv1
- 指定运行的镜像名称和版本号,这里是 minio/minio,版本为 RELEASE.2025-03-12T18-04-18Z-cpuv1。
- 作用:Docker 会使用此特定版本的 MinIO 镜像。如果本地没有,会从 Docker Hub 下载。
server /data --address “:9000” --console-address “:9090”
- 这是传递给 MinIO 的启动参数,告诉 MinIO 如何运行。
- server:启动 MinIO 的服务器模式。
- /data:指定存储数据的目录(与前面的卷挂载对应)。
- –address “:9000”:指定 MinIO 服务监听的端口为 9000。
- –console-address “:9090”:指定 MinIO Web 控制台监听的端口为 9090。
2、docker部署nginx
2.1、创建挂载目录
mkdir -p /opt/develop/docker/nginx/{logs,ssl}
2.2、启动nginx
docker run -p 80:80 --name nginx -d nginx:1.27.4
2.3、复制文件目录
# 将容器conf文件复制到宿主机
docker cp nginx:/etc/nginx/conf/nginx /opt/develop/docker/nginx/conf
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /opt/develop/docker/nginx/html
# 停止容器
docker rm -f nginx
2.4、将ssl证书上传至 /opt/develop/docker/nginx/ssl 目录下
2.5、修改nginx配置文件
执行以下命令
vim /opt/develop/docker/nginx/conf/nginx.conf
修改文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
# 包含mime.types文件
include mime.types;
# 包含所有vhosts下的conf文件
include vhosts/*.conf;
# 默认文件类型
default_type application/octet-stream;
# 日志格式
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 获取日期
map $time_iso8601 $logdate {
'~^(?<ymd>\\d{4}-\\d{2}-\\d{2})' $ymd;
default 'date-not-found';
}
# 访问日志
access_log /var/log/nginx/$logdate-access.log custom;
# Gzip压缩设置
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 优化文件传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时时间
keepalive_timeout 65s;
keepalive_requests 100; # 保持连接的请求数
# 客户端请求设置
client_max_body_size 50m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
large_client_header_buffers 4 256k;
client_body_timeout 60;
client_header_timeout 60;
# 重置超时连接
reset_timedout_connection on;
# 发送超时时间
send_timeout 60s;
# 设置每个进程传输文件的大小
sendfile_max_chunk 512k;
# 设置server_names_hash_bucket_size的大小
server_names_hash_bucket_size 256;
# 静态文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# SSL优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 隐藏Nginx版本号
server_tokens off;
server {
# 监听80端口
listen 80;
server_name localhost;
location / {
# 前端文件存放目录
root /usr/share/nginx/html/dist;
index index.html index.htm;
# 如果访问路径不存在,则重定向到首页
try_files $uri $uri/ /index.html;
}
location /api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 后端服务地址
proxy_pass http://xxx.xxx.xxx.xxx:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# ssl配置
server {
# 监听443端口
listen 443 ssl;
# 这里填写自己的域名
server_name jyy.com;
# ssl证书存放目录
ssl_certificate /etc/nginx/ssl/jyy.com.pem;
ssl_certificate_key /etc/nginx/ssl/jyy.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
# minio访问地址,端口是minio api的访问端口
proxy_pass http://xxx.xxx.xxx.xxx:9000;
proxy_set_header Host $http_host;
proxy_pass_request_headers on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
}
}
}
注意:
1、这里配置的文件目录都是,nginx容器内的文件目录。
2、ssl只能通过443端口访问,如果有多个服务配置443端口访问的话,再复制个server块,监听443端口,而server_name不同,nginx会根据访问的server_name不同,来分配到不同的server配置。
关于ssl配置,需要大家根据自己实际情况改的地方有:
- 122行:修改server_name为自己的域名
- 125行:修改.pem文件路径
- 126行:修改.key文件路径
- 135行:minio api访问url
2.6、再次启动nginx容器,并且挂载目录
docker run -p 80:80 -p 443:443\
-v /opt/develop/docker/nginx/conf:/etc/nginx/conf/nginx \
-v /opt/develop/docker/nginx/html:/usr/share/nginx/html \
-v /opt/develop/docker/nginx/logs:/var/log/nginx \
-v /opt/develop/docker/nginx/ssl:/etc/nginx/ssl \
--name nginx -d nginx:1.27.4
代码解释:
-p 80:80 -p 443:443
- -p 是端口映射选项,格式为 主机端口:容器端口。
- -p 80:80:将主机的 80 端口映射到容器的 80 端口(HTTP 默认端口)。
- -p 443:443:将主机的 443 端口映射到容器的 443 端口(HTTPS 默认端口)。
- 作用:外部可以通过主机的 80 和 443 端口访问容器内的 Nginx 服务。
-v /opt/develop/docker/nginx/conf:/etc/nginx/conf/nginx
- -v 是卷挂载选项,格式为 主机路径:容器路径。
- 将主机上的 /opt/develop/docker/nginx/conf 目录挂载到容器内的 /etc/nginx/conf/nginx 目录。
- 作用:可以自定义 Nginx 的配置文件。通常 Nginx 的配置文件(如 nginx.conf)会放在这个目录下,挂载后容器会使用主机上的配置,而不是镜像默认的配置。
-v /opt/develop/docker/nginx/html:/usr/share/nginx/html
- 将主机上的 /opt/develop/docker/nginx/html 目录挂载到容器内的 /usr/share/nginx/html 目录。
- 作用:这是 Nginx 默认的网页文件目录(静态文件如 HTML、CSS、JS)。挂载后,容器会提供主机上该目录中的文件作为网页内容。
-v /opt/develop/docker/nginx/logs:/var/log/nginx
- 将主机上的 /opt/develop/docker/nginx/logs 目录挂载到容器内的 /var/log/nginx 目录。
- 作用:Nginx 的日志文件(如 access.log 和 error.log)会存储在这里。挂载后,日志会保存在主机上,便于查看和持久化。
-v /opt/develop/docker/nginx/ssl:/etc/nginx/ssl
- 将主机上的 /opt/develop/docker/nginx/ssl 目录挂载到容器内的 /etc/nginx/ssl 目录。
- 作用:通常用于存放 SSL/TLS 证书(如 .crt 和 .key 文件),以支持 HTTPS。挂载后,Nginx 可以直接使用主机上的证书文件。
–name nginx
- 指定容器的名称为 nginx。
- 作用:方便后续通过名字(而不是容器 ID)管理这个容器,例如 docker stop nginx 或 docker logs nginx。
-d
- 表示以“分离模式”(detached mode)运行容器,即容器在后台运行,而不是在前台显示输出。
- 作用:启动后终端会立即返回,而不是阻塞。
nginx:1.27.4
- 指定运行的镜像名称和版本号,这里是 nginx:1.27.4。
- 作用:Docker 会从 Docker Hub 下载并运行 Nginx 的 1.27.4 版本镜像。如果本地没有这个镜像,会自动拉取。
3、完整的docker compose
# 指定docker-compose文件版本
version: "3"
services:
jyy-nginx:
# 指定容器名称
container_name: nginx
# 指定容器版本
image: nginx:1.27.4
# 重启策略
restart: always
# 端口映射
ports:
- "80:80"
- "443:443"
# 卷挂载选项
volumes:
- /opt/develop/docker/nginx/conf:/etc/nginx/conf/nginx
- /opt/develop/docker/nginx/html:/usr/share/nginx/html
- /opt/develop/docker/nginx/logs:/var/log/nginx
- /opt/develop/docker/nginx/ssl:/etc/nginx/ssl
# 将容器连接到名为 jyy_service_bridge 的网络
networks:
- jyy_service_bridge
# 设置容器的主机名为 jyy_nginx_host
hostname: jyy_nginx_host
jyy-minio:
# 指定容器名称
container_name: minio
# 指定使用的镜像
image: minio/minio:RELEASE.2025-03-12T18-04-18Z-cpuv1
# 设置容器的重启策略
restart: always
# 定义端口映射
ports:
- "9000:9000"
- "9090:9090"
# 定义容器内的环境变量
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: admin123
# 定义卷挂载
volumes:
- /opt/develop/docker/minio/data:/data
- /opt/develop/docker/minio/config:/root/.minio
command: server /data --console-address ":9090" -address ":9000"
# 将容器连接到名为 jyy_service_bridge 的网络
networks:
- jyy_service_bridge
# 设置容器的主机名为 jyy_minio_host
hostname: jyy_minio_host
# 此服务依赖于 jyy-nginx 服务
depends_on:
- jyy-nginx
# 全局网络配置
networks:
# 定义网络名称
jyy_service_bridge:
# 指定网络的驱动类型
driver: bridge
ipam:
config:
- subnet: 192.168.7.0/24
启动完后,需要开放对应服务器的端口。
4、测试
4.1、访问Minio地址,你的ip:9090,新建demo桶,并且设置公开,
因为设为私有的话,访问地址要带上密钥,太麻烦了,这里直接设为公开,进行测试




4.2、上传图片



4.3、通过域名访问dog.jpg,访问地址是,你的域名/桶名/图片名称,这里不需要加端口,因为走的是nginx代理。

写的比较粗略,大家将就看看吧,文章中有啥问题,也麻烦大家指出,互相交流,哈哈。
更多推荐
所有评论(0)