使用MySQL在Ubuntu 20.04上設置遠程數據庫以優化網站性能

介紹

當您的應用程序或網站不斷增長時,可能會達到您已經超出了目前的服務器設置的程度。如果您將網絡服務器和數據庫後端託管在同一台機器上,將這兩個功能分開以便每個都可以在自己的硬件上運行並分享響應訪問者請求的負載可能是一個好主意。

在本指南中,您將配置一個遠程 MySQL 數據庫服務器,以便您的 Web 應用程序可以連接到該服務器。在這裡,WordPress 被用作示例,以便有一些東西可以進行操作,但是這種技術廣泛適用於任何由 MySQL 支持的應用程序。

先決條件

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

步驟1 — 在資料庫伺服器上設定MySQL以聆聽遠端連線

將資料存儲在獨立伺服器上是在達到單機配置性能極限後優雅擴展的一種好方法。這也提供了基本結構,以便在以後進行負載平衡並進一步擴展基礎設施。在按照先決教程安裝MySQL後,您需要更改一些配置值以允許來自其他計算機的連接。

大多數MySQL伺服器的配置更改可以在mysqld.cnf文件中進行,該文件默認存儲在/etc/mysql/mysql.conf.d/目錄中。使用root權限在您喜歡的編輯器中打開您的資料庫伺服器上的此文件。此示例使用nano

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

此文件分為由方括號標籤([])標註的各個部分。找到標記為mysqld的部分:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
[mysqld]
. . .

在此部分中,尋找名為bind-address的參數。這告訴資料庫軟體要在哪個網路地址上聆聽連線。

預設情況下,這被設置為127.0.0.1,這意味著MySQL僅配置為尋找本地連接。您需要將其更改為引用可以到達您的伺服器的外部IP地址。

如果您的兩個伺服器都在具有私有網絡功能的資料中心中,請使用您的數據庫伺服器的私有網絡IP。否則,您可以使用其公共IP地址:

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
bind-address = db_server_ip

因為您將通過互聯網連接到您的數據庫,建議您要求加密連接以保護您的數據安全。如果不加密MySQL連接,網絡中的任何人都可以嗅探網頁和數據庫伺服器之間的敏感信息。要加密MySQL連接,在剛剛更新的bind-address行之後添加以下行:

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
require_secure_transport = on
. . .

完成後保存並關閉文件。如果您使用的是nano,請按CTRL + X,然後按Y,最後按ENTER

要使SSL連接正常工作,您需要創建一些金鑰和證書。 MySQL附帶了一個命令,將自動設置這些。執行以下命令,它將創建所需的文件。 它還通過指定mysql用戶的UID,使它們可被MySQL伺服器讀取:

  1. sudo mysql_ssl_rsa_setup --uid=mysql

為了強制MySQL更新其配置並讀取新的SSL信息,重新啟動數據庫:

  1. sudo systemctl restart mysql

確認伺服器現在是否正在監聽外部接口,運行以下ss命令:

  1. sudo ss -plunt | grep mysqld
Output
tcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4053,fd=22)) tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:* users:(("mysqld",pid=4053,fd=24))

ss 印出有關您服務器網絡系統的統計信息。此輸出顯示名為 mysqld 的進程附加到 db_server_ip 的端口 3306,這是標準的 MySQL 端口,確認服務器正在適當的界面上監聽。

接下來,在防火牆上打開該端口以允許通過流量:

  1. sudo ufw allow mysql

這些是您需要對 MySQL 進行的所有配置更改。接下來,您將設置一個數據庫和一些用戶配置文件,其中一個您將用於遠程訪問服務器。

第 2 步 — 在數據庫服務器上設置 WordPress 數據庫和遠程憑證

儘管 MySQL 本身現在正在監聽外部 IP 地址,但目前尚未配置任何遠程啟用的用戶或數據庫。為 WordPress 創建一個數據庫,以及一對可以訪問它的用戶。

首先,作為 MySQL 的 root 用戶連接到 MySQL:

  1. sudo mysql

注意:如果您啟用了密碼身份驗證,如先決條件 MySQL 教程的 第 3 步所述,則需要使用以下命令來訪問 MySQL shell:

  1. mysql -u root -p

運行此命令後,系統將要求您輸入 MySQL 的 root 密碼,輸入後您將獲得一個新的 mysql> 提示符。

