在Ubuntu上使用MySQL設定遠端資料庫優化站點效能

騰訊雲加社群發表於2019-03-01

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文由蘇子晨 發表於雲+社群專欄

介紹

隨著您的應用程式或網站的增長,您可能已經超出了當前的伺服器設定。如果您在同一臺計算機上託管Web伺服器和資料庫後端,最好將這兩個功能分開,以便每個功能可以在自己的硬體上執行,並分擔響應訪問者請求的負載。

在本教程中,我們將討論如何配置Web應用程式可以連線的遠端MySQL資料庫伺服器。我們將使用WordPress作為示例,以便我們可以使用,但該技術廣泛適用於任何MySQL支援的應用程式。

準備

在開始本教程之前,您將需要:

  • 兩個Ubuntu 16.04伺服器,啟用了具有sudo許可權的非root 使用者,並啟用了UFW防火牆。
  • 在其中一臺伺服器上,您需要安裝LEMP(Linux,Nginx,MySQL,PHP)。我們將在本教程中安裝MySQL。
  • (可選)(但強烈建議),您可以使用SSL證照保護LEMP Web伺服器。您需要一個域名,但證照是免費的。如果你沒有域名,建議您先去這裡註冊一個域名

第一步 - 在資料庫伺服器上安裝MySQL

在我們觸頂單機配置的效能上限時,將資料儲存在單獨的伺服器上可以從容地解決這個問題。它還提供了負載平衡所需的基本結構,並在以後更多地擴充套件我們的基礎設施。

首先,我們將在安裝LEMP堆疊的伺服器上安裝MySQL。登入到此伺服器,然後更新包快取並安裝MySQL伺服器軟體:

$ sudo apt-get update
$ sudo apt-get install mysql-server
複製程式碼

在安裝過程中,系統會要求您設定並確認MySQL的root密碼。選擇一個強密碼並記下它,因為我們稍後會需要它。

MySQL應該立即安裝並執行。讓我們使用systemctl來檢查:

$ systemctl status mysql
複製程式碼
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago
 Main PID: 27179 (mysqld)
   CGroup: /system.slice/mysql.service
           └─27179 /usr/sbin/mysqld
複製程式碼

(running)行意味著MySQL已安裝並正在執行。現在我們將使安裝更加安全。MySQL附帶一個指令碼,可引導您鎖定系統:

$ mysql_secure_installation
複製程式碼

這將詢問您剛剛設定的MySQLroot密碼。輸入並按ENTER。現在我們將回答一系列是或否提示。讓我們來看看:

首先,我們被問及驗證密碼外掛,這是一個可以自動為MySQL使用者強制執行某些密碼強度規則的外掛。啟用此功能是您需要根據個人安全需求做出的決定。輸入y並按ENTER啟用它,或只是點選ENTER跳過它。如果啟用,系統還會提示您從0-2中選擇一個級別,以確定密碼驗證的嚴格程度。選擇一個數字並點選ENTER繼續。

接下來,系統會詢問您是否要更改root密碼。由於我們在安裝MySQL時剛剛建立了密碼,因此我們可以安全地跳過這個。點選ENTER繼續,不更新密碼。

其餘提示可以回答。系統將詢問您是否刪除匿名MySQL使用者,禁止遠端root登入,刪除測試資料庫以及重新載入許可權表以確保先前的更改正常生效。這些都是個好主意。輸入y並按ENTER。

在回答完所有提示後,指令碼將退出。現在我們的MySQL安裝是合理安全的。在下一步中,我們將配置MySQL以允許從遠端連線進行訪問。

第二步 - 配置MySQL以偵聽遠端連線

現在您已啟動並執行資料庫,我們需要更改一些配置值以允許來自其他計算機的連線。

在編輯器中以root許可權開啟mysqld配置檔案:

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
複製程式碼

此檔案分為括號(和)中的單詞表示的部分。找到標記為mysqld的部分:

mysqld.cnf

. . .
[mysqld]
複製程式碼

在此部分中,您需要找到一個名為bind-address的引數。這告訴資料庫軟體監聽連線的網路地址。

