Ubuntu 24.04 LTS 安装 nginx

Ubuntu 24.04 LTS 安装 nginx

  1. 安装 Docker(若未安装):
 sudo apt update && sudo apt install -y docker.io docker-compose-plugin
 sudo systemctl enable --now docker
 sudo usermod -aG docker $USER  # 非root用户添加docker权限(需重启生效)
 ##换源 并且配置Docker资源限制(避免占用过多内存)
 sudo mkdir -p /etc/docker
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
  "registry-mirrors" : ["https://docker.registry.cyou",
  "https://docker-cf.registry.cyou",
  "https://dockercf.jsdelivr.fyi",
  "https://docker.jsdelivr.fyi",
  "https://dockertest.jsdelivr.fyi",
  "https://mirror.aliyuncs.com",
  "https://dockerproxy.com",
  "https://mirror.baidubce.com",
  "https://docker.m.daocloud.io",
  "https://docker.nju.edu.cn",
  "https://docker.mirrors.sjtug.sjtu.edu.cn",
  "https://docker.mirrors.ustc.edu.cn",
  "https://mirror.iscas.ac.cn",
  "https://docker.rainbond.cc",
  "https://do.nark.eu.org",
  "https://dc.j8.work",
  "https://dockerproxy.com",
  "https://gst6rzl9.mirror.aliyuncs.com",
  "https://registry.docker-cn.com",
  "http://hub-mirror.c.163.com",
  "http://mirrors.ustc.edu.cn/",
  "https://mirrors.tuna.tsinghua.edu.cn/",
  "http://mirrors.sohu.com/" 
 ],
   "insecure-registries" : [
      "registry.docker-cn.com",
      "docker.mirrors.ustc.edu.cn"
   ],
  "debug": true,
  "experimental": false
  "default-shm-size": "256m",  # 共享内存限制
  "default-ulimits": {
    "memlock": { "hard": -1, "soft": -1 }
  }
}
EOF
sudo systemctl restart docker

2.创建deploy_nginx.sh脚本

#创建脚本
cat > deploy_nginx.sh << EOF
#!/bin/bash
set -e  # 脚本出错时立即退出

# -------------------------- 配置参数(可根据需求修改) --------------------------
NGINX_BASE_DIR="/home/nginx"       # 宿主机部署根目录
TEMP_CONTAINER_NAME="nginx-temp"   # 临时容器名称
NGINX_IMAGE="registry-dockerhub.xiaoxiao.space/library/nginx:mainline-alpine3.22"  # 镜像地址
CONTAINER_NAME="nginx"             # 正式容器名称
COMPOSE_FILE="nginx.yaml"          # docker-compose 文件名
# ------------------------------------------------------------------------------

# 检查是否首次部署(判断核心配置文件是否存在)
is_first_deploy() {
  # 若 conf 目录或 docker-compose 文件不存在,视为首次部署
  if [ ! -d "${NGINX_BASE_DIR}/conf" ] || [ ! -f "${NGINX_BASE_DIR}/${COMPOSE_FILE}" ]; then
    return 0  # 首次部署
  else
    return 1  # 非首次部署
  fi
}

# 1. 初始化操作(仅首次部署执行)
if is_first_deploy; then
  echo "=== 1. 初始化宿主机目录 ==="
  mkdir -p ${NGINX_BASE_DIR}/{conf,html,logs}
  chmod -R 755 ${NGINX_BASE_DIR}
  echo "宿主机目录创建完成:${NGINX_BASE_DIR}"


  echo -e "\n=== 2. 启动临时容器 ==="
  if docker ps -a --format '{{.Names}}' | grep -q "^${TEMP_CONTAINER_NAME}$"; then
    docker rm -f ${TEMP_CONTAINER_NAME} >/dev/null
  fi
  docker run -d --name ${TEMP_CONTAINER_NAME} ${NGINX_IMAGE}
  echo "临时容器 ${TEMP_CONTAINER_NAME} 启动成功"


  echo -e "\n=== 3. 复制配置文件到宿主机 ==="
  docker exec ${TEMP_CONTAINER_NAME} tar -cC /etc/nginx . | tar -xC ${NGINX_BASE_DIR}/conf/
  docker cp ${TEMP_CONTAINER_NAME}:/usr/share/nginx/html ${NGINX_BASE_DIR}/
  docker cp ${TEMP_CONTAINER_NAME}:/var/log/nginx ${NGINX_BASE_DIR}/
  echo "配置文件复制完成"


  echo -e "\n=== 4. 清理临时容器 ==="
  docker rm -f ${TEMP_CONTAINER_NAME} >/dev/null
  echo "临时容器 ${TEMP_CONTAINER_NAME} 已删除"


  echo -e "\n=== 5. 生成 docker-compose 配置 ==="
  cat > ${NGINX_BASE_DIR}/${COMPOSE_FILE} << EOF
services:
  nginx:
    image: ${NGINX_IMAGE}
    container_name: ${CONTAINER_NAME}  # 强制指定容器名
    restart: always
    ports:  # 改用端口映射,避免 host 模式冲突
      - "80:80"
    volumes:
      - ./conf:/etc/nginx:rw
      - ./html:/usr/share/nginx/html:rw
      - ./logs:/var/log/nginx:rw
    env_file:
      - env
EOF
  echo "docker-compose 配置生成:${NGINX_BASE_DIR}/${COMPOSE_FILE}"


  echo -e "\n=== 6. 创建环境变量文件 ==="
  cat > ${NGINX_BASE_DIR}/env << EOF
TZ=Asia/Shanghai
EOF
  echo "env 文件创建完成:${NGINX_BASE_DIR}/env"
else
  echo "=== 1. 配置文件已存在,跳过初始化 ==="
fi


# 7. 清理旧容器(无论是否首次部署,均先删除旧容器)
echo -e "\n=== 7. 清理旧容器 ==="
# 进入部署目录
cd ${NGINX_BASE_DIR}
# 停止并删除所有相关容器(包括可能的残留容器)
if docker-compose -f ${COMPOSE_FILE} ps -q >/dev/null; then
  docker-compose -f ${COMPOSE_FILE} down -v  # -v 清理关联卷(避免配置冲突)
fi
# 额外检查是否有同名残留容器(强制删除)
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
  docker rm -f ${CONTAINER_NAME} >/dev/null
fi
echo "旧容器清理完成"


# 8. 启动新容器
echo -e "\n=== 8. 启动正式容器 ==="
docker-compose -f ${COMPOSE_FILE} up -d
echo "正式容器 ${CONTAINER_NAME} 启动中..."


# 9. 验证部署结果
echo -e "\n=== 9. 验证部署 ==="
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
  echo "✅ Nginx 部署成功!容器名称:${CONTAINER_NAME}"
  echo "访问测试:curl http://localhost"
  echo "配置文件路径:${NGINX_BASE_DIR}/conf"
else
  echo "❌ Nginx 部署失败,请查看日志:docker logs ${CONTAINER_NAME}"
  exit 1
fi
EOF
#赋予权限
chmod +x deploy_nginx.sh
#启动
sudo ./deploy_nginx.sh
posted @ 2025-11-04 11:13  浮生醉清风_QQ  阅读(43)  评论(0)    收藏  举报