[{"data":1,"prerenderedAt":72},["ShallowReactive",2],{"article-135":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":13,"status":16,"is_open":16,"is_deleted":14,"is_top":16,"is_recommend":16,"create_time":17,"update_time":18,"image_id":19,"url":13,"member_id":14,"cate_name":20,"prev":21,"next":24,"tags":27,"words":43,"read_time":44,"comments":14,"cover":45,"relevant":46},135,"宝塔面板网站克隆实战：那些让你掉坑的细节与完整避坑指南","php,数据库,nginx,宝塔面板","复制一个网站看似简单——拷贝文件、导入数据库、改个配置的事儿。但真正动手才发现：**最麻烦的从来不是复制动作本身，而是每个环节里那些不报错但静默失效的细节**。权限没递归、数据库用户没授权、配置里多了一个空格、SSL 证书路径少了个斜杠——这些才是克隆后花两小时才定位到的点。",4,"# 宝塔面板网站克隆实战：那些让你掉坑的细节与完整避坑指南\n\n> 复制一个网站看似简单——拷贝文件、导入数据库、改个配置的事儿。但真正动手才发现：**最麻烦的从来不是复制动作本身，而是每个环节里那些不报错但静默失效的细节**。权限没递归、数据库用户没授权、配置里多了一个空格、SSL 证书路径少了个斜杠——这些才是克隆后花两小时才定位到的点。\n\n## 一、文件权限错乱：PHP 无法读取配置、静态资源 403\n\n### 问题根因\n\n直接复制网站根目录文件时，`www` 用户组和 `755\u002F644` 权限大概率丢失。尤其是当原站曾执行过类似以下的操作：\n\n```bash\n# 原站可能用过的命令\nchown -R www:www \u002Fwww\u002Fwwwroot\u002Fold-site\u002F\numask 0022\n```\n\n宝塔面板**不会自动同步源站的权限策略**，导致新站点出现以下症状：\n\n- PHP 无法读取配置文件（如 `.env`、`config.php`）→ 500 错误或数据库连接失败\n- 静态资源（CSS\u002FJS\u002F图片）返回 **403 Forbidden**\n- Laravel\u002FThinkPHP 等框架的 `storage` 目录无写入权限 → 日志写入失败\n\n### 解决方案\n\n复制网站后，**务必立即执行**以下命令修复权限：\n\n#### 步骤 1：修正文件所属用户和用户组\n\n```bash\n# 将新站点目录的所有者和所属组改为 www\nchown -R www:www \u002Fwww\u002Fwwwroot\u002F新站点目录\n```\n\n#### 步骤 2：统一修复目录权限为 755\n\n```bash\nfind \u002Fwww\u002Fwwwroot\u002F新站点目录 -type d -exec chmod 755 {} \\;\n```\n\n#### 步骤 3：统一修复文件权限为 644\n\n```bash\nfind \u002Fwww\u002Fwwwroot\u002F新站点目录 -type f -exec chmod 644 {} \\;\n```\n\n#### 步骤 4：特殊目录额外处理（Laravel\u002FThinkPHP 等框架）\n\n```bash\n# framework 目录（存储缓存）需 775\nchmod -R 775 \u002Fwww\u002Fwwwroot\u002F新站点目录\u002Fstorage\u002Fframework\u002F\n\n# runtime 目录（存储运行时文件）需 775\nchmod -R 775 \u002Fwww\u002Fwwwroot\u002F新站点目录\u002Fruntime\u002F\n\n# 确保这些目录的属主是 www\nchown -R www:www \u002Fwww\u002Fwwwroot\u002F新站点目录\u002Fstorage\u002F\nchown -R www:www \u002Fwww\u002Fwwwroot\u002F新站点目录\u002Fruntime\u002F\n```\n\n### 一键修复脚本（推荐）\n\n```bash\n#!\u002Fbin\u002Fbash\n# 修复网站权限一键脚本\n\nSITE_DIR=\"\u002Fwww\u002Fwwwroot\u002F新站点目录\"\n\n# 修复所属用户\nchown -R www:www \"$SITE_DIR\"\n\n# 修复目录权限\nfind \"$SITE_DIR\" -type d -exec chmod 755 {} \\;\n\n# 修复文件权限\nfind \"$SITE_DIR\" -type f -exec chmod 644 {} \\;\n\n# Laravel\u002FThinkPHP 特殊目录额外处理\nif [ -d \"$SITE_DIR\u002Fstorage\" ]; then\n    chmod -R 775 \"$SITE_DIR\u002Fstorage\"\n    chmod -R 775 \"$SITE_DIR\u002Fstorage\u002Fframework\"\n    chmod -R 775 \"$SITE_DIR\u002Fruntime\"\nfi\n\necho \"权限修复完成！\"\n```\n\n---\n\n## 二、数据库冲突：字符集、排序规则与用户权限\n\n### 问题根因\n\n宝塔面板**没有提供“一键克隆数据库”功能**，手动导出导入时容易遗漏以下细节：\n\n- **字符集不匹配**：导出时未指定字符集，导入后中文乱码\n- **排序规则不兼容**：MySQL 8.0+ 的 `utf8mb4_0900_ai_ci` 在低版本 MySQL 不兼容\n- **用户权限未迁移**：复用旧用户导致 `Access denied for user 'xxx'@'localhost'`\n\n### 解决方案\n\n#### 步骤 1：正确的数据库导出方式\n\n```bash\n# 显式指定字符集导出（推荐 utf8mb4）\nmysqldump --default-character-set=utf8mb4 -u root -p 数据库名 > \u002Ftmp\u002Fbackup.sql\n\n# 如果数据量较大，可加上压缩\nmysqldump --default-character-set=utf8mb4 -u root -p 数据库名 | gzip > \u002Ftmp\u002Fbackup.sql.gz\n```\n\n#### 步骤 2：创建新数据库时正确设置字符集\n\n在宝塔后台 **phpMyAdmin** 或命令行创建新数据库时：\n\n| 配置项 | 推荐值 | 说明 |\n|--------|--------|------|\n| 字符集 | `utf8mb4` | 支持 emoji 和更多字符 |\n| 排序规则 | `utf8mb4_unicode_ci` | 兼容性比 `utf8mb4_0900_ai_ci` 更广 |\n\n```sql\n-- 命令行创建数据库示例\nCREATE DATABASE new_database DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n```\n\n#### 步骤 3：创建独立的数据库用户\n\n**不要复用旧用户**！在宝塔后台 **数据库 → 添加数据库** 时创建新用户，并赋予以下权限：\n\n```sql\n-- 赋予新库的基本权限\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON new_database.* TO 'new_user'@'localhost';\n\n-- 刷新权限\nFLUSH PRIVILEGES;\n```\n\n> ⚠️ 宝塔后台的“数据库用户”列表里**看不到跨库权限**，建议在 phpMyAdmin 中确认用户权限。\n\n#### 步骤 4：导入数据库\n\n```bash\n# 导入时同样指定字符集\nmysql -u root -p --default-character-set=utf8mb4 new_database \u003C \u002Ftmp\u002Fbackup.sql\n```\n\n---\n\n## 三、站点配置文件：502、404 与 Nginx\u002FApache 故障\n\n### 问题根因\n\n宝塔将站点配置存储在 `\u002Fwww\u002Fserver\u002Fpanel\u002Fvhost\u002F` 目录下。**直接拷贝 `.conf` 文件会残留以下问题**：\n\n- 原域名未替换 → 访问新域名返回 404\n- 日志路径指向不存在目录 → Nginx 报错\n- SSL 证书路径指向原站 → 证书路径不存在，Nginx reload 失败\n\n### 解决方案\n\n**不要直接复制整个 `.conf` 文件**！正确做法如下：\n\n#### 步骤 1：在宝塔后台创建新站点\n\n```\n宝塔后台 → 网站 → 添加站点 → 填写新域名 → 提交\n```\n\n此操作会自动创建：\n- 新的站点目录\n- 新的配置文件（位于 `\u002Fwww\u002Fserver\u002Fpanel\u002Fvhost\u002Fnginx\u002F`）\n- 新的日志目录\n\n#### 步骤 2：手动迁移配置（非域名相关的逻辑）\n\n点击新站点 **设置 → 配置文件**，将原站点的以下内容手动复制过去：\n\n```nginx\n# 原站点配置（部分）\nserver {\n    listen 80;\n    server_name old-domain.com;\n    root \u002Fwww\u002Fwwwroot\u002Fold-domain.com;\n    \n    # 以下是需要迁移的内容：\n    \n    # PHP 传递参数\n    location ~ \\.php$ {\n        fastcgi_pass unix:\u002Ftmp\u002Fphp-cgi-74.sock;\n        fastcgi_index index.php;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n    \n    # 伪静态规则（如 WordPress）\n    if (!-e $request_filename) {\n        rewrite ^\u002F(.*) \u002Findex.php last;\n    }\n    \n    # 防盗链\n    location ~* \\.(jpg|png|gif|jpeg|css|js)$ {\n        valid_referers none blocked server_names ~\\.google\\. ~\\.baidu\\.;\n        if ($invalid_referer) {\n            return 403;\n        }\n    }\n}\n```\n\n#### 步骤 3：修改关键配置项\n\n| 配置项 | 原值 | 修改为 |\n|--------|------|--------|\n| `server_name` | old-domain.com | new-domain.com |\n| `root` | \u002Fwww\u002Fwwwroot\u002Fold-domain.com | \u002Fwww\u002Fwwwroot\u002Fnew-domain.com |\n| `access_log` | \u002Fwww\u002Fwwwlogs\u002Fold-domain.com.log | \u002Fwww\u002Fwwwlogs\u002Fnew-domain.com.log |\n| `error_log` | \u002Fwww\u002Fwwwlogs\u002Fold-domain.com.error.log | \u002Fwww\u002Fwwwlogs\u002Fnew-domain.com.error.log |\n\n#### 步骤 4：SSL 证书处理\n\n如果使用了 SSL：\n\n- **重新申请**：在宝塔后台 **网站 → 设置 → SSL → Let's Encrypt** 重新申请\n- **或手动上传**：上传新证书后修改以下路径：\n\n```nginx\n# 不要复制旧证书路径！\nssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fnew-domain.com\u002Ffullchain.pem;\nssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fnew-domain.com\u002Fprivkey.pem;\n```\n\n---\n\n## 四、WordPress 类站点：数据库配置同步\n\n### 需要修改的数据库表和文件\n\n#### wp-config.php 文件修改\n\n```php\n\u002F\u002F 修改数据库连接信息\ndefine( 'DB_NAME', 'new_database' );\ndefine( 'DB_USER', 'new_user' );\ndefine( 'DB_PASSWORD', 'new_password' );\ndefine( 'DB_HOST', 'localhost' );\n```\n\n#### 数据库中修改站点 URL\n\n```sql\n-- 登录 phpMyAdmin，选择新数据库，执行以下 SQL：\n\n-- 修改 siteurl\nUPDATE wp_options SET option_value = 'https:\u002F\u002F新域名.com' WHERE option_name = 'siteurl';\n\n-- 修改 home\nUPDATE wp_options SET option_value = 'https:\u002F\u002F新域名.com' WHERE option_name = 'home';\n```\n\n> ⚠️ 注意：`wp_options` 表的前缀可能不是 `wp_`，请根据实际前缀调整。\n\n---\n\n## 五、最稳妥的克隆流程总结\n\n### 推荐组合操作\n\n```\n1. cp -r 复制网站目录\n       ↓\n2. 宝塔后台新建站点（自动建配置+日志）\n       ↓\n3. 手动导入数据库（指定 utf8mb4 字符集）\n       ↓\n4. 修改应用配置（数据库连接、域名等）\n       ↓\n5. 修复文件权限（chown + chmod）\n```\n\n### 操作前检查\n\n```bash\n# 使用宝塔命令行工具检查服务状态\nbt 16\n\n# 输出示例：\n# Nginx: 运行中\n# MySQL: 运行中\n# PHP-FPM: 运行中\n```\n\n---\n\n## 结语\n\n克隆网站的坑不在于操作复杂，而在于**每个环节都有隐藏的细节点**。本文提到的权限修复、字符集选择、配置文件迁移、数据库用户创建——单独看每个步骤都不难，但组合在一起时，任何一个遗漏都会导致站点异常。\n\n> **记住这个原则**：复制后立即修复权限，导入前确认字符集，新建站点后手动迁移配置，创建独立的数据库用户。做好这四点，克隆站点就能稳如老狗。",null,0,31,1,"2026-03-17 15:14:30","2026-03-17 15:14:31",137,"Linux",{"id":22,"title":23},134," PHP 8：为现代Web开发注入新活力",{"id":25,"title":26},136,"前端性能优化实战指南：从加载到交互的全方位提升",[28,31,34,37,40],{"id":29,"name":30},106,"宝塔面板",{"id":32,"name":33},26,"MySQL",{"id":35,"name":36},36,"Nginx",{"id":38,"name":39},49,"ThinkPHP",{"id":41,"name":42},28,"数据库",3678,9,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002Fe9\u002Fd3ec2fd731439d21a2d4cc8746b39f.jpg",[47,52,57,62,67],{"id":48,"title":49,"create_time":50,"description":51},53,"Linux环境下Apahce的调优","2019-05-21 14:04:03","整理了部分有关Apahce调优的配置说明，后续陆续的将所有调优方式更新。",{"id":53,"title":54,"create_time":55,"description":56},50,"虚拟机安装Centos7后配置网络","2019-03-26 20:37:33","VMware虚拟机上安装min版的Centos7，并配置网络。虚拟机和centos7的安装在本文不做相关的介绍。",{"id":58,"title":59,"create_time":60,"description":61},85,"Linux环境PHP解压缩ZipArchive中的extractTo()方法，解压zip时文件丢失的问题","2020-04-30 17:17:44","在实际项目中要用ZipArchive解压ZIP文件，起初測试环境在Win环境中，測试通过，换到 LINUX 的环境中时  就出问题了（ZIP包中有文件和目录，包含带汉字的文件名称）\r\n\r\n问题的现象是：不带汉字的文件解压没有问题，另外有部分带汉字和数字字母的文件解压没有问题，然后其它纯文字的文件名称就丢失了，也没有报错，最后把问题定位到了extractTo()方法，这种方法是个封装的方法，看不到实际的源码。 \r\n\r\n经Google一番后，发现使用` getNameIndex `和` numFiles `",{"id":63,"title":64,"create_time":65,"description":66},78,"Centos7安装Docker","2019-12-28 14:17:23","### 安装docker\n\n安装命令\n\n``` bash\nyum install docker\n```\n\n启动docker并设置为开机启动\n\n``` bash\nservice docker start\nchkconfig docker on\n```\n\nLCTT 译注：此处采用了旧式的 sysv 语法，如采用CentOS 7中支持的新式 systemd 语法，如下：\n\n``` bash\nsystemcty start docker.service\nsystemcty enable docker.s",{"id":68,"title":69,"create_time":70,"description":71},21,"Cenos7.2下安装Apache2.4，MySQL5.7和PHP7.1","2019-01-17 22:48:15","一、主要软件：1、SecureCRT 5.1：是一款支持SSH（SSH1和SSH2）的终端仿真程序，简单地说是Windows下登录UNIX或Linux服务器主机的软件。2、WinSCP：是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。winscp也可以链接其他系统,比如linux系统。以上两款软件的具体使用可以通过搜索引擎分分钟查到。",1783431648616]