如何將 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 站點從本地主機轉移到服務器的簡單步驟。
如果您仍有疑問或希望分享您的意見,請隨時使用下面的評論部分。 我會盡我所能回答所有的問題和疑慮!