Linux에서 WordPress 복제

王林
풀어 주다: 2023-09-03 08:25:06
원래의
759명이 탐색했습니다.

Linux에서 WordPress 복제

WordPress 복사가 그 어느 때보다 쉬워졌습니다

나는 종종 기존 웹사이트를 템플릿으로 기반으로 새로운 WordPress 웹사이트를 시작하는 것을 좋아합니다. 모든 것을 처음부터 반복해야 하는 새로 설치와 달리 테마, 플러그인 및 설정 구성은 처음부터 유용합니다.

Digital Ocean에서 재판매용 애플리케이션 이미지 구축에서는 설치 가능하고, 사전 구성되고, 사전 최적화된 WordPress 드롭릿을 구축하는 과정을 자세히 설명합니다. 본질적으로 이는 완전히 로드된 WordPress 웹 사이트를 몇 분 안에 시작할 수 있는 디지털 이미지의 바다입니다. 그러나 더 일반적으로는 내 기존 서버 중 하나에 WordPress 웹사이트를 추가하고 싶습니다.

이를 수행하는 방법에는 여러 가지가 있지만 매번 다시 배워야 할 것 같은 구체적이고 상세한 접근 방식이 필요하다는 것을 종종 알게 됩니다. 나는 이제 몇 분 안에 모든 작업을 수행할 수 있는 Linux 쉘 스크립트를 작성해야 한다고 결정했습니다.

이 튜토리얼에서는 제가 연구하고 생성한 WordPress 복제 스크립트를 안내해 드리겠습니다. 마음에 드셨으면 좋겠습니다. 완성했을 때 꽤 잘 됐다고 생각했어요.

시작하기 전에 제가 아래 토론에 참여하려고 노력한다는 점을 기억해 주세요. 질문이나 주제 제안이 있는 경우 아래에 의견을 남기거나 Twitter @reifman으로 저에게 연락하세요. 나에게 직접 이메일을 보내주셔도 됩니다. 많은 분들이 이 스크립트에 대해 더 나은 아이디어와 개선점을 가지기를 바랍니다. 나는 당신의 의견을 듣고 기쁘게 생각합니다.

WordPress 마이그레이션을 위한 다른 방법

일반적으로 기존 웹사이트를 새 서버로 마이그레이션하고(본질적으로 복사) 원본 웹사이트를 그대로 유지하면서 복사본을 기반으로 구축하여 새 웹사이트를 시작할 수 있습니다. 이를 달성하는 방법에는 여러 가지가 있습니다.

WordPress를 사용하여 새로운 서버 릴리스로 WordPress 마이그레이션에서 Duplicator 플러그인을 사용하여 이 작업을 수행하는 방법에 대해 썼지만 프로세스가 번거로웠습니다. 사이트를 옮겨야 할 때마다 복제기를 다시 알아보는 것도 어려웠습니다.

저는 최근 Envato Tuts+용 CodeGuard를 사용하여 WordPress 사이트 백업 및 복원에서 이에 대해 썼습니다. 이 서비스를 이용하면 절차가 더욱 쉬워집니다. 곧 ManageWP 사용의 많은 강력한 이점을 설명하는 여러 WordPress 웹사이트 관리를 단순화하는 방법을 게시할 예정입니다. 복제 기능이 있지만 FTP가 필요합니다. 보안상의 이유로 서버에서 FTP를 실행하지 않습니다.

또한 Rachel McCollin의 Envato Tuts+ 시리즈 2부작인 모바일 WordPress: 소개 및 모바일 WordPress: 플러그인으로 웹사이트 이동하기도 포함되어 있습니다. WPBeginner에 BackupBuddy를 사용하는 방법에 대한 튜토리얼이 있습니다. 마지막으로 WPClone에는 FTP가 필요하지 않지만 빌드하려면 WordPress를 새로 설치해야 합니다.

이 모든 튜토리얼과 서비스에서 많은 것을 배울 수 있지만, 매번 WordPress 사이트를 더 빠르고 쉽게 복제할 수 있는 명령줄 스크립트를 만들 수 있는지 알고 싶었습니다.

계획 스크립트

이 튜토리얼을 작성하기 위해 저는 bash 스크립팅 및 WordPress 웹 사이트 운영 속도를 높이기 위해 다른 사람들의 이전 작업에 크게 의존했습니다. 저는 제 자신을 전문적인 Linux 시스템 관리자라고 생각한 적이 없습니다. 궁극적으로 저는 Brian Gallagher의 WordPress Bash 설치 스크립트 위에 복제 스크립트를 구축하기로 결정했습니다.