目前,MySQL配置為僅查詢本地連線。我們需要更改它以引用可以訪問伺服器的外部IP地址。

如果兩臺伺服器都位於具有專用網路功能的資料中心,請使用伺服器的專用網路IP。否則,您可以使用公共IP地址:

/etc/mysql/my.cnf

[mysqld]
. . .
bind-address = db_server_ip
複製程式碼

由於我們將通過網際網路連線到資料庫,因此我們將要求加密連線以確保我們的資料安全。如果您不加密MySQL連線,網路上的任何人都可能在您的Web和資料庫伺服器之間嗅探敏感資訊。在剛剛更新的bind-address行之後新增以下行:

/etc/mysql/my.cnf

. . .
require_secure_transport = on
複製程式碼

完成後儲存並關閉檔案。

要使SSL連線起作用,我們需要建立一些金鑰和證照。MySQL附帶一個命令,可以自動設定我們需要的所有內容:

$ sudo mysql_ssl_rsa_setup --uid=mysql
複製程式碼

這將建立必要的檔案並使它們可由MySQL伺服器(--uid=mysql)讀取。

要強制MySQL更新其配置並讀入新的SSL資訊,請重新啟動資料庫:

$ sudo systemctl restart mysql
複製程式碼

要確認伺服器正在偵聽外部介面,請用netstat檢查:

$ sudo netstat -plunt | grep mysqld
複製程式碼
tcp        0      0 db_server_ip:3306     0.0.0.0:*               LISTEN      27328/mysqld
複製程式碼

netstat列印有關我們伺服器網路系統的統計資訊。此輸出向我們顯示名為mysqld的程式在埠3306(標準MySQL埠)上附加到db_server_ip

現在開啟防火牆上的埠以允許流量通過:

$ sudo ufw allow mysql
複製程式碼

接下來,我們將設定遠端訪問伺服器所需的使用者和資料庫。

第三步 - 設定WordPress資料庫和遠端憑據

即使MySQL本身正在偵聽外部IP地址,但目前還沒有配置啟用遠端的使用者或資料庫。讓我們為WordPress和可以訪問它的使用者建立一個資料庫。

首先使用MySQL root帳戶連線到MySQL :

$ mysql -u root -p
複製程式碼

系統將要求您提供MySQL root密碼,然後您將收到新的mysql>提示。

現在我們可以建立WordPress將使用的資料庫。我們將呼叫此wordpress,以便我們以後可以輕鬆識別它:

mysql> CREATE DATABASE wordpress;
複製程式碼

**注意:**所有SQL語句必須以分號(;)結尾。如果在MySQL命令中按Enter鍵並且只看到帶有 ->提示符的新行,則可能忘記了分號。只需在新行上鍵入它,然後再次按ENTER繼續。

現在我們有了一個資料庫,我們需要建立我們的使用者。建立使用者的一個方面是我們需要根據使用者連線的位置定義兩個不同的配置檔案。我們將建立一個僅限本地的使用者,以及與我們的Web伺服器的IP地址繫結的遠端使用者。

首先,我們建立本地使用者wordpressuser並使該帳戶僅通過在宣告中使用localhost來匹配本地連線嘗試:

mysql> CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
複製程式碼

讓我們繼續並授予此帳戶對我們資料庫的完全訪問許可權:

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
複製程式碼

此使用者現在可以對WordPress的資料庫執行任何操作,但此帳戶不能遠端使用,因為它只匹配來自本地計算機的連線。

現在建立一個配對帳戶,該帳戶將匹配來自我們的Web伺服器的連線。為此,您需要Web伺服器的IP地址。我們可以將此帳戶命名為任何內容,但為了獲得更一致的體驗,我們將使用與上面完全相同的使用者名稱,僅修改主機部分。

請記住,您必須使用與您在mysqld.cnf檔案中配置的網路相同的IP地址。這意味著如果您使用專用網路IP,則需要建立以下規則以使用Web伺服器的專用IP。如果您將MySQL配置為使用公共網路,則應將其與Web伺服器的公共IP地址進行匹配。

