入門系列之在Ubuntu上使用MySQL設置遠程數據庫優化站點性能

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~php

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

介紹

隨着您的應用程序或網站的增加,您可能已經超出了當前的服務器設置。若是您在同一臺計算機上託管Web服務器和數據庫後端,最好將這兩個功能分開,以便每一個功能能夠在本身的硬件上運行,並分擔響應訪問者請求的負載。mysql

在本教程中,咱們將討論如何配置Web應用程序能夠鏈接的遠程MySQL數據庫服務器。咱們將使用WordPress做爲示例,以便咱們可使用,但該技術普遍適用於任何MySQL支持的應用程序。web

準備

在開始本教程以前,您將須要:sql

  • 兩個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密碼。選擇一個強密碼並記下它,由於咱們稍後會須要它。ubuntu

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附帶一個腳本,可引導您鎖定系統:api

$ 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集羣

此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1180951?fromSource=waitui

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

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

相關文章
相關標籤/搜索