從 MySQL 提示符中,創建一個 WordPress 將使用的資料庫。給這個資料庫取一個易於識別的名稱可能會有所幫助,以便您以後可以輕鬆識別它。在這裡,它被命名為 wordpress:

  1. CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

現在,您已經創建了您的資料庫,接下來您需要創建一對用戶。創建一個僅限本地的用戶以及一個與 Web 伺服器 IP 地址相關聯的遠程用戶。

首先,創建您的本地用戶,local_db_user,並且使用 localhost 在聲明中僅匹配本地連接嘗試:

  1. CREATE USER 'local_db_user'@'localhost' IDENTIFIED BY 'password';

然後,授予此帳戶對 wordpress 資料庫的完全訪問權限:

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'local_db_user'@'localhost';

現在,這個用戶可以對 WordPress 的資料庫執行任何操作,但是此帳戶無法遠程使用,因為它只匹配來自本地機器的連接。請記住這一點,創建一個伴隨帳戶,將僅匹配來自您的 Web 伺服器的連接。為此,您需要您的 Web 伺服器的 IP 地址。

請注意,您必須使用與您在 mysqld.cnf 文件中配置的網路相同的 IP 地址。這意味著如果您在 mysqld.cnf 文件中指定了私有網路 IP,則您需要在以下兩個命令中包含您的 Web 伺服器的私有 IP。如果您配置 MySQL 使用公共互聯網,則應使用 Web 伺服器的公共 IP 地址。

  1. CREATE USER 'remote_user'@'web_server_ip' IDENTIFIED BY 'password';

在創建遠程帳戶後,賦予它與本地用戶相同的權限:

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'remote_user'@'web_server_ip';

最後,刷新權限,以便 MySQL 知道開始使用它們:

  1. FLUSH PRIVILEGES;

然後退出 MySQL 提示符,輸入:

  1. exit

現在,您已經設置了一個新的數據庫和一個啟用了遠程訪問的用戶,您可以繼續測試是否能夠從您的 Web 服務器連接到數據庫。

步驟 3 — 測試遠程和本地連接

在繼續之前,最好驗證您是否能夠從本地機器(您的數據庫服務器)和您的 Web 服務器連接到數據庫。

首先,通過嘗試使用您的新帳戶登錄來測試從您的 數據庫服務器 的本地連接:

  1. mysql -u local_db_user -p

提示時,輸入為此帳戶設置的密碼。

如果給您一個 MySQL 提示符,則本地連接成功。您可以再次退出,方法是輸入:

  1. exit

接下來,登錄到您的 Web 服務器 以測試遠程連接:

  1. ssh remote_user@web_server_ip

您需要在 Web 服務器上安裝一些 MySQL 客戶端工具,以訪問遠程數據庫。首先,如果您最近尚未這樣做,請更新您的本地包緩存:

  1. sudo apt update

然後安裝 MySQL 客戶端工具:

  1. sudo apt install mysql-client

在此之後,使用以下語法連接到您的數據庫服務器:

  1. mysql -u remote_user -h db_server_ip -p

再次,您必须确保您正在使用正确的数据库服务器 IP 地址。如果您已配置 MySQL 监听私有网络,请输入数据库的私有网络 IP。否则,请输入数据库服务器的公共 IP 地址。

您将被要求输入您的 remote_user 账户的密码。输入后,如果一切按预期运行,您将进入 MySQL 提示符。使用以下命令验证连接是否使用 SSL:

  1. status

如果连接确实使用 SSL,则 SSL: 行将指示此,如下所示:

Output
-------------- mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu)) Connection id: 14 Current database: Current user: remote_user@web_server_ip SSL: Cipher in use is TLS_AES_256_GCM_SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.29-0ubuntu0.20.04.2 (Ubuntu) Protocol version: 10 Connection: db_server_ip via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 3306 Binary data as: Hexadecimal Uptime: 1 hour 8 min 28 sec Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016 --------------

验证您可以远程连接后,请退出提示符:

  1. exit

您已验证了本地访问和来自 Web 服务器的访问,但尚未验证其他连接是否会被拒绝。作为额外的检查,尝试从第三台服务器执行相同的操作,对于这台服务器,您没有配置特定的用户帐户,以确保此其他服务器未被授予访问权限。

请注意,在运行以下命令尝试连接之前,您可能需要像之前一样安装 MySQL 客户端工具:

  1. mysql -u wordpressuser -h db_server_ip -p