참고: 이것은 Debian 기반 설치 스크립트입니다. 다른 버전의 Linux(예: RedHat 및 CentOS)에는 Apache 및 다른 유틸리티에 대한 경로가 다릅니다.

기본 스크립트에 대한 Gallagher의 설명은 다음과 같습니다.

최신 WP 버전을 다운로드하고, 사용자가 제공한 데이터베이스 이름, 사용자 이름 및 비밀번호로 wp-config를 업데이트하고, 업로드 디렉터리를 생성 및 CHMOD하고, 모든 파일을 스크립트가 실행 중인 루트 디렉터리에 복사한 다음 자체 삭제하세요!

잘 정리된 스크립트가 많이 있지만 저는 라이브 사이트를 복제하는 것을 만들고 싶었습니다. 일반적인 WordPress 구성의 아키텍처를 검토해 보겠습니다.

WordPress 웹사이트의 초기 구성 요소

일반적인 WordPress 설치에는 복제를 위한 네 가지 주요 구성 요소가 있습니다.

  1. 웹사이트의 디렉토리 트리
  2. 데이터베이스
  3. Apache 구성 파일과 같은 웹 서버 구성
  4. 도메인 매핑

정보, 액세스 권한 및 보안 설정도 필요합니다.

  • 서버 관리 계정 및 비밀번호
  • MySql 서버 사용자 이름 및 비밀번호
  • 웹사이트의 소스 디렉토리
  • 웹사이트용 웹 서버 구성 파일
  • 데이터베이스 이름, 사용자 이름 및 비밀번호

복제된 사이트에 대해 지정해야 할 사항은 다음과 같습니다.

  • 웹사이트의 대상 디렉토리를 복제하세요
  • 복제 데이터베이스 이름, 사용자 이름 및 비밀번호
  • 웹사이트의 웹 서버 구성 파일 복제

스크립트가 수행해야 하는 작업

  • 구성 변수 또는 사용자 입력을 통해 모든 설정을 가져옵니다.
  • 웹사이트 디렉토리를 복사하여 대상 디렉토리에 복원하세요.
  • 소스 데이터베이스를 내보내고 대상 데이터베이스로 가져옵니다.
  • 이 디렉터리에 적절한 권한이 있는지 확인하세요.

  • 서버 구성 파일을 복사하고 도메인 및 디렉터리 설정을 업데이트합니다.
  • 웹 서버를 다시 로드하세요.

새 대상 도메인의 DNS를 수동으로 업데이트해야 합니다. 웹사이트가 복제된 후 바로 사용할 수 있도록 시작하기 전에 DNS 레코드를 생성하는 것이 좋습니다. 사이트를 복제하고 DNS를 기다리고 있기 때문에 도메인 이름을 테스트할 수 없는 것보다 더 좋은 것은 없습니다.

복제 스크립트 구현 방법

이제 스크립트 아키텍처가 어떻게 작동하는지 살펴볼 준비가 되었습니다. 이번에도 Gallagher의 WordPress 설치 스크립트를 활용하여 시작했으며 상단에 초기 bash 라인이 필요합니다.

으아아아

DNS 설정 준비

사이트를 복사하기 전에 복제된 사이트에 대한 DNS를 구성해야 합니다. 여기에서 새로운 WordPress 사이트의 DNS 구성에 대해 읽을 수 있습니다. 나는 또한 이 Envato Tuts+ 튜토리얼 "DNS 레코드 학습 및 사용 소개"에 흥미를 갖고 있습니다.

기본적으로 원하는 복제 URL을 복제 중인 서버로 라우팅하는 A 레코드 또는 CNAME을 생성해야 합니다.

권한 설정

내 서버에서 clnewp.sh라는 bash 스크립트를 만들고 있습니다. 실행 권한이 필요합니다:

으아아아

그런 다음 완료되면 다음과 같이 실행할 수 있습니다.

으아아아

파일 권한 문제가 발생하지 않도록 스크립트를 sudo로 실행하는 것이 좋습니다.

기본값 설정

테스트 목적으로 기본 설정으로 스크립트를 미리 로드하는 함수를 만들었습니다. 모든 것을 반복해서 입력할 필요 없이 테스트를 반복해서 실행할 수 있도록 도와줍니다. 또한 스크립트를 수정하거나 나중에 다른 방식으로 사용하려는 모든 사람에게 이것이 유용할 수 있다고 생각합니다.