mysql> CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';
複製程式碼

現在我們有了遠端帳戶,我們可以為它提供與本地使用者相同的許可權:

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'web_server_ip';
複製程式碼

重新整理許可權以將其寫入磁碟並開始使用它們:

mysql> FLUSH PRIVILEGES;
複製程式碼

然後輸入以下命令退出MySQL提示符:

mysql> exit
複製程式碼

現在我們已經設定了一個新的資料庫和啟用遠端的使用者,讓我們測試資料庫和連線。

第四步 - 測試遠端和本地連線

在繼續之前,最好驗證您是否可以使用wordpressuser帳戶從本地計算機和Web伺服器連線到資料庫。

首先,嘗試使用我們的新帳戶登入,從資料庫計算機測試本地連線:

mysql -u wordpressuser -p
複製程式碼

在提示時輸入您為此帳戶設定的密碼。

如果給出MySQL提示,則本地連線成功。您可以輸入以下命令再次退出:

mysql> exit
複製程式碼

登入Web伺服器以測試遠端連線。

在Web伺服器上,您需要為MySQL安裝一些客戶端工具才能訪問遠端資料庫。更新本地包快取,然後安裝客戶端實用程式:

$ sudo apt-get update
$ sudo apt-get install mysql-client
複製程式碼

現在,我們可以使用以下語法連線到我們的資料庫伺服器:

$ mysql -u wordpressuser -h db_server_ip -p
複製程式碼

同樣,您必須確保使用正確的資料庫伺服器IP地址。如果您將MySQL配置為在專用網路上偵聽,請輸入資料庫的專用網路IP,否則請輸入資料庫伺服器的公共IP地址。

系統會要求您輸入wordpressuser帳戶的密碼,如果一切順利,您將收到MySQL提示。我們可以使用以下命令驗證連線是否正在使用SSL:

mysql> status
複製程式碼
--------------
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

Connection id:      52
Current database:
Current user:       wordpressuser@203.0.113.111
SSL:         Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.18-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     203.0.113.111 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         3 hours 43 min 40 sec

Threads: 1  Questions: 1858  Slow queries: 0  Opens: 276  Flush tables: 1  Open tables: 184  Queries per second avg: 0.138
--------------
複製程式碼

SSL:行將指示是否正在使用SSL密碼。您現在可以繼續退出提示,因為您已經確認可以遠端連線:

mysql> exit
複製程式碼

對於其他檢查,您可以嘗試從第三臺伺服器執行相同的操作,以確保未授予其他伺服器訪問許可權。您已驗證本地訪問和從Web伺服器訪問,但您尚未驗證其他連線將被拒絕。

繼續在未配置特定使用者帳戶的伺服器上嘗試相同的過程。您可能必須像上面那樣安裝客戶端實用程式:

$ mysql -u wordpressuser -h db_server_ip -p
複製程式碼

這應該不會成功完成。它應該丟擲一個看起來像這樣的錯誤:

ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server
複製程式碼

這就是我們所期望的和我們想要的。

我們已經成功測試了我們的遠端連線,現在可以繼續我們的WordPress安裝了。

第五步 - 安裝WordPress

為了演示我們新的具有遠端功能的MySQL伺服器的功能,我們將在我們的Web伺服器上安裝和配置WordPress(流行的部落格平臺)。這將要求我們下載並解壓縮軟體,配置我們的連線資訊,然後執行WordPress的基於Web的安裝。

在您的Web伺服器上,將最新版本的WordPress下載到您的主目錄:

$ cd ~
$ curl -O https://wordpress.org/latest.tar.gz
複製程式碼

解壓縮檔案,這將在您的主目錄中建立一個名為wordpress的目錄:

$ tar xzvf latest.tar.gz
複製程式碼

WordPress包含一個示例配置檔案,我們將其用作起點。我們製作了這個檔案的副本,從檔名中刪除-sample,以便WordPress載入它:

$ cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php
複製程式碼

