Linode + LAMP + 宝塔 网站部署/迁移实战中遇到的问题/坑及解决办法
Posted by Admin L in WordPress Experience, UNIX/Linux, Web Programming & Resources, Database, IT Resources/Information on 01-02-2020.
作者:牧山道人
原文地址:https://www.seeksunslowly.com/linode-centos-lamp-bt-panel-website-solutions
转载请注明出处,谢谢。
_____________________________________
背景:
之前的旧网站运行了十年左右,采用 Linode + CentOS 5.x + Kloxo 搭建。2020 年1 月底,发现 Chrome 对已采用 SSL 加密的网站显示“You connection to this site is not fully secure”,进一步了解到主流浏览器即将不支持 TLSv1.1-,而我的所有网站全是 TLSv1.0。这对于运行中的生产网站是比较严重的问题,亟待解决。
其实,由于 OS 及 Linux 套件都是老古董,早有重新部署的打算。但知道这是件非常折腾的事,加之网站运行还算良好,故迟迟未动手。
现在,由于“业界规范催逼 + 新冠疫情赋闲在家”两大原因,正好是迁移(或称重新部署更妥贴,因为“迁移”实在不算什么事)的好时机。
<<<<<< 背景大致如此,进入正题 >>>>>>
说明:
1、本文不会列出一些网上唾手可得的经验或教程,本次分享旨在让您遇到相同或类似问题时少走弯路。
2、本文只列出一些耗时较久的问题/坑及解决方案,并未列出此次实作的全部经验,如果您有其他问题请留言,笔者会在时间及能力允许范围内为您解答。
新环境:
Linode + 宝塔面板 7.0.1 + CentOS 7.6 + Apache 2.4.41 + MySQL 5.6.44 + PHP 7.3
问题及解决:
## 搬家效率:对于网站文件/程序,最高效的办法是在 Linux 命令行模式下,先对旧站文件作 tar cvf、gzip -9,然后再在新站 wget、gzip -d、tar xvf。而不是逐个从旧站 FTP 到本机,再从本机 FTP 到新站。效果可提升无数倍!
千万注意:趁旧站仍可通过 HTTP/HTTPS 访问时先压缩文件并在新主机用 wget 获取,否则仍可能需要 FTP 中转。
## 初级安全:修改 FTP 及 SSH 端口,之前的岁月被攻击过 N 次,为了减少后期维护成本,建议搭好环境后立即修改。FTP 在宝塔 FTP 模块、SSH 在宝塔安全模块。若能安装 Fail2ban 更佳。
## 测试要点:测试网页展示效果(特别是测 301 重定向、404) 时,为避免服务器、ISP、局网、本机及浏览 Cookies、DNS 等因素的影响,最好使用在线代理作测试。推荐 https://www.hidemyass-freeproxy.com/。
## PHP mail():如果要用 PHP mail() 函数发邮件,装上宝塔邮局管理器(免费插件:在“软件商店 -> 宝塔插件”下)即可,不用任何额外配置。主要目的是为了开启 SMTP 服务(25 端口)。当然,手动在命令行模式下安装相关软件并启用服务也行,但既然要用面板,能简则简。
## MySQL 库迁移:若 Db 较大,phpMyAdmin 的导入功能不好使,可以到宝塔的数据库模块导入(注意压缩成 .zip 以节省时间)。
## 解析 HTML 文件中的 PHP code:如果在网站配置或伪静态 .htaccess 中加 AddType / AddHandler 无果,不要再到处去寻找关于 AddType/AddHandler 的正确写法了,为此我折腾了一天时间,正解——修改两处即可:
PHP FPM Settings:
/www/server/php/73/php-fpm.conf
末尾增加:security.limit_extensions = .php .php3 .php4 .php5 .php7 .htm .html
Site Settings 修改:
/www/server/panel/vhost/apache/domain.conf
#PHP/HTM/HTML
<FilesMatch \.(php|htm|html)$>
SetHandler “proxy:unix:/tmp/php-cgi-73.sock|fcgi://localhost”
</FilesMatch>
## 404 常规配置:取消网站配置 errordocument 注释(两处,80 及 443),并将页面指定为您自己的 404 页面。
## 404 for PHP HTML 页面配置:在 Apache 配置档 httpd.conf <IfModule mime_module> 段加入 ProxyErrorOverride on 即可,否则 404 会由 PHP 解析器来抛出。
## PHP 网络类代码总报错:如果配置的确无误,但新站 PHP 代码总报错,特别是引用 URL 的代码,如 PHP file_get_contents() 函数,不要着急,一般情况是域名 DNS 解析尚未生效或服务器本机 DNS 未更新,稍作等待即可。
## 承上,让服务器 DNS 快速生效:服务器 DNS 未生效时,可修改 /etc/resolv.conf,将 Google DNS 作为首选项,以便让网站可立即访问(通常域名 DNS 生效只要几分钟,但 Linode VPS DNS 生效通常需要 24~48 小时),待 Linode VPS DNS 生效后再重启主机即可(重启默认会还原 /etc/resolv.conf,此时已不重要)。总之:很多令人纠结的问题都是 DNS,特别是服务器 DNS 造成的!此外,为确保您打开的页面不是“假”的,前文也特别提到用代理测试。
## PHP 中的 MySQL 交互代码:除了 SQL 语句,几乎全部要改,PHP 7.3 不再认 mysql_*,统统使用 mysqli_*,这当然不是什么问题,打开 error_reporting 逐个调试即可。单列出来是为了提醒您别忘了测试所有 php 代码是否能正常工作。
## WordPress 网站问题:本次笔者共迁移成功 7 个网站,其中有两个是基于 WP 的。注意两点:为保证 WP 网站运行正常,最好在新服务器使用兼容或同样的 PHP 版本;别外 HTTP 改 HTTPS 要记得把文章内容中(`wp_posts`表)的 HTTP 换掉。
## 世无完美之事:HTTP to HTTPS、WWW to Non WWW 重定向,或四者的各种交叉,本是很简单的事,之前的 7 个旧站运行良好。但由于网站 TLS 升级,导致旧 APP 端不能获取 HTTPS 页面内容(注意是获取内容,不是打开),为此需要保留部分 HTTP URL 供 APP 使用。然后去折腾一些较特殊重定向,比如除了 http://domain.* 格式全部重定向为 https://www.domain.*,然后发现类似的需求几乎没有,也是浪费了不少时间。如果您有时间又非常喜欢研究技术,可以好好系统地学习一下 Apache Rewrite 及正则表达式,这种需求都是小菜;但我这边有不少客户在发邮件投诉了,时不我待,必须第一时间保证网站迁移后不影响 APP 端用户。所以,QTM 的重定向,将 .htaccess 里的重定向删空,问题解决了,世界清静了~~~~ 为了莫须有的“完美”且标准网址格式折腾没有必要!再说,Google 一下 “http://domain.*” “https://domain.*”这不没收录么,也没有第三方网站引用,不影响 SEO;以前自己编的理由说重定向到标准网址也为了防止用户手工误输,到放弃时,我不禁问自己:“你一个长达 26 个字母的域名,一个连自己都养得倒死不活的网站,用户凭什么要手输你的网址??” 。我想,作为一个处女座,有时也得为了生活对“完美”折衷吧。