모든 기본 설정은 다음과 같습니다.

으아아아

이것이 많은 것 같지만 데이터베이스 백업, 데이터베이스 생성 및 가져오기를 위한 MySQL 마스터 사용자 및 비밀번호가 있으면 유용하다고 생각합니다. 그러나 wp-config.php 파일에서 대상 데이터베이스 권한을 설정하고 검색 및 교체하기 위해 사이트별 데이터베이스 사용자 및 비밀번호를 갖는 것도 유용합니다. 최종 복제 프로세스가 매우 원활해집니다.

저는 우리가 만드는 아카이브가 고유한지 확인하기 위해 NOW 타임스탬프를 사용합니다.

요청 설정

다음 코드는 사용자에게 기본값을 표시하고 이를 수락(Enter 누르기)하거나 바꿀 수 있도록 합니다.

으아아아

사용자의 설정을 모두 수집한 후 시작하고 싶은지 물어봅니다.

으아아아

디렉토리 트리 복사

지금은 상황이 더 빠르게 진행되고 있습니다. 소스 사이트의 타르볼을 생성하고, 대상 디렉토리를 생성한 후 거기에서 타르볼을 추출합니다:

으아아아

또한 WordPress의 표준 파일 권한을 실행하여 모든 것이 올바르고 안전하게 설정되었는지 확인합니다.

으아아아

WP-Config 파일 업데이트

다음으로 Perl을 사용하여 소스 데이터베이스 인증을 검색하고 대상 데이터베이스 정보로 바꿉니다.

으아아아

저도 RELOCATE 设置添加到文件末尾。如果您愿意,可以将其替换为静态 WP_HOMEWP_SITEURL설정하겠습니다.

데이터베이스 복사

다음으로 데이터베이스를 덤프하고 사용자가 제공한 권한으로 새 데이터베이스를 생성한 다음 해당 데이터베이스를 가져옵니다.

으아아아

원본 사이트 및 단일 사이트 복제 설정을 기반으로 데이터베이스 설정을 구성하는 동안 이러한 활동에는 기본 MySQL 인증을 사용하는 것이 가장 좋다는 것을 다시 한 번 깨달았습니다.

웹 서버 구성 복사

마지막으로 모든 작업을 마무리하고 시작 버튼을 누를 준비가 되었습니다. 그러한 스크립트가 웹 서버 구성을 관리하는 추가 단계를 수행하는 경우는 거의 없습니다. 그래서 나도 그러고 싶다.

복제된 새 .conf 파일에 원본 사이트의 Apache .conf 파일을 복사했습니다. 나는 도메인과 디렉토리 경로에 대한 문자열 대체를 수행하기 위해 Perl을 사용하고 있습니다. 그런 다음 Apache를 사용하여 사이트를 활성화하고 웹 서버를 다시 로드했습니다.

으아아아

그리고 그게 다입니다. 실제 생활에서 스크립트가 작동하는 방식은 다음과 같습니다.

으아아아

저의 작은 WordPress 사이트에서는 복사하는 데 30~90초 밖에 걸리지 않습니다!

절묘한 인쇄

아셔야 할 사항이 더 있습니다.

먼저 직접 로그인

먼저 복제된 웹사이트에 로그인하려면 소스 웹사이트 URL(예: http://clone.io/wp-login)로 리디렉션되는 wp-admin을 사용하는 대신 wp-login.php 경로를 사용해야 합니다. php는 아래와 같습니다:

Linux에서 WordPress 복제

도메인 이름 전환

WordPress는 데이터베이스의 소스 도메인 대부분을 하드코딩하기 때문에 wp-config.php의 RELOCATE 설정을 사용하면 일반 > 설정을 통해 쉽게 업데이트할 수 있다는 것을 알았습니다. 새로운 도착 URL을 사용하여 양식을 저장하세요:

Linux에서 WordPress 복제

복제된 대상 URL을 저장한 후 wp에서 RELOCATE settings-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 中的安全密钥

您还可以通过手动替换目标站点的 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에서 WordPress 복제

现在,如果您是 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 构建您的创业公司)。

相关链接

  • WordPress Bash 安装脚本,作者:Brian Gallagher
  • 移动 WordPress
  • 用于完整 WordPress 备份的 Shell 脚本,作者:Konstantin Kovshenin
  • CodeCanyon 上提供 WordPress 插件

위 내용은 Linux에서 WordPress 복제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!