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/