#!/bin/bash # OpenResty/Nginx 403 & 404 错误页面一键部署脚本 # 支持Docker环境和传统安装方式 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_debug() { echo -e "${PURPLE}[DEBUG]${NC} $1"; } # 检查运行环境 check_environment() { log_info "检查运行环境..." # 检查是否是Docker环境 if docker ps &>/dev/null; then # 查找Nginx或OpenResty容器 local nginx_container=$(docker ps --filter "name=nginx" --format "{{.Names}}" | head -1) local openresty_container=$(docker ps --filter "name=openresty" --format "{{.Names}}" | head -1) if [ -n "$openresty_container" ]; then log_success "找到OpenResty容器: $openresty_container" echo "docker:$openresty_container" return 0 elif [ -n "$nginx_container" ]; then log_success "找到Nginx容器: $nginx_container" echo "docker:$nginx_container" return 0 else log_warning "未找到Nginx/OpenResty容器,尝试其他方式" fi fi # 检查系统安装的OpenResty if command -v openresty &>/dev/null; then log_success "找到系统安装的OpenResty" echo "system:openresty" return 0 fi # 检查系统安装的Nginx if command -v nginx &>/dev/null; then log_success "找到系统安装的Nginx" echo "system:nginx" return 0 fi log_error "未找到Nginx或OpenResty" return 1 } # 创建403错误页面 create_403_page() { local host_data_dir="/boot/data/dataxn" log_info "正在创建日系动漫风格403错误页面..." # 检查宿主机目录是否存在 if [ ! -d "$host_data_dir" ]; then log_warning "目录 $host_data_dir 不存在,正在创建..." mkdir -p "$host_data_dir" fi local html_path="$host_data_dir/403.html" cat > "$html_path" << 'EOF' 访问被拒绝 - 403错误
🚫
🔒
🔐
403

アクセスが拒否されました!

申し訳ありませんが、このページへのアクセス権限がありません。
守られし領域へは、選ばれし者だけが入ることが許されています。

ホームに戻る 前のページに戻る 管理者に連絡
EOF log_success "403页面已创建: $html_path" } # 创建404错误页面(更新版) create_404_page() { local host_data_dir="/boot/data/dataxn" log_info "正在创建日系动漫风格404错误页面..." # 检查宿主机目录是否存在 if [ ! -d "$host_data_dir" ]; then log_warning "目录 $host_data_dir 不存在,正在创建..." mkdir -p "$host_data_dir" fi local html_path="$host_data_dir/404.html" cat > "$html_path" << 'EOF' 页面未找到 - 404错误
🌸
🐱
404

おっと!ページが見つかりません

申し訳ありませんが、お探しのページは存在しないか、移動した可能性があります。
迷子になったキャラクターのように、ページもどこかへ行ってしまったようです。

ホームに戻る 前のページに戻る
EOF log_success "404页面已创建: $html_path" } # 为Docker容器创建Nginx配置 create_docker_nginx_config() { local container_name="$1" log_info "为容器 $container_name 创建Nginx错误页面配置..." # 创建配置内容 local config_content=$(cat << 'EOF' # 自定义错误页面配置 error_page 403 /403.html; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /403.html { root /usr/share/nginx/html; internal; allow all; } location = /404.html { root /usr/share/nginx/html; internal; allow all; } location = /50x.html { root /usr/share/nginx/html; internal; allow all; } EOF ) # 将配置写入容器 local config_path="/etc/nginx/conf.d/custom_errors.conf" echo "$config_content" | docker exec -i "$container_name" tee "$config_path" > /dev/null if [ $? -eq 0 ]; then log_success "Nginx错误页面配置已写入容器: $config_path" else log_error "无法写入容器配置" return 1 fi } # 为系统安装创建Nginx配置 create_system_nginx_config() { local service_type="$1" log_info "为系统安装的 $service_type 创建错误页面配置..." local nginx_conf_dir="" case "$service_type" in "openresty") nginx_conf_dir="/usr/local/openresty/nginx/conf" if [ ! -d "$nginx_conf_dir" ]; then nginx_conf_dir="/etc/openresty" fi ;; "nginx") nginx_conf_dir="/etc/nginx" ;; esac if [ ! -d "$nginx_conf_dir" ]; then log_error "找不到配置目录: $nginx_conf_dir" return 1 fi local config_path="$nginx_conf_dir/conf.d/custom_errors.conf" # 创建配置内容 local config_content=$(cat << EOF # 自定义错误页面配置 error_page 403 /403.html; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /403.html { root /usr/share/nginx/html; internal; allow all; } location = /404.html { root /usr/share/nginx/html; internal; allow all; } location = /50x.html { root /usr/share/nginx/html; internal; allow all; } EOF ) # 写入配置 mkdir -p "$(dirname "$config_path")" echo "$config_content" > "$config_path" log_success "Nginx错误页面配置已创建: $config_path" } # 测试配置 test_config() { local env_type="$1" local target="$2" log_info "测试配置..." case "$env_type" in "docker") if docker exec "$target" nginx -t; then log_success "Docker容器配置测试通过" return 0 else log_error "Docker容器配置测试失败" return 1 fi ;; "system") if sudo nginx -t 2>/dev/null || sudo openresty -t 2>/dev/null; then log_success "系统服务配置测试通过" return 0 else log_error "系统服务配置测试失败" return 1 fi ;; esac } # 重新加载服务 reload_service() { local env_type="$1" local target="$2" log_info "重新加载服务..." case "$env_type" in "docker") if docker exec "$target" nginx -s reload; then log_success "Docker容器配置已重新加载" return 0 else log_error "Docker容器重新加载失败" return 1 fi ;; "system") if systemctl reload nginx 2>/dev/null || systemctl reload openresty 2>/dev/null || nginx -s reload 2>/dev/null; then log_success "系统服务配置已重新加载" return 0 else log_error "系统服务重新加载失败" return 1 fi ;; esac } # 显示完成信息 show_completion() { local env_type="$1" local target="$2" echo log_success "日系动漫风格403 & 404错误页面部署完成!" echo log_info "部署详情:" log_info "- 403页面: /boot/data/dataxn/403.html" log_info "- 404页面: /boot/data/dataxn/404.html" case "$env_type" in "docker") log_info "- 容器名称: $target" log_info "- 配置路径: /etc/nginx/conf.d/custom_errors.conf" ;; "system") log_info "- 服务类型: $target" log_info "- 配置路径: /etc/nginx/conf.d/custom_errors.conf" ;; esac echo log_info "测试方法:" log_info "403测试: curl http://你的域名/禁止访问的路径" log_info "404测试: curl http://你的域名/不存在的页面" echo log_success "现在您的OpenResty/Nginx将显示美观的日系动漫风格错误页面!" } # 主函数 main() { echo log_info "开始部署日系动漫风格403 & 404错误页面..." echo # 检查环境 local env_info=$(check_environment) if [ $? -ne 0 ]; then exit 1 fi local env_type=$(echo "$env_info" | cut -d: -f1) local target=$(echo "$env_info" | cut -d: -f2) log_debug "环境类型: $env_type, 目标: $target" # 创建错误页面 create_403_page create_404_page # 创建配置 case "$env_type" in "docker") create_docker_nginx_config "$target" ;; "system") create_system_nginx_config "$target" ;; esac # 测试并重新加载 if test_config "$env_type" "$target"; then reload_service "$env_type" "$target" show_completion "$env_type" "$target" else log_error "部署失败,请检查配置" exit 1 fi } # 显示使用说明 usage() { echo "OpenResty/Nginx 403 & 404 错误页面一键部署脚本" echo echo "使用方法: $0 [选项]" echo echo "选项:" echo " -h, --help 显示此帮助信息" echo " -i, --install 执行安装部署" echo echo "支持环境:" echo " - Docker容器 (Nginx/OpenResty)" echo " - 系统安装 (Nginx/OpenResty)" echo echo "示例:" echo " $0 --install 部署403和404页面" } # 参数处理 case "${1:-}" in -h|--help) usage exit 0 ;; -i|--install|"") main ;; *) log_error "未知选项: $1" usage exit 1 ;; esac