这应该不会成功完成,并且应该返回类似于此的错误:

Output
ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

这是预期的,因为您还没有创建一个允许从此服务器连接的 MySQL 用户,并且也是希望的,因为您希望确保您的数据库服务器拒绝未经授权的用户访问您的 MySQL 服务器。

成功测试远程连接后,您可以继续在 Web 服务器上安装 WordPress。

步驟4 — 準備網頁伺服器安裝 WordPress

如果您已經按照先決教程進行了操作,應該已經安裝了 Nginx 和 PHP。WordPress 及其許多插件利用了許多額外的 PHP 擴展功能。在在您的網頁伺服器上安裝 WordPress 之前,請安裝其中一些 PHP 擴展功能以供 WordPress 使用:

  1. sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

注意:每個 WordPress 插件都有其自己的一套要求。有些可能需要安裝額外的 PHP 擴展套件。請查看您的插件文檔以了解其 PHP 要求。如果有的話,可以像前面的例子一樣使用 apt 進行安裝。

安裝完擴展後,重新啟動 PHP-FPM 進程,以便運行中的 PHP 處理器可以利用新安裝的功能:

  1. sudo systemctl restart php7.4-fpm

接下來,對您的 Nginx 伺服器區塊文件進行一些調整。根據先決教程,您應該在 /etc/nginx/sites-available/ 目錄中為您的站點配置了一個配置文件。它還應配置為響應您的伺服器域名或 IP 地址,並受到 TLS/SSL 憑證的保護。/etc/nginx/sites-available/your_domain 在這裡是一個示例目錄。在適當的地方替換您的配置文件路徑。

此外,/var/www/your_domain 將在此示例 WordPress 安裝中用作根目錄。再次,請使用您自己配置中指定的文檔根目錄。

注意:您可能正在使用 /etc/nginx/sites-available/default 預設配置,將 /var/www/html 作為文檔根目錄。如果您只打算在此伺服器上托管一個網站,這樣使用是可以的。如果不是,最好將必要的配置拆分為邏輯塊,每個站點一個文件。

使用您喜歡的編輯器打開站點的伺服器區塊文件。此示例使用 nano

  1. sudo nano /etc/nginx/sites-available/your_domain

在此伺服器區塊中,添加一些位置區塊。首先創建用於請求 /favicon.ico/robots.txt 的精確匹配位置區塊,這兩個位置您不希望記錄請求。

您將通過使用正則表達式位置來匹配任何靜態文件的請求,關閉對這些請求的記錄,並將它們標記為高度可緩存,因為這些通常是昂貴的資源。您可以調整此靜態文件列表,以包含您的站點可能使用的任何其他文件擴展名:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
    . . .
}

