轉換WordPress 到新的伺服器

Max遇到一個問題,就是WordPress 所安裝的伺服器的「建立資料庫連線時,發生錯誤」常會掛掉,也找不到是什麼原因(可能是沒有認真去找)。


先換一台新的伺服器看看,有沒有辦法改善,下面就稱舊的伺服器為A服,新的伺服器為B服。

與 mysql database 連線有關文章:
Too many connections
https://dev.mysql.com/doc/refman/8.0/en/too-many-connections.html

新的伺服器,如果RAM 較少,可以先設定 swap:
Linux的 VPS 上設定虛擬記憶體 (Swap)
https://stackoverflow.max-everyday.com/2016/05/linux-vps-swap/

linux下有有文件數操作最大限制,超過限制(同時開啟1024個檔案)會導致程式異常,會發生這個問題通常時程式沒寫好,使用靜態方法打開文件時忘記關閉。兩種解決方法,一是設置linux的最大文件打開數量(無法根本解決問題),二是解決程序中的bugs,即消除有問題的代碼。

請先透過下面的檢查方法來設定伺服器:
How to change open_files_limit in MySQL
https://stackoverflow.max-everyday.com/2021/02/how-to-change-open_files_limit-in-mysql/

解決 MySQL 連接出現 Too many connections
https://stackoverflow.max-everyday.com/2017/12/mysql-too-many-connections/


1:登入A服,設定從A服可以ssh 到B服。

可以參考看看這篇文章:How To Use SSH Keys connect to Linux server
https://stackoverflow.max-everyday.com/2017/12/how-to-use-ssh-keys-to-linux-server/

1-1: 在 A服執行:

ssh-keygen -t rsa

即可產生相關的key,畫面的訊息:

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

1-2:在 A服裡執行:

cat ~/.ssh/id_rsa.pub

取得public key 並到,再把內容都加入(append)到要被 ssh 連進去的 server 的 ~/.ssh/authorized_keys 檔案裡,就可以讓其他台電腦不用打密碼連進 ssh server 了。

附註:如你是使用DigitalOcean 的服務,而且建立的伺服器較早(於2020年10月),需要先搬家到VPC裡,方法很簡單,先產生 snapshot 後,再透過 snapshot create droplet 這樣就完成了,大約 5分鐘內完成,詳細圖文攻略:
https://www.digitalocean.com/docs/networking/vpc/how-to/migrate-resources/


2:搬資料庫

安裝mysql

sudo apt-get update
sudo apt-get install mysql-server

如果你的Ubuntu 版本太舊,無法安裝 mysql 8.0 以後版本,參考看看這篇文章:
https://stackoverflow.max-everyday.com/2019/10/ubuntu-18-install-mysql-8/

設定安全性和root 密碼的指令:

mysql_secure_installation

在出現的第二個問題:「選擇是否禁止 root 遠程登入」,建議輸入”Y”,讓 root 只能准許從 localhost 連線,以防從主機外部的連線進來。

在A服匯出 DB:

mysqldump -u root -p --opt [database name] > newdatabase.sql

在A服複製到 B服:

scp newdatabase.sql [email protected]:~/

附註:要指定B服的port, 可以使用 -p 參數,如果不是使用預設的 22 port.

在B服做匯入:

mysql -u root -p newdatabase < /path/to/newdatabase.sql

搬DB 的相關文章:
https://stackoverflow.max-everyday.com/2017/04/mysql-dump-restore/


3:搬需要的檔案

複製網頁和相關附件檔案

scp -pr /var/www [email protected]:/var/www

附註:建議走內網來傳輸檔案,速度會較走外網來的快,如果二台伺服器有辦法在同一個LAN裡。

改變實體檔案擁有者

chown -R www-data:www-data /var/www/*

複製 Apache web server 的相關站台設定:

scp -pr /etc/apache2/sites-available [email protected]:/etc/apache2

/etc/apache2/sites-enabled 的目錄,比較麻煩一點,需要先 tar 起來,再解壓縮。

先在 A服 apache2 目錄下「壓縮」執行指令:

tar -czvf enable.tgz sites-enabled

搬 Apache web server 設定檔案:

scp /etc/apache2/enable.tgz [email protected]:/etc/apache2

先在 B服 apache2 目錄下「解壓縮」執行指令:

tar -xzvf enable.tgz

4:申請與設定SSL憑證

需要使用 snap 指令,取得 certbot,以取得免費的 SSL 憑證。
https://stackoverflow.max-everyday.com/2017/01/lets-encrypt-free-https/

在申請憑證前,請先到 Cloudflare 關閉快取,改成僅DNS(only DNS).
https://dash.cloudflare.com/

如果上面的第3步,你有使用到之前的 apaches 的 mods-enables 的設定,請先拿掉 ssl.load 和 ssl.conf 這 2個 enable。建議只要把舊的站台的 sites-available 與 sites-enabled 搬過來就好了,mods 不要直接套到新的伺服器,因為有會比較多問題,尤其是 php 的版本在 mods 會不太一樣。

接下來就可以使用 certbot 指令來取得新的憑證檔。

都取得憑證後,希望 php 可以先執行,請修改 mods-available 的 dir.conf 為:

 <IfModule mod_dir.c>
         DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
 </IfModule> 

說明:把 index.php 調整為第一順位。

接著在 mods-enabled 目錄下執行下列指令,讓網站 redirect 到 ssl 優先:

ln -s ../mods-available/socache_shmcb.load socache_shmcb.load
ln -s ../mods-available/ssl.load ssl.load
ln -s ../mods-available/ssl.conf ssl.conf

後記

雖然上面這樣修改,似乎暫時解決了問題,但實際上系統運行一陣子還是掛掉,掛掉的原因是 out of memory, 是「整個系統」當機,目前測試用的環境已都使用最新的版本:

  • Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-66-generic x86_64)
  • Server version: 8.0.23-0ubuntu0.20.04.1 (Ubuntu)
  • PHP 7.4.3 (cli) (built: Oct  6 2020 15:47:56) ( NTS )
  • WordPress 5.7

相關文章

Linux的 VPS 上設定虛擬記憶體 (Swap)
https://stackoverflow.max-everyday.com/2016/05/linux-vps-swap/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *