项目背景

本文档基于实际项目经验编写,适用于以下架构:

  • 部署方式:容器化部署(Docker/Podman)

  • 服务架构

    • 前端容器:web-app(内置 Nginx)

    • 后端容器:web-api

  • Nginx 配置:配置文件 nginx.conf 存放在 Jenkins Pipeline 中,通过 writeFile 动态生成

  • 部署流程:Jenkins Pipeline 自动构建镜像并部署

本文档适用场景:你只需要在服务器上生成证书,然后修改 Jenkins 中的 Nginx 配置和 Docker 运行参数,即可为前端容器启用 HTTPS。


概述

本文档详细介绍如何在 Linux 环境下使用自签名证书为容器化 Web 应用配置 HTTPS 访问。适用于内网环境或测试环境,无需购买正式 SSL 证书

一、环境准备

1.1 前提条件

  • Linux 服务器(Ubuntu/CentOS/RHEL)

  • Docker 环境已安装

  • Nginx 容器(或宿主机 Nginx)

  • OpenSSL 工具

1.2 检查 OpenSSL

        这里是在宿主机(即部署前端容器所在的Linux服务器)

# 检查 OpenSSL 是否已安装
openssl version

# 如果未安装,执行以下命令安装
# Ubuntu/Debian
sudo apt install openssl -y

# CentOS/RHEL
sudo yum install openssl -y

二、生成自签名证书

2.1 创建证书目录

# 创建证书存储目录
mkdir -p ~/nginx-ssl/ssl
cd ~/nginx-ssl/ssl

2.2 生成证书

# 生成自签名证书(有效期365天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout server.key \
  -out server.crt \
  -subj "/CN=192.168.xxx.xxx"

三、设置证书权限

# 证书文件设置为 644 权限(所有人可读)
chmod 644 server.crt

# 私钥文件设置为 600 权限(仅所有者可读写)
chmod 600 server.key

# 验证权限
ls -la

     预期输出

-rw-r--r-- 1 user user 1234 Mar 31 10:00 server.crt
-rw------- 1 user user 1675 Mar 31 10:00 server.key

四、修改 Jenkins Pipeline 配置

4.1 修改 Nginx 配置文件

        在 Jenkins Pipeline 的 Prepare nginx config file stage 中,将 Nginx 配置修改为支持 HTTPS 的版本:

stage ('Prepare nginx config file') {
    script {
        // 定义变量(请修改为你的实际值)
        def SERVER_IP = "${SERVER_IP}"           // 服务器 IP
        def BACKEND_PORT = "${BACKEND_PORT}"     // 后端 API 端口
        
        sh 'rm -rf ${NGINX_CONFIG}'
        writeFile file: '${NGINX_CONFIG}', text: """
        # HTTP server - redirect to HTTPS
        server {
            listen 80;
            listen [::]:80;
            server_name ${SERVER_IP};
            return 301 https://\$server_name\$request_uri;
        }
        
        # HTTPS server
        server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
            server_name ${SERVER_IP};
            
            # SSL certificate
            ssl_certificate /etc/nginx/ssl/server.crt;
            ssl_certificate_key /etc/nginx/ssl/server.key;
            
            # SSL configuration
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers HIGH:!aNULL:!MD5;
            
            # Frontend static files directory
            root /usr/share/nginx/html;
            index index.html;
            
            # Logs
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
            
            # API proxy for backend
            location /api {
                client_max_body_size 0;
                proxy_pass http://${SERVER_IP}:${BACKEND_PORT};
                proxy_set_header Host \$host;
                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;
            }
            
            # Frontend routing (SPA support)
            location / {
                try_files \$uri \$uri/ /index.html;
            }
        }
        """
    }
}

参考

关键配置说明

配置 说明
server_name ${SERVER_IP} 使用 Jenkins 变量替换服务器 IP
return 301 https://\$server_name\$request_uri HTTP 自动跳转到 HTTPS(注意 \$ 转义)
ssl_certificate 和 ssl_certificate_key

证书路径(容器内路径)

proxy_pass http://${SERVER_IP}:${BACKEND_PORT} 后端 API 地址

4.2 修改 Docker 运行命令

        在 Jenkins Pipeline 的 Docker build stage 中,添加 443 端口映射和证书挂载:

stage ('Docker build') {
    sh """
        CI=false
        
        # 停止并删除旧容器
        docker stop ${FRONTEND_CONTAINER} || true 
        docker container rm ${FRONTEND_CONTAINER} || true
        
        # 构建新镜像
        docker build -t ${PROJECT_NAME} . 
        
        # 运行容器(添加 HTTPS 支持)
        docker run -d \\
            --name ${FRONTEND_CONTAINER} \\
            -p ${HTTP_PORT}:80 \\
            -p 443:443 \\
            -v ${CERT_DIR}:/etc/nginx/ssl:ro \\
            ${PROJECT_NAME}
    """
}

参考

关键参数说明

参数 说明
-p ${HTTP_PORT}:80 映射 HTTP 端口(保持原有访问方式)
-p 443:443 映射 HTTPS 端口(新增)
-v ${CERT_DIR}:/etc/nginx/ssl:ro

挂载证书目录(只读)

五、部署与验证

5.1 执行 Jenkins Pipeline

  1. 提交代码到 Git 仓库

  2. 在 Jenkins 中触发构建

  3. 观察构建日志,确认无错误

5.2 验证容器状态

# 查看容器运行状态
docker ps | grep ${FRONTEND_CONTAINER}

5.3 测试 HTTPS 访问

        在浏览器访问你的测试地址,可进入https,但会显示不安全

        

六、客户端安装证书

        将证书下载到本地,并导入到浏览器安装,即可得到一个安全的HTTPS测试地址

Logo

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

更多推荐