在現有的 location / 區塊內,您可以調整 try_files 列表。首先,通過在第一行前加上井號 (#) 將默認設置註釋掉。然後添加以下行:

/etc/nginx/sites-available/your_domain
server {
    . . .
    location / {
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    . . .
}

通過配置的這一新行,當預設選項是返回 404 錯誤時,控制被傳遞給具有請求參數的 index.php 文件。

總的來說,您的文件頂部應該類似於此:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }

    location / {
       # try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }

  ...
}

完成後,保存並關閉文件。

通過輸入以下命令檢查您的配置是否存在語法錯誤:

  1. sudo nginx -t

如果沒有報告錯誤,則輸入以下命令重新加載Nginx:

  1. sudo systemctl reload nginx

準備好您的網絡伺服器後,現在可以安裝WordPress了。

第5步 – 在網絡伺服器上安裝WordPress

為了展示您的新遠程MySQL伺服器的功能,您將通過安裝和配置WordPress(流行的內容管理系統)的過程來進行演示,在您的網絡伺服器上。通過配置伺服器軟件,您可以下載WordPress。出於安全考慮,建議直接從項目的網站獲取最新版本的WordPress。

首先,切換到可寫入的目錄(建議使用臨時目錄,如/tmp):

  1. cd /tmp

這將把您的工作目錄更改為臨時文件夾。然後,輸入以下命令下載最新版本的WordPress作為壓縮文件:

  1. curl -LO https://wordpress.org/latest.tar.gz

解壓縮文件以創建WordPress目錄結構:

  1. tar xzvf latest.tar.gz

您將在片刻間將這些文件移入您的文檔根目錄,但在此之前,複製示例配置文件到WordPress讀取的文件名:

  1. cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php

將整個目錄的內容複製到您的文檔根目錄中。使用 -a 標誌將確保保留您的權限,並在源目錄的末尾添加一個點來指示應該複製目錄中的所有內容(包括隱藏文件):

  1. sudo cp -a /tmp/wordpress/. /var/www/your_domain

將文件放置在位置後,將所有權分配給 www-data 用戶和組。這是 Nginx 運行的用戶和組,Nginx 需要能夠讀取和寫入 WordPress 文件以便提供網站服務並執行自動更新:

  1. sudo chown -R www-data:www-data /var/www/your_domain

您的 WordPress 文件現在位於伺服器的文檔根目錄中,並具有正確的所有權。現在,您可以開始配置 WordPress 了。

步驟 6 — 設置 WordPress 配置文件

打開 WordPress 配置文件後,首先要調整一些密鑰,以提供安全性保護您的安裝。WordPress 提供了一個安全的生成器來生成這些值,因此您不必自己設定值。這些僅在內部使用,因此在這裡使用複雜且安全的值不會影響可用性。

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

  1. curl -s https://api.wordpress.org/secret-key/1.1/salt/

您將收到類似以下輸出的唯一值:

警告!每次請求時都重要請求您自己的唯一值。不要複製此處顯示的值!

Output
define('AUTH_KEY', 'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)'); define('SECURE_AUTH_KEY', 'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9'); define('LOGGED_IN_KEY', '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @'); define('NONCE_KEY', 'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G'); define('AUTH_SALT', '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a'); define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8'); define('LOGGED_IN_SALT', '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD'); define('NONCE_SALT', '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');

這些是您可以直接粘貼到配置文件中以設置安全密鑰的配置行。複製您收到的輸出。

打開WordPress配置文件:

  1. sudo nano /var/www/your_domain/wp-config.php

找到包含這些設置示例值的部分:

/var/www/your_domain/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');
. . .

刪除這些行並粘貼從命令行複製的值:

/var/www/your_domain/wp-config.php
. . .
define('AUTH_KEY',         'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_KEY',  'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_KEY',    'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_KEY',        'VALUES COPIED FROM THE COMMAND LINE');
define('AUTH_SALT',        'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_SALT',   'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_SALT',       'VALUES COPIED FROM THE COMMAND LINE');
. . .

接下來,在文件開頭修改一些數據庫連接設置。您將需要調整MySQL中配置的數據庫名稱、數據庫用戶和相應的密碼。

輸入您遠程數據庫的連接信息。請記住在先前的遠程數據庫測試中使用的相同IP地址和憑據:

/var/www/your_domain/wp-config.php
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

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

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

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

最後,在define( 'DB_COLLATE', '' );行的下方添加這行突出顯示的代碼,告訴WordPress使用SSL連接到您的MySQL數據庫:

var/www/your_domain/wp-config.php
...
define( 'DB_COLLATE', '' );

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
...

保存並關閉文件。

配置完成後,WordPress已安裝完成,您可以運行其基於Web的設置程序。

步驟7 — 通過Web界面設置WordPress

WordPress具有基于Web的设置过程。在进行设置过程时,它会询问几个问题,并在您的数据库中安装所有所需的表。在这里,您将执行设置WordPress的初始步骤,这可以作为构建使用远程数据库后端的自定义网站的起点。

导航到与您的Web服务器关联的域名(或公共IP地址),并附加一个尾部/wp-admin

http://your_domain.com/wp-admin

您将被提示选择您想要使用的语言:

接下来,您将来到主设置页面。

为您的WordPress站点选择一个名称并选择一个用户名。建议选择一个独特的名称,并避免像“admin”这样的常见用户名,以提高安全性。系统会自动生成一个强密码。请保存此密码或选择替代的强密码。

输入您的电子邮件地址,并选择是否要阻止搜索引擎索引您的站点:

一旦您提交了您的信息,您将需要使用您刚刚创建的帐户登录WordPress管理界面。然后,您将进入一个仪表板,您可以在其中自定义您的新WordPress站点。

结论

透過這個教程,您已經設置了一個 MySQL 數據庫,以接受來自遠程 WordPress 安裝的 SSL 保護連接。本指南中使用的命令和技術適用於任何用任何編程語言編寫的 Web 應用程序,但具體的實施細節會有所不同。有關更多信息,請參閱您應用程序或語言的數據庫文檔。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql-on-ubuntu-20-04