如何将 Magento 2 站点从本地主机转移到服务器?
已发表: 2019-06-06将基于 Magento 2 的站点从一台本地主机转移到另一台主机的过程并不耗时。 然而,它有许多细节和特殊方面,在进入这个过程之前应该考虑到这些细节和特殊方面。
在这篇博文中,我们将让 Magento 2 站点从 localhost 传输到服务器就像 Lego 一样简单。 让我们有一个见解。
目录
- 主要步骤
- 像乐高一样容易:分步指南
- 1. 当前主机上的 Magento 2 站点完整性检查
- 2. 准备好远程主机 (B)
- 3.远程主机检查(B)
- 4. 准备好传输数据
- 4.1。 文件转储
- 4.2. 数据库转储
- 5. 数据传输
- 6.数据解包
- 6.1。 文件解包
- 6.2. 数据库的导入
- 7.远程主机访问数据修正(B)
- 8.修正文件和目录的访问权限
- 10.故障排除:常见问题
- 问题 #1
- 问题 #2
- 问题 #3
- 问题 #4
- 问题 #5
- 底线
主要步骤
首先,让我们看一下转移的主要步骤:
- 当前主机上的 Magento 2 站点完整性检查 (A);
- 准备好远程主机(B);
- 远程主机检查(B);
- 准备好传输数据; 4.1。 文件转储; 4.2. 数据库转储;
- 数据传输;
- 数据解包; 6.1。 文件解包; 6.2. 数据库导入;
- 远程主机上的访问数据修正(B);
- 更正文件和目录的访问权限;
- 启动 Magento 之前的标准程序;
- 远程主机上的 Magento 性能检查(B);
- 常见问题的解决方案。
像乐高一样容易:分步指南
1. 当前主机上的 Magento 2 站点完整性检查
一切都很简单:运行并检查。 通常,应为此目的创建订单(完整周期)。 然后检查:
- 搜索;
- 产品页面,
- 类别,
- 客户的帐户。
这是一个重要的阶段,因为它可以让您避免纠结于迁移到新主机后什么时候停止运行的问题。 此外,这将使您不必处理可以提前解决的基本主机问题 (A)。
我鼓励你不要在没有任何紧急需要的情况下转移一半的 Magento 操作。 在开始传输过程之前,处理当前主机 (A) 上的所有问题要容易得多。 经过验证和测试 - 这将节省您的时间和颈部疼痛。
2. 准备好远程主机 (B)
部署 Magento 副本的服务器必须满足您的 Magento 版本的最低要求。
研究官方文档以了解有关这些要求的更多信息:https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements-tech.html
必须先设置环境,然后再进行传输过程的后续步骤(带有虚拟主机的 Web 服务器、PHP、数据库)。
不幸的是,每个单独部分的配置超出了本文的范围。 但是,您可以在网络上轻松找到所需的附加信息。 所以,应该没什么难度。
我建议特别注意是否存在所需的 PHP 扩展。
如果您对本教程的任何步骤有任何疑问,请发表评论。 我会尽力回答所有这些。
3.远程主机检查(B)
在转移 Magento 之前,请确保它在新主机上运行并且主机本身运行正常。 首先,检查网络服务器是否在指定的地址响应(我们假设主机已经配置)。
在我的示例中,我使用在 Linux 服务器上安装 Apache2 后立即可用的标准路径:
> /var/www/html
sudo -u apache echo "<?php phpinfo();?>" > /var/www/html/index.php
*这里和进一步,如果需要,命令将从相应的用户运行。 如果命令在没有用户名的情况下运行,则命令执行应以当前用户和任何相应权限的可用性为准。
如果运行此命令后没有出现错误,则一切正常,您的文件 `index.php` 必须在以下地址可用:{host}/index.php。 您的浏览器中的结果应该是这样的(尽管很大程度上仍然取决于您的 PHP 版本):
如果出现问题并且您没有看到有关您的 PHP 版本的信息,请提供有关您需要的 Web 服务器配置的相应指南。
另外,我建议提前研究日志——这会节省你大量的时间。
接下来,检查数据库服务是否已启动并正常运行:
mysql -u root -p
结果,您应该成功连接到 MySQL。 使用 `exit` 命令退出。
* 输入您在设置 MySQL 时使用的登录名和密码。
此外,成功连接到 MySQL 后,您需要检查现有数据库。
SHOW databases;
您计划传输的数据库名称不得与新服务器上已存在的数据库名称相同。 如果有类似的数据库,则应通过删除现有但未使用的数据库手动解决此问题,例如,或通过重命名您打算转移的 Magento 数据库。 请注意,您必须在 Magento 环境的配置文件 `app/etc/env.php` 中输入更改后的名称。
您的结果应如下所示:
此外,您需要检查服务本身是否已启动并使用netstat实用程序侦听标准端口:
netstat -vulntp | grep -i mysql
您的结果将如下所示:
> tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3366/mysqld
4. 准备好传输数据
4.1。 文件转储
在创建文件转储之前,我强烈建议您从 Magento 目录中删除所有不必要的文件,如果有的话,即旧转储、缓存、日志等。
rm -rf var/cache/* var/page_cache/* var/generation/* var/composer_home/cache/* var/log/* pub/static/*
这将允许您缩短流程。 除了避免传输不必要的文件外,您还将避免在没有任何特殊需要的情况下使用服务器空间。
*不要强行删除`.htaccess`和其他隐藏文件,如果你使用Apache2 web-server(`rf`命令默认不会删除它们)。 正确的 Magento 操作需要这些文件。
现在,转到我们的 Magento 在本地服务器 (A) 中的目录。 在我的示例中,它是:
> /Users/sergei/PhpstormProjects
Magento 的目录在aws-botapi
下命名。
让我们创建一个存档,以便进一步传输到远程主机 (B):
tar -zcf aws-botapi.tar.gz aws-botapi
您应该检查存档是否已创建:
ls -la aws-botapi.tar.gz
4.2. 数据库转储
如果在您的 Magento 站点上本地安排了多个单独的数据库,则必须将它们全部转移。 在我的示例中,使用了两个数据库。 您可以在 `db => connection => ` 部分的 Magento 环境 `app/etc/env.php` 的配置中找到它们。
现在,转储所有数据库:
mysqldump -u root -p db1 | gzip > ./db1.sql.gz mysqldump -u root -p db2 | gzip > ./db2.sql.gz
*使用数据库用户名和数据库名称等信息。
5. 数据传输
使用 `scp` 实用程序(通过 ssh 复制)或在您方便时使用任何其他方式(例如,通过 `ftp` 复制)传输 Magento 文件转储:
scp -i ~/.ssh/myprivatekey.pem aws-botapi.tar.gz [email protected]:/home/ec2-user
在哪里,
a) -i ~/.ssh/myprivatekey.pem 是用于连接的私钥的路径(如果您只使用密码,请忽略它);
b) ec2-user 是连接的用户名;
c) 52.12.187.98 是服务器地址;
d) /home/ec2-user是服务器上的绝对路径,我们将文件复制到其中。
*如果您使用与标准端口不同的端口,请不要忘记使用单独的参数来识别它(例如,`-P 6000` 表示 6000 端口)。
复制完成后,你会看到这样一行:
> aws-botapi.tar.gz 100% 312MB 4.3MB/s 01:11
对文件转储重复相同的操作:
scp -i ~/.ssh/myprivatekey.pem db1.sql.gz [email protected]:/home/ec2-user scp -i ~/.ssh/myprivatekey.pem db2.sql.gz [email protected]:/home/ec2-user
6.数据解包
6.1。 文件解包
在服务器 (B) 上,让我们导航到我们将档案复制到的目录。 让我们将 Magento 文件解压到本地主机的目录:
> tar -zxf aws-botapi.tar.gz -C /var/www/html/
确保检查文件是否已正确解包:
ls -la /var/www/html
如果 Magento 文件已解压到子目录,请使用 `mv` 或 `cp` 命令传输它们。
6.2. 数据库的导入
连接到服务器 (B) 上的 MySQL:
mysql -u root -p
现在,让我们创建一个新数据库:
CREATE DATABASE IF NOT EXISTS db1 CHARACTER SET utf8 COLLATE utf8_general_ci;
*结果应该是这样的:
> Query OK, 1 row affected (0.01 sec)
如果您有其他数据库,请执行类似操作。
然后,从转储中导入数据库:
gunzip < /home/ec2-user/db1.sql.gz | mysql -u root -p db1 gunzip < /home/ec2-user/db2.sql.gz | mysql -u root -p db2
连接到 MySQL:
mysql -u root -p
并检查所有数据库是否存在:
SHOW databases;
所有数据库的列表必须可用,包括我们的:
+--------------------+ | Database | +--------------------+ | db1 | | db2 | | information_schema | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.00 sec)
选择我们刚刚导入的数据库:
USE db1;
并检查表的存在:
SHOW tables;
如果表尚未创建或为空,请检查转储文件本身并再次重复整个过程,但创建新数据库的步骤除外(因为它已经存在)。
7.远程主机访问数据修正(B)
传输后在 Magento 中应更改的主要数据是 1)基本 URL 和 2)对 MySQL 的访问密钥:
更改基本 URL
您将需要更改 `core_config_data` 表中的所有旧路径。 首先,让我们使用包含旧地址的“值”查询来本地化这些字段。 假设旧网站地址是“1001101010.com”,那么搜索命令将如下所示:
SELECT * FROM core_config_data WHERE `value` LIKE '%1001101010.com%' \G
*`\G` 在查询末尾而不是 `;` 将使记录更好地阅读。
** 如果已安装,请不要忘记在表名之前使用 `table_prefix`。
结果将如下所示:
mysql> SELECT * FROM core_config_data WHERE `value` LIKE '%1001101010.com%' \G *************************** 1. row *************************** config_id: 2 scope: default scope_id: 0 path: web/unsecure/base_url value: http://1001101010.com/
*************************** 12. row *************************** config_id: 2401 scope: default scope_id: 0 path: web/secure/base_url value: https://1001101010.com/ *************************** 13. row *************************** config_id: 2402 scope: default scope_id: 0 path: web/secure/base_link_url value: https://1001101010.com/ 13 rows in set (0.00 sec)
此时,我们的目标是将旧地址更改为新地址。 为此,让我们确保确实应该在所有行中更改它(大多数情况下都是如此,除了一些涉及第 3 方模块配置的罕见情况)并运行以下查询:
UPDATE `core_config_data` SET `value` = replace(value, '1001101010.com', 'mynewdomain.com') WHERE `value` LIKE '%1001101010.com%';
它将把 `value` 字段中所有出现的 `1001101010.com` 行替换为 `mynewdomain.com` 行。
结果应该大约如下(行数应该相等):
> Query OK, 13 rows affected (0.00 sec) > Rows matched: 13 Changed: 13 Warnings: 0
以下请求:
SELECT * FROM core_config_data WHERE `value` LIKE '%1001101010.com%' \G
现在,是时候继续编辑环境文件 `app/etc/env.php`(来自 Magento 根目录;在示例中为 `/var/www/html/`)。
让我们在文本编辑程序中打开它(我用的是Nano ,虽然这肯定是个人喜好的问题)。
nano /var/www/html/app/etc/env.php
然后通过在“用户名”和“密码”字段中指定来自新服务器的准确数据来编辑“数据库”=>“连接”中的数据。
*重要! 如果您的数据库位于远程服务器上,则无需更改数据。 您唯一需要做的就是确保当前服务器可以访问该远程数据库。 (例如,它已被添加到数据库服务器上的防火墙白名单中)。
使用“主机”字段中的“本地主机”值来了解连接是否为本地连接。
接下来,保存文件。
8.修正文件和目录的访问权限
为了准确设置访问权限,您需要知道您的 Web 服务器从哪个用户以及哪个组运行。
最常见的是,它要么是 CentOS 的“apache”,要么是 Ubuntu 的“www-data”。 通常,用户名等于组名。 但是,在不同的服务器上,这可能会有所不同。
以下命令将帮助您弄清楚:
ps aux | egrep '(apache|httpd)'
结果,在第一列中,您将看到用户名(组名可能相同。但是,如果您不确定,请使用 `groups apache` 命令,其中 `apache` 是用户名,以便一探究竟)。
之后的第一件事,我们需要将 Magento 中的所有文件和目录传输给 web-server 用户(在示例中是 `apache`。对于 `www-data` 用户,只需将 `apache:apache` 替换为 ` www-data:www-data`,其他类似):
sudo chown -R apache:apache /var/www/html
接下来,检查是否已应用更改:
ls -la /var/www/html
所有文件和目录(除了标记为 `..` 的父文件和目录必须有一个用户和 `apache` 组(如果 `www-data` 是您系统中的网络服务器用户,那么它应该被标记为所有者):
现在,需要准确设置对 Magento 文件和目录的访问权限。 根据文档,强烈建议使用以下设置:
*所有命令必须从根 Magento 运行!,始终 1 后 1。在示例中,服务器上的 Magento 根是 `/var/www/html`。
使用 `pwd` 命令检查当前位置。
find var generated vendor pub/static pub/media app/etc -type f -exec chmod u+w {} + find var generated vendor pub/static pub/media app/etc -type d -exec chmod u+w {} + chmod u+x bin/magento
*如果当前用户缺乏运行这些命令的权限,请使用用户的 `root`(`sudo` 命令,如`sudo find ...`)
9. 启动 Magento 前的标准程序
是时候检查 Magento 是否从命令行启动了。 首先,让我们测试您可以访问的命令的标准输出:
*现在,在设置权限后,对 Magento 的任何访问都将由生成文件、缓存文件、静态等的同一网络服务器用户进行。如果您忽略这一点,Magento 可能会停止运行,您将被迫恢复权限再次(这些指南中的上一步)。
**为了准确操作,您需要在您的服务器上找到正确的php
解释器。 通常,`php` 别名指的是最新版本。 但是,您通常需要指明完整路径,例如 `/usr/bin/php72`。
***在这里,所有 Magento 命令都将从服务器 (B) 上的 Magento 根目录运行。
sudo -u apache php bin/magento list
这将使列表中的命令在命令行中可用:
如果一切顺利,您可以继续执行其他命令:
*如果在传输之前您没有清除带有缓存的目录和生成的文件,这是使用以下命令执行此操作的正确时间:
sudo rm -rf var/cache/* var/page_cache/* var/generation/*
sudo -u apache php bin/magento setup:upgrade
您可以避免运行此命令,但我仍然建议确保所有模块都已写入并且没有发生错误。 结果,您将看到一个包含已处理模块的列表,而在此过程中看不到任何错误。
执行编译以生成必要的 Magento 文件:
sudo -u apache php bin/magento setup:di:compile
*此时,检测已发生的所有错误至关重要。 否则,Magento 将无法正常运行。 如果没有发现错误,那么一切都是完美的。 ?
然后,生成静态(如果启用了生产模式。要检查您当前的模式,请使用以下命令:
sudo -u apache php bin/magento deploy:mode:show
sudo -u apache php bin/magento setup:static-content:deploy
*要为特定语言环境生成静态数据,请将其指定为命令后的参数。 例如,`sudo -u apache php bin/magento setup:static-content:deploy ru_RU` 将用于俄语语言环境。
恭喜! 您已成功将 Magento2 存储从 localhost 转移到新服务器上正常运行。 现在,通过输入新地址在浏览器中打开它!
10.故障排除:常见问题
问题 #1
问题:
如果在复制存档时,您会收到以下消息:
scp: /var/www/html/aws-botapi.tar.gz: Permission denied
然后,您应该首先检查您在服务器上复制存档的位置。 很有可能打算连接的用户没有在此目录中创建记录的权限(示例中为“/var/www/html”)。
解决方案:
这可以通过在运行`scp`命令或连接到服务器并调整当前用户对该目录的访问权限时更改您尝试复制的目录来解决:
`sudo chown -R ec2-user /var/www/html`(使用户成为 `/var/www/html` 目录以及所有包含的文件和目录的所有者),或
`sudo chmod -R o+w /var/www/html`(允许所有(`o-ther`)在目录`/var/www/html`中创建记录(`w-rite`)。
请谨慎使用这些命令,因为它们直接影响您的系统安全。
问题 #2
问题:
如果在导入数据库时出现如下错误`ERROR 1049 (42000): Unknown database 'db1'`(其中`db1`是数据库的名称),那么你的数据库还没有创建。
解决方案:
尝试访问`mysql`并再次重新创建此数据库。
问题 #3
问题:
如果在更改文件和目录所有者时,您看到命令 `chown: invalid user: ... `,那么您可能错误地在服务器上指定了 web-server 用户。
解决方案:
请查阅有关系统中服务器配置的相应指南或使用 `ps aux` 实用程序来确定正确的用户。
问题 #4
问题:
如果在新服务器上启动 Magento 时出现 PHP 错误(通常,这意味着缺少一些 PHP 扩展)......
解决方案:
这可以通过安装缺少的扩展来解决。
a) `使用 Monolog 的 NormalizerFormatter 需要 PHP 的 json 扩展` ―
缺少 *php-json* 扩展名;
b)`PHP致命错误:未捕获的错误:在......中找不到类'DOMDocument'' ―
缺少 *php-xml* 扩展名;
c) `PHP 致命错误:在...中找不到类“IntlDateFormatter”` ―
*php-intl* 扩展丢失。
问题 #5
问题:
如果在运行 `composer update` 命令时缺少 PHP 扩展,您将看到以下错误:
例如,
`phpunit/phpunit 6.5.14 需要 ext-mbstring * -> 您的系统中缺少请求的 PHP 扩展 mbstring。`
解决方案:
要处理此类错误,您只需安装作曲家所指的 PHP 扩展。 例如,`yum install php-mbstring`。
Magento 2 版本所需扩展的完整列表可以在官方文档中找到。
底线
你都准备好了! 在本文中,我尽力介绍了将 Magento 2 站点从本地主机转移到服务器的简单步骤。
如果您仍有疑问或希望分享您的意见,请随时使用下面的评论部分。 我会尽我所能回答所有的问题和疑虑!