我經常喜歡基於現有網站作為模板啟動新的 WordPress 網站。主題、外掛和設定的配置一開始就非常有用,這與您必須從頭開始重複所有內容的全新安裝不同。
在建置用於在 Digital Ocean 轉售的應用程式映像中,我詳細介紹了可安裝、預先設定和預先最佳化的 WordPress Droplet 的建置流程。本質上,它是一個數位海洋圖像,可以在幾分鐘內啟動一個完全加載的 WordPress 網站。但是,更常見的是,我想將 WordPress 網站新增到我自己的現有伺服器之一。
有很多方法可以做到這一點,但我經常發現它們需要特定而詳細的方法,我似乎每次都必須重新學習。我決定是時候編寫一個 Linux shell 腳本了,它可以在幾分鐘內為我完成所有工作。
在本教程中,我將引導您完成我的研究和生成的 WordPress 克隆腳本。我希望你喜歡它——當我完成它時,我認為它效果很好。
在我們開始之前,請記住,我確實嘗試參與下面的討論。如果您有問題或主題建議,請在下面發表評論或透過 Twitter @reifman 與我聯繫。您也可以直接寄電子郵件給我。我希望你們中的許多人會對這個腳本有更好的想法和改進。我很高興收到您的來信。
通常,您可以透過將現有網站遷移到新伺服器(本質上是複製它)並在副本上進行構建,同時保持來源網站完好無損來啟動新網站。有多種方法可以實現這一點。
在使用 WordPress 將 WordPress 遷移到新伺服器發布中,我寫了有關使用 Duplicator 外掛程式來執行此操作的文章,但我發現該過程很麻煩。每次我需要移動網站時重新熟悉複製器也很困難。
最近,我在使用 CodeGuard for Envato Tuts+ 備份和還原您的 WordPress 網站中寫了有關此內容的文章。這項服務使這個過程變得更加容易。很快,我們將發佈如何簡化管理多個 WordPress 網站,其中描述了使用 ManageWP 的許多強大優勢。它具有克隆功能,但需要 FTP — 出於安全原因,我避免在我的伺服器上執行 FTP。
還有 Rachel McCollin 的 Envato Tuts+ 系列兩部分:行動 WordPress:簡介和行動 WordPress:使用外掛程式移動您的網站。 WPBeginner 上有一個使用 BackupBuddy 的教學。最後,WPClone 不需要 FTP,但需要乾淨的 WordPress 安裝才能建置。
您可以從所有這些教學和服務中學到很多東西,但我想看看是否可以建立命令列腳本,每次都能更快、更輕鬆地克隆 WordPress 網站。
為了編寫本教程,我很大程度上依賴其他人早期的作品來快速了解 bash 腳本和 WordPress 網站操作的知識。我從來不認為自己是專業的 Linux 系統管理員。最終,我決定在 Brian Gallagher 的 WordPress Bash 安裝腳本之上建立我的克隆腳本。
注意:這些是基於 Debian 的安裝腳本;其他版本的 Linux(例如 RedHat 和 CentOS)對於 Apache 和不同的實用程式有不同的路徑。
這是加拉格爾對其基本腳本的描述:
下載最新的 WP 版本,使用使用者提供的資料庫名稱、使用者名稱和密碼更新 wp-config,建立並 CHMOD 的上傳目錄,將所有檔案複製到執行腳本的根目錄中,然後刪除自身!
這裡有很多組織良好的腳本,但我想製作一些可以克隆活動網站的東西。讓我們回顧一下典型 WordPress 配置的架構。
典型的 WordPress 安裝有四個用於複製的主要元件:
我們還需要資訊、存取權限和安全設定:
以下是我們需要為克隆網站指定的內容:
我們必須手動更新新目標網域的 DNS。我建議您在開始之前建立 DNS 記錄,以便在克隆您的網站後它們可以準備就緒。沒有什麼比克隆網站而無法測試網域更好的了,因為您正在等待 DNS。
現在,我們準備好逐步了解腳本的架構是如何運作的。再次,我首先利用了 Gallagher 的 WordPress 安裝腳本,並且您需要頂部的初始 bash 行:
#!/bin/bash -e # Clone a WordPress site via Bash script clear echo "===================================================" echo "Clone WordPress Script" echo "==================================================="
在複製網站之前,您需要為克隆網站設定 DNS。您可以在此處閱讀有關新 WordPress 網站的 DNS 配置的資訊。我也對這個 Envato Tuts+ 教程「學習和使用 DNS 記錄簡介」感到很興奮。
基本上,您需要建立一條 A 記錄或 CNAME,將所需的複製 URL 路由到我們正在複製的伺服器。
在我的伺服器上,我正在建立一個名為clnewp.sh 的bash 腳本。它將需要可執行權限:
chmod +x clonewp.sh
然後,一旦完成,您可以像這樣運行它:
sudo bash clonewp.sh
我建議以 sudo 身分執行腳本,這樣您就不會遇到檔案權限問題。
出於測試目的,我創建了使用預設設定預先載入腳本的功能。它幫助我反覆運行測試,而不必一遍又一遍地輸入所有內容。我還認為這對於以後想要修改腳本或以其他方式使用它的人來說可能很有用。
以下是所有預設設定:
# Set Default Settings (helpful for testing) default_mysql_user=$"root-admin" default_mysql_pass=$"super-strong-password" default_source_domain=$"gardening.io" default_target_domain=$"cycling.io" default_source_directory=$"/var/www/gardening" default_target_directory=$"/var/www/cycling" default_apache_directory=$"/etc/apache2/sites-available" default_source_conf=$"gardening.conf" default_target_conf=$"cycling.conf" default_source_dbname=$"gardening" default_source_dbuser=$"user_for_garden" default_source_dbpass=$"pwd_garden" default_target_dbname=$"cycling" default_target_dbuser=$"user_for_cycling" default_target_dbpass=$"pwd_cycling" NOW=$(date +"%Y-%m-%d-%H%M")
我知道這看起來很多,但我發現擁有一個 MySQL 主用戶和密碼對於資料庫備份、資料庫建立和匯入很有用。然而,擁有特定於網站的資料庫使用者和密碼來設定目標資料庫權限以及在 wp-config.php 檔案中搜尋和替換也很有用。它使最終的克隆過程非常無縫。
我使用 NOW 時間戳來確保我們建立的檔案是唯一的。
以下程式碼向使用者顯示預設值,並允許他們接受它(按回車鍵)或替換它:
# Request Source Settings read -p "Source Domain (e.g. "$default_source_domain"): " source_domain source_domain=${source_domain:-$default_source_domain} echo $source_domain read -p "Source Directory (no trailing slash e.g. "$default_source_directory"): " source_directory source_directory=${source_directory:-$default_source_directory} echo $source_directory read -p "Source Database Name (e.g. "$default_source_dbname"): " source_dbname source_dbname=${source_dbname:-$default_source_dbname} echo $source_dbname read -p "Source Database User (e.g. "$default_source_dbuser"): " source_dbuser source_dbuser=${source_dbuser:-$default_source_dbuser} echo $source_dbuser read -p "Source Database Pass (e.g. "$default_source_dbpass"): " source_dbpass source_dbpass=${source_dbpass:-$default_source_dbpass} echo $source_dbpass # Request Source Settings read -p "Source Conf File (e.g. "$default_source_conf"): " source_conf source_conf=${source_conf:-$default_source_conf} echo $source_conf # Request Target Settings read -p "Target Domain (e.g. "$default_target_domain"): " target_domain target_domain=${target_domain:-$default_target_domain} echo $target_domain read -p "Target Directory (no trailing slash e.g. "$default_target_directory"): " target_directory target_directory=${target_directory:-$default_target_directory} echo $target_directory read -p "Target Database Name (e.g. "$default_target_dbname"): " target_dbname target_dbname=${target_dbname:-$default_target_dbname} echo $target_dbname read -p "Target Database User (e.g. "$default_target_dbuser"): " target_dbuser target_dbuser=${target_dbuser:-$default_target_dbuser} echo $target_dbuser read -p "Target Database Pass (e.g. "$default_target_dbpass"): " target_dbpass target_dbpass=${target_dbpass:-$default_target_dbpass} echo $target_dbpass read -p "Target Conf File (e.g. "$default_target_conf"): " target_conf target_conf=${target_conf:-$default_target_conf} echo $target_conf
一旦我們收集了用戶的所有設置,我們就會詢問他們是否願意開始:
echo "Clone now? (y/n)" read -e run if [ "$run" == n ] ; then exit else echo "===================================================" echo "WordPress Cloning is Beginning" echo "==================================================="
現在事情進展得更快了。我們創建來源站點的 tarball,創建目標目錄並在那裡提取 tarball:
#backup source_directory cd $source_directory # add -v option to these if you want to see verbose file listings tar -czf source_clone_$NOW.tar.gz . #unzip clone in target directory mkdir -p $target_directory tar -xzf source_clone_$NOW.tar.gz -C $target_directory #remove tarball of source rm source_clone_$NOW.tar.gz cd $target_directory
我們也執行 WordPress 的標準檔案權限,以確保一切設定正確且安全:
# Reset Directory Permissions find $target_directory -type d -exec chmod 755 {} \; find $target_directory -type f -exec chmod 644 {} \;
接下來,我們使用perl搜尋並用目標資料庫資訊取代來源資料庫驗證:
#set database details with perl find and replace perl -pi -e "s/$source_dbname/$target_dbname/g" wp-config.php perl -pi -e "s/$source_dbuser/$target_dbuser/g" wp-config.php perl -pi -e "s/$source_dbpass/$target_dbpass/g" wp-config.php echo "define('RELOCATE',true);" | tee -a wp-config.php #echo "define('WP_HOME','http://$target_domain');" | tee -a wp-config.php #echo "define('WP_SITEURL','http://$target_domain');" | tee -a wp-config.php echo "================================" echo "Directory duplicated" echo "================================"
我也會將 RELOCATE
設定加入到檔案結尾。如果您願意,可以將其替換為靜態 WP_HOME
和 WP_SITEURL
設定。
接下來,我們轉儲資料庫,使用使用者提供的權限建立一個新資料庫,然後將資料庫匯入其中:
# Begin Database Duplication # Export the database mysqldump -u$mysql_user -p$mysql_pass $source_dbname > $target_directory/clone_$NOW.sql # Create the target database and permissions mysql -u$mysql_user -p$mysql_pass -e "create database $target_dbname; GRANT ALL PRIVILEGES ON $target_dbname.* TO '$target_dbuser'@'localhost' IDENTIFIED BY '$target_dbpass'" # Import the source database into the target mysql -u$mysql_user -p$mysql_pass $target_dbname < $target_directory/clone_$NOW.sql echo "================================" echo "Database duplicated" echo "================================"
我再次發現,最好在這些活動中使用主 MySQL 驗證,同時根據來源網站和單一網站複製設定配置資料庫設定。
最後,我們準備好結束一切並按下啟動按鈕。我很少看到此類腳本管理 Web 伺服器配置的額外步驟。所以我也想這麼做。
我將來源網站的 Apache .conf 檔案複製到複製的新 .conf 檔案中。我使用 perl 對域和目錄路徑進行字串替換。然後,我使用 Apache 啟動了該網站並重新載入了 Web 伺服器:
#Activate Web Configuration cp $default_apache_directory/$source_conf $default_apache_directory/$target_conf #set database details with perl find and replace perl -pi -e "s/$source_domain/$target_domain/g" $default_apache_directory/$target_conf perl -pi -e "s|${source_directory}|${target_directory}|g" $default_apache_directory/$target_conf a2ensite $target_conf service apache2 reload echo "================================" echo "Web configuration added" echo "================================" echo "Clone is complete." echo "Test at http://"$target_domain echo "================================" fi
而且,就是這樣。以下是腳本在現實生活中的運作情況:
=================================================== Clone WordPress Script =================================================== MySQL Master Username (e.g. root-admin): harry_potter harry_potter MySQL Master Password (e.g. super-strong-password): voldemoort~jenny7! voldemoort~jenny7! Source Domain (e.g. gardening.io): gardening.io Source Directory (no trailing slash e.g. /var/www/gardening): /var/www/gardening Source Database Name (e.g. gardening): database_gardening database_gardening Source Database User (e.g. user_for_garden): hermione hermione Source Database Pass (e.g. pwd_garden): !987654321abcdefgh# !987654321abcdefgh# Source Conf File (e.g. gardening.conf): gardening.conf gardening.conf Target Domain (e.g. cycling.io): cycling.io Target Directory (no trailing slash e.g. /var/www/cycling): /var/www/cycling /var/www/cycling Target Database Name (e.g. cycling): database_cycling database_cycling Target Database User (e.g. user_for_cycling): hedwig hedwig Target Database Pass (e.g. pwd_cycling): pwd_for_cycling_not_hogwartz Target Conf File (e.g. cycling.conf): 0007b-cycling.conf 0007b-cycling.conf Clone now? (y/n) y =================================================== WordPress Cloning is Beginning =================================================== tar: .: file changed as we read it define('RELOCATE',true); ================================ Directory duplicated ================================ ================================ Database duplicated ================================ Enabling site 0007b-cycling. To activate the new configuration, you need to run: service apache2 reload * Reloading web server apache2 * ================================ Web configuration added ================================ Clone is complete. Test at http://cycling.io ================================
在我的小型 WordPress 網站上,複製只需要 30 到 90 秒!
您還需要了解更多。
首先,要登入克隆的網站,您需要使用wp-login.php 路徑,而不是使用重定向到來源網站網址的wp-admin,例如http://clone.io/wp-login.php如下圖:
由於 WordPress 在資料庫中硬編碼了大部分來源域,我發現使用 wp-config.php 中的 RELOCATE
設定可以輕鬆透過常規 > 設定進行更新。您只需使用新的目標網址儲存表單即可:
儲存複製的目標 URL 後,您可以從 wp 中刪除 RELOCATE
設定-config.php 手動。
但是,一位同事建议您可能需要使用 InterconnectIT 的 WordPress 数据库搜索和替换等工具。 Envato Tuts+ 中的“跨主机、服务器和 URL 迁移 WordPress”中也对此进行了记录。
这是 wpclone.sh 的最终脚本 - 请随意更改默认值:
#!/bin/bash -e # Clone a WordPress site via Bash script clear echo "===================================================" echo "Clone WordPress Script" echo "===================================================" # Set Default Settings (helpful for testing) default_mysql_user=$"root-admin" default_mysql_pass=$"super-strong-password" default_source_domain=$"gardening.io" default_target_domain=$"cycling.io" default_source_directory=$"/var/www/gardening" default_target_directory=$"/var/www/cycling" default_apache_directory=$"/etc/apache2/sites-available" default_source_conf=$"gardening.conf" default_target_conf=$"cycling.conf" default_source_dbname=$"gardening" default_source_dbuser=$"user_for_garden" default_source_dbpass=$"pwd_garden" default_target_dbname=$"cycling" default_target_dbuser=$"user_for_cycling" default_target_dbpass=$"pwd_cycling" NOW=$(date +"%Y-%m-%d-%H%M") #Request MySQL Admin read -p "MySQL Master Username (e.g. "$default_mysql_user"): " mysql_user mysql_user=${mysql_user:-$default_mysql_user} echo $mysql_user read -p "MySQL Master Password (e.g. "$default_mysql_pass"): " mysql_pass mysql_pass=${mysql_pass:-$default_mysql_pass} echo $mysql_pass # Request Source Settings read -p "Source Domain (e.g. "$default_source_domain"): " source_domain source_domain=${source_domain:-$default_source_domain} echo $source_domain read -p "Source Directory (no trailing slash e.g. "$default_source_directory"): " source_directory source_directory=${source_directory:-$default_source_directory} echo $source_directory read -p "Source Database Name (e.g. "$default_source_dbname"): " source_dbname source_dbname=${source_dbname:-$default_source_dbname} echo $source_dbname read -p "Source Database User (e.g. "$default_source_dbuser"): " source_dbuser source_dbuser=${source_dbuser:-$default_source_dbuser} echo $source_dbuser read -p "Source Database Pass (e.g. "$default_source_dbpass"): " source_dbpass source_dbpass=${source_dbpass:-$default_source_dbpass} echo $source_dbpass # Request Source Settings read -p "Source Conf File (e.g. "$default_source_conf"): " source_conf source_conf=${source_conf:-$default_source_conf} echo $source_conf # Request Target Settings read -p "Target Domain (e.g. "$default_target_domain"): " target_domain target_domain=${target_domain:-$default_target_domain} echo $target_domain read -p "Target Directory (no trailing slash e.g. "$default_target_directory"): " target_directory target_directory=${target_directory:-$default_target_directory} echo $target_directory read -p "Target Database Name (e.g. "$default_target_dbname"): " target_dbname target_dbname=${target_dbname:-$default_target_dbname} echo $target_dbname read -p "Target Database User (e.g. "$default_target_dbuser"): " target_dbuser target_dbuser=${target_dbuser:-$default_target_dbuser} echo $target_dbuser read -p "Target Database Pass (e.g. "$default_target_dbpass"): " target_dbpass target_dbpass=${target_dbpass:-$default_target_dbpass} echo $target_dbpass read -p "Target Conf File (e.g. "$default_target_conf"): " target_conf target_conf=${target_conf:-$default_target_conf} echo $target_conf echo "Clone now? (y/n)" read -e run if [ "$run" == n ] ; then exit else echo "===================================================" echo "WordPress Cloning is Beginning" echo "===================================================" #backup source_directory cd $source_directory # add -v option to these if you want to see verbose file listings tar -czf source_clone_$NOW.tar.gz . #unzip clone in target directory mkdir -p $target_directory tar -xzf source_clone_$NOW.tar.gz -C $target_directory #remove tarball of source rm source_clone_$NOW.tar.gz cd $target_directory # Reset Directory Permissions find $target_directory -type d -exec chmod 755 {} \; find $target_directory -type f -exec chmod 644 {} \; #set database details with perl find and replace perl -pi -e "s/$source_dbname/$target_dbname/g" wp-config.php perl -pi -e "s/$source_dbuser/$target_dbuser/g" wp-config.php perl -pi -e "s/$source_dbpass/$target_dbpass/g" wp-config.php echo "define('RELOCATE',true);" | tee -a wp-config.php #echo "define('WP_HOME','http://$target_domain');" | tee -a wp-config.php #echo "define('WP_SITEURL','http://$target_domain');" | tee -a wp-config.php echo "================================" echo "Directory duplicated" echo "================================" # Begin Database Duplication # Export the database mysqldump -u$mysql_user -p$mysql_pass $source_dbname > $target_directory/clone_$NOW.sql # Create the target database and permissions mysql -u$mysql_user -p$mysql_pass -e "create database $target_dbname; GRANT ALL PRIVILEGES ON $target_dbname.* TO '$target_dbuser'@'localhost' IDENTIFIED BY '$target_dbpass'" # Import the source database into the target mysql -u$mysql_user -p$mysql_pass $target_dbname < $target_directory/clone_$NOW.sql echo "================================" echo "Database duplicated" echo "================================" #Activate Web Configuration cp $default_apache_directory/$source_conf $default_apache_directory/$target_conf #set database details with perl find and replace perl -pi -e "s/$source_domain/$target_domain/g" $default_apache_directory/$target_conf perl -pi -e "s|${source_directory}|${target_directory}|g" $default_apache_directory/$target_conf a2ensite $target_conf service apache2 reload echo "================================" echo "Web configuration added" echo "================================" echo "Clone is complete." echo "Test at http://"$target_domain echo "================================" fi
如果您有建议和定制,请告诉我。在下面的评论中发表您的想法。
以下行可能有助于您删除和撤消克隆的测试站点。您可以根据您的需要对其进行自定义:
sudo rm -ifr /var/www/clone sudo a2dissite clone.conf sudo service apache2 reload sudo rm /etc/apache2/sites-available/clone.conf mysql -u root -p -e "drop database clone;"
您还可以通过手动替换目标站点的 wp-config.php 中的身份验证密钥和盐来更好地保护您的新 WordPress 站点:
/**#@+ * Authentication Unique Keys and Salts. * * Change these to different unique phrases! * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service} * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again. * * @since 2.6.0 */ define('AUTH_KEY', '+9%S?YVnr%5Vr!Et4J,@9/Z^.kT_Lu~5SGwr9=|Y &D-ARSWf$mF#J_3U:/iE>-R'); define('SECURE_AUTH_KEY', 'e3Wr7%Aa7H1,f<SR[Sp&g.kJw,.)bR-9jz{uU&[R{[J]ITK8q>:!5@y:Q;c01dL '); define('LOGGED_IN_KEY', '1I%pW%UyjRMqy__Da)siA)+V]Ur$9uXPmxv|eBjM~-m&-<WEy&+XXb43uh8&aP+U'); define('NONCE_KEY', 'A9]+PFgvxYa^<B}_.F?9A,!&i-.b6E.I?&?U*)X.Vh+fq`SfE[XJG+MG|pg;y%Ah'); define('AUTH_SALT', 'gT (4]L{mm!|>9kC<%59rB7sbe1)jW0GCnfupJT+8z-z#%o@b|[QH=i@h|-/t!9S'); define('SECURE_AUTH_SALT', 'ON8K<,WSy8+F ~XaQpCwC8(a/{HksMh<T)QLD]s[-:yv+fx8!`<!*~mgB32X:w5k'); define('LOGGED_IN_SALT', 'vHJ%{=X6$ue>ZIo|%|cisp1R}9cJ< Rz-J;H|:O2A7$+*aGXMH!+KvD+tZ/I*U5$'); define('NONCE_SALT', '[ytQ;C)BvgU!#>a,,g|)~EKBQUig7Uv.-8?q%lmFte,P>,]f#.}i`Wx8S+_S@&.('); /**#@-*/
您只需访问 https://api.wordpress.org/secret-key/1.1/salt/ 并将它们剪切并粘贴到您的 wp-config.php 文件中即可:
现在,如果您是 Linux 脚本纯粹主义者,我将允许您更新 Gallagher 的 WordPress Bash 安装脚本。他的脚本复制了默认的 WordPress wp-config.php,因此他可以使用可预测的源字符串来替换他的脚本生成的密钥:
#set WP salts perl -i -pe' BEGIN { @chars = ("a" .. "z", "A" .. "Z", 0 .. 9); push @chars, split //, "!@#$%^&*()-_ []{}<>~\`+=,.;:/?|"; sub salt { join "", map $chars[ rand @chars ], 1 .. 64 } } s/put your unique phrase here/salt()/ge ' wp-config.php
我从未编写过正则表达式来替换我们源站点的动态预先存在的 wp-config.php 文件中的键值。如果您决定这样做,请在评论中分享并提前致谢。
我非常喜欢让这个脚本工作。或者,我至少应该说我喜欢在完成后运行它。我希望我很久以前就创建了它,因为它非常有效和高效。我可以克隆小型 WordPress 网站,并在大约 60 秒内让它们在我的服务器上运行。其他插件或复制选项都不是那么无缝。
如果您有任何疑问,请在下面发布。或者,您可以通过 Twitter @reifman 联系我或直接给我发电子邮件。请查看我的 Envato Tuts+ 讲师页面,查看我编写的其他教程,例如我的创业系列(使用 PHP 构建您的创业公司)。
以上是在Linux中克隆WordPress的詳細內容。更多資訊請關注PHP中文網其他相關文章!