當我們開啟檔案時,我們的第一個業務訂單是調整一些金鑰以為我們的安裝提供安全性。WordPress為這些值提供了一個安全的生成器,因此您不必嘗試自己提供好的值。這些僅在內部使用,因此在這裡使用複雜,安全的值不會影響可用性。

要從WordPress金鑰生成器中獲取安全值,請輸入:

$ curl -s https://api.wordpress.org/secret-key/1.1/salt/
複製程式碼

這將列印出一些我們可以複製並貼上到我們的wp-config.php檔案中的配置。

警告! 每次請求唯一值非常重要。不要複製下面顯示的值!

define('AUTH_KEY',         '1jl/vqfs<XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^<+c9.k<J@4H');
define('SECURE_AUTH_KEY',  'E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3');
define('LOGGED_IN_KEY',    'W(50,{W^,OPB%PB<JF DO NOT COPY THESE VALUES 2;y&,2m%3]R6DUth[;88');
define('NONCE_KEY',        'll,4UC)7ua+8<!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g');
define('AUTH_SALT',        'koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES  07VC*Lj*lD&?3w!BT#-');
define('SECURE_AUTH_SALT', 'p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY');
define('LOGGED_IN_SALT',   'i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|');
define('NONCE_SALT',       'Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&xqHN&%');
複製程式碼

將收到的輸出複製到剪貼簿,然後在文字編輯器中開啟配置檔案:

$ nano ~/wordpress/wp-config.php
複製程式碼

找到包含這些設定的虛擬值的部分。它看起來像這樣:

wp-config.php

. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .
複製程式碼

刪除這些行並貼上從命令列復制的值。

接下來,我們需要輸入遠端資料庫的連線資訊。這些配置行位於檔案的頂部,就在我們貼上在鍵的上方。請記住使用先前在遠端資料庫測試中使用的相同IP地址:

wp-config.php

. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .
複製程式碼

最後,在檔案中的任何位置貼上以下行,告訴WordPress使用與MySQL資料庫的SSL連線:

wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
複製程式碼

儲存並關閉檔案。

接下來,我們需要將~/wordpress目錄中的檔案和目錄複製到Nginx的文件根目錄。

我們使用-a標誌來確保維護我們的許可權:

$ sudo cp -a ~/wordpress/* /var/www/html
複製程式碼

現在我們所有的檔案都已到位。剩下要做的就是修改檔案所有權。我們將設定文件根目錄中的所有檔案,由我們的Web伺服器使用者www-data擁有:

$ sudo chown -R www-data:www-data /var/www/html
複製程式碼

現在應該安裝WordPress並準備好執行其基於Web的安裝例程。我們將在下一步中做到這一點。

第六步 - 通過Web介面設定Wordpress

WordPress有一個基於Web的安裝程式,它會詢問幾個問題並在我們的資料庫中安裝它所需的表。我們現在開始吧。

導航到與您的Web伺服器關聯的域名(或公共IP地址):

http://example.com
複製程式碼

您將看到WordPress安裝程式的語言選擇螢幕。選擇適當的語言,然後單擊進入主安裝介面:

img
主安裝介面

提交資訊後,您需要使用剛剛建立的帳戶登入WordPress管理介面。然後,您將進入儀表板,您可以在其中自定義和操作您的站點。

結論

在本教程中,我們設定了一個MySQL資料庫,以接受來自遠端Wordpress安裝的受SSL保護的連線。我們使用的命令和技術適用於以任何程式語言編寫的任何Web應用程式,但具體的實現細節將有所不同。有關更多資訊,請參閱您的應用程式或語言的資料庫文件。更多MySQL的教程歡迎訪問騰訊雲+社群學習更多知識。


參考文獻:《How To Set Up a Remote Database to Optimize Site Performance with MySQL on Ubuntu 16.04》

問答

AI開發的語言要求是什麼?

相關閱讀

如何在Ubuntu上搭建Minecraft伺服器

如何在Ubuntu上搭建方舟:生存進化伺服器

使用Patroni和HAProxy建立高度可用的PostgreSQL叢集

此文已由作者授權騰訊雲+社群釋出,原文連結:cloud.tencent.com/developer/a…

搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社群

相關文章