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代理。

在这里插入图片描述

 
写的比较粗略,大家将就看看吧,文章中有啥问题,也麻烦大家指出,互相交流,哈哈。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