摘要訊息 : 在 CentOS 8 下配置 Nginx, PHP 8, MySQL 8, phpMyAdmin 和 vsFTPd.

0. 前言

在文章《在 CentOS 8 下配置 Nginx + PHP 7 + MySQL 8 + phpMyAdmin + vsFTPd》中, 我們介紹了如何在 CentOS 8 下配置 PHP 7, 本篇文章將要配置更改版本的 PHP, 即 PHP 8.

不同服務商提供的伺服器可能有細微的不同, 因此我們首先執行以下指令, 以確保我們安裝了 Vim, dnf (DaNdiFied Yum) , unzip 以及 OpenSSL : yum install -y vim dnf cockpit unzip openssl. 接下來, 我們將全面使用 dnf 指令替換 yum 指令.

更新紀錄 :

  • 2022 年 5 月 30 日進行第一次更新和修正.

1. Nginx

進入 http://nginx.org/packages/centos/8/x86_64/RPMS/ 查看最新的 RPM 地址. 截止到發文為止, 最新的地址為 https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.22.0-1.el8.ngx.x86_64.rpm. 因此, 我們執行指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.22.0-1.el8.ngx.x86_64.rpm.

Figure 1. Nginx 安裝完成

和 CentOS 7 不同的是, CentOS 8 在添加 RPM 包的時候自動安裝了 Nginx, 那麼我們只需要讓其啟動即可 systemctl enable --now nginx.

接下來介紹一些 Nginx 的模組 (所有的地址都可以在 http://nginx.org/packages/centos/8/x86_64/RPMS/ 中找到最新版本). 這些模組只是可選的, 對於一般的人來說, 不安裝沒有任何影響, 除非你有特殊需求. 值得注意的是, 這些模組在 RPM 包引入之後就已經安裝了 :

  • Image Filter : 它是用於圖片處理的. 安裝之前需要執行 dnf install -y gd, 以安裝依賴的模組. 最後輸入指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-module-image-filter-1.22.0-1.el8.ngx.x86_64.rpm 即可;
  • NJS : 這是 Nginx 中的 JavaScript 指令碼語言. 輸入指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-module-njs-1.22.0%2B0.7.4-1.el8.ngx.x86_64.rpm 即可;
  • Perl : 這是讓 Nginx 支援使用 FastCGI 處理 Perl 程式設計語言的模組. 輸入指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-module-perl-1.22.0-1.el8.ngx.x86_64.rpm 即可;
  • XSLT : 這個模組可以讓 Nginx 支援可延伸樣式表轉換語言, 以便把 XML 轉換為其它檔案. 安裝之前需要執行 dnf install -y libxslt. 然後輸入指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-module-xslt-1.22.0-1.el8.ngx.x86_64.rpm 即可.

我的服務商提供的伺服器帶有一個服務商自建的安全模組, 因此 FireWall 和 SELinux 在我的伺服器上預設是關閉的狀態. 如果你的服務商也自建了安全模組 (建議自行資訊閣下的服務商), 那麼我同樣建議你關閉 FireWall 和 SELinux. 否則, 就需要配置 FireWall, 這裡我只提供 FireWall 的配置方法和關閉 SELinux 的方法. 對於 FireWall, 我們只需要將對應連接埠添加到公共區域即可 :

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

每一條指令之後, 都會有 success 回傳. 對於 SELinux, 如果你只是想臨時關閉, 那麼直接執行指令 setenforce 0 就可以了. 但是如果你想要永久關閉, 就需要修改檔案 vim /etc/selinux/config, 找到 SELINUX=enforcing 修改為 SELINUX=disabled. 最後重新啟動作業系統 reboot 即可. 對於服務商自建的安全模組, 需要開放 80443 連接埠, 模式為 TCP. 現在由於 IPv6 的普及, 建議同時為 IPv4 和 IPv6 開放這兩個連接埠. 如果你不知道如何配置服務商自建的安全模組, 請諮詢你的服務商或者尋找服務商提供的教學.

Tip : 按下 "/" 再輸入字元就是 Vim 的搜尋; 按下 i 進入編輯模式, 使用鍵盤上的上下左右按鍵進行移動; 按下 esc 按鍵退出編輯模式; 按下 ":" + "w" + "ENter" 保存; 按下 ":" + "q" + "Enter" 退出; 輸入 "wq" 組合表示保存的同時退出, 最後加一個 "!" 表示強制性的.

設定完成之後, 直接訪問你的 IP, 就可以看到如下的頁面 :

Figure 2. Nginx 配置完成

2. MySQL

進入 https://dev.mysql.com/downloads/repo/yum/ 找到最新的 RPM 包地址 (Red Hat Enterprise Linux 8 / Oracle Linux 8 (Architecture Independent), RPM Package). 截止發文為止的最新地址為 https://repo.mysql.com//mysql80-community-release-el8-4.noarch.rpm. 執行指令 rpm -Uvh https://repo.mysql.com//mysql80-community-release-el8-4.noarch.rpm. 和 Nginx 不同的是, MySQL 並不會直接安裝, 需要手動安裝 : dnf install -y @mysql. 其中的 @ 表示 MySQL 的套件包, 這個指令要比之前 CentOS 7 使用的指令簡單得多.

Figure 3. MySQL 安裝完成

完成之後, 首先需要啟動 MySQL. 和 CentOS 7 安裝時不同的是, 在 CentOS 8 中, MySQL 安裝之後並不會直接設定自動運作. 但是在習慣上, MySQL 一般是需要啟動後需要自動運作的, 所以執行指令 systemctl enable --now mysqld.

然後進行配置, 配置的指令也和 CentOS 7 不同, 需要執行指令 mysql_secure_installation. 在這之前, 我要提醒大家, 如果你對 MySQL 不熟悉, 那麼請按照本博客給出的方法設定 MySQL. 當然, 如果你熟悉這個配置過程, 某些操作當然可以自訂. 下面我取每個配置的最後一句話來進行說明 :

  • Would you like to setup VALIDATE PASSWORD component? : 這個問題是是否啟用密碼套件, 一般輸入 y 確認啟用;
  • There are three levels of password validation policy : 這個選項是告訴你 MySQL 有三個密碼等級. LOW 是最低, 只要密碼長度大於 8 個字元; MEDIUM 代表中等, 除了 LOW 的要求之外, 還要求數字 + 大小寫 + 特殊字元; STRONG 代表高強度, 除了 MEDIUM 的要求之外, 還要求字典檔案. 輸入 0 代表 LOW, 輸入 1 代表 MEDIUM, 輸入 2 代表 STRONG. 這裡我的輸入是 1;
  • 接下來輸入你的密碼兩次;
  • Remove anonymous users? : 這個問題是詢問是否移除不具名使用者. 我的選擇是 y;
  • Disallow root login remotely? : 這個問題是是否禁止遠端登錄 root 使用者. 我的選擇是 y;
  • Remove test database and access to it? : 這個問題是是否移除用於測試的資料庫. 我的選擇是 y;
  • Reload privilege tables now? : 這個問題是是否重新載入資料表權限. 我的選擇是 y.

到此 MySQL 安裝完成. 目前很多程式已經支援了 MySQL 8 的新驗證方式, 所以我們幾乎不再需要建立相容性帳戶. 如果大家需要用到的某些程式還沒有相容 MySQL 8, 可以參考歸檔文章《對於 MySQL 8 的一些相容性提示》.

3. PHP

這是本篇文章的重頭戲. 在安裝 PHP 的 RPM 包之前, 必須安裝其所需要的套件 epel-release 和 ncurses-devel : dnf install -y epel-release ncurses-devel. 然後引入 RPM 包 : rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-8.rpm. 如果你在引入包的過程中遇到了一些莫名其妙的錯誤, 比如

Figure 4. 引入 remi-release-8 RPM 包時的錯誤

可以刷新 RPM 包的緩存 : dnf upgrade --refresh rpm glibc && rm /var/lib/rpm/.rpm.lock && dnf upgrade dnf.

通過指令 dnf module list php, 我們可以看到一些關於 PHP 的套件. 作業系統本身自帶了 PHP 7.2, PHP 7.3 和 PHP 7.4, 但是我們要安裝的是 PHP 8. 在安裝 PHP 8.0 的全部套件之前, 我們需要安裝一些依賴的套件 (如果你不是新人, 可以直接跳過這部分, 根據我下面給出的所有套件, 安裝你需要的套件即可. 如果你是新人, 建議按照本文給處的步驟走). 為了安裝完全的套件, 我們首先引入一個 RPM 包 : rpm -Uvh http://ftp.altlinux.org/pub/distributions/ALTLinux/p9/branch/x86_64/RPMS.classic/libsz2-2.1-alt4.x86_64.rpm, 然後執行指令 :

dnf install -y php80 php80-build php80-libzip php80-php php80-php-ast php80-php-bcmath php80-php-brotli php80-php-cli php80-php-common php80-php-componere php80-php-dba php80-php-dbg php80-php-devel php80-php-embedded php80-php-enchant php80-php-ffi php80-php-fpm php80-php-gd php80-php-geos php80-php-gmp php80-php-imap php80-php-intl php80-php-json php80-php-ldap php80-php-litespeed php80-php-lz4 php80-php-maxminddb php80-php-mbstring php80-php-mysqlnd php80-php-oci8 php80-php-odbc php80-php-opcache php80-php-pdlib php80-php-pdo php80-php-pdo-dblib php80-php-pdo-firebird php80-php-pear php80-php-pecl-ahocorasick php80-php-pecl-amqp php80-php-pecl-apcu php80-php-pecl-apcu-devel php80-php-pecl-apfd php80-php-pecl-base58 php80-php-pecl-bitset php80-php-pecl-couchbase3 php80-php-pecl-csv php80-php-pecl-dbase php80-php-pecl-dio php80-php-pecl-ds php80-php-pecl-env php80-php-pecl-event php80-php-pecl-fann php80-php-pecl-geoip php80-php-pecl-geospatial php80-php-pecl-grpc php80-php-pecl-handlebars php80-php-pecl-hdr-histogram php80-php-pecl-http php80-php-pecl-http-devel php80-php-pecl-http-message php80-php-pecl-igbinary php80-php-pecl-igbinary-devel php80-php-pecl-imagick php80-php-pecl-imagick-devel php80-php-pecl-inotify php80-php-pecl-ip2location php80-php-pecl-ip2proxy php80-php-pecl-json-post php80-php-pecl-krb5 php80-php-pecl-krb5-devel php80-php-pecl-leveldb php80-php-pecl-lzf php80-php-pecl-mailparse php80-php-pecl-mcrypt php80-php-pecl-memcache php80-php-pecl-memcached php80-php-pecl-memprof php80-php-pecl-mongodb php80-php-pecl-msgpack php80-php-pecl-msgpack-devel php80-php-pecl-mustache php80-php-pecl-mysqlnd-azure php80-php-pecl-oauth php80-php-pecl-pcov php80-php-pecl-pq php80-php-pecl-protobuf php80-php-pecl-psr php80-php-pecl-raphf php80-php-pecl-rar php80-php-pecl-rdkafka4 php80-php-pecl-redis5 php80-php-pecl-rpminfo php80-php-pecl-rrd php80-php-pecl-runkit7 php80-php-pecl-scrypt php80-php-pecl-selinux php80-php-pecl-solr2 php80-php-pecl-ssdeep php80-php-pecl-ssh2 php80-php-pecl-swoole4 php80-php-pecl-sync php80-php-pecl-translit php80-php-pecl-uuid php80-php-pecl-varnish php80-php-pecl-vips php80-php-pecl-xattr php80-php-pecl-xdebug3 php80-php-pecl-xdiff php80-php-pecl-xhprof php80-php-pecl-xlswriter php80-php-pecl-xmldiff php80-php-pecl-xmlrpc php80-php-pecl-yac php80-php-pecl-yaconf php80-php-pecl-yaml php80-php-pecl-yaz php80-php-pecl-zip php80-php-pecl-zmq php80-php-pgsql php80-php-phpiredis php80-php-process php80-php-pspell php80-php-realpath-turbo php80-php-smbclient php80-php-snappy php80-php-snmp php80-php-soap php80-php-sodium php80-php-sqlsrv php80-php-tidy php80-php-xml php80-php-xmlrpc php80-php-zephir-parser php80-php-zstd php80-unit-php php80-xhprof --skip-broken

上面指令會忽略一個套件 : php80-php-sqlsrv, 因為套件要求安裝 msodbcsq, 這是關於 Microsoft 的 MSSQL 的軟體. 如果沒有安裝 msodbcsq, 那麼就無法安裝 php80-php-sqlsrv. 因此, php80-php-sqlsrv 我們直接使用 --skip-broken 跳過. 如果你的作業系統上安裝了 msodbcsq, 那麼套件 php80-php-sqlsrv 不會被跳過. 另外, 我還刪除了套件 php80-php-pecl-datadog-trace, 這個套件在某些情況下和 phpMyAdmin 不相容.

此處我給出偵錯的辦法 : 大家如果把上面的可選套件全都安裝了, 但是又找不到哪幾個套件和你的程式不相容, 那麼大家可以通過折半搜尋, 也就是解除安裝一半 (可以是前面一半也可以是後面一半). 如果此時大家發現自己的程式正確運作了, 那麼問題就在移除的那部分套件中. 然後重新安裝上那部分套件, 再解除安裝一半中的一半, 如此循環就可以找到哪個套件和你的程式不相容了. 移除的指令為 dnf remove -y 套件名稱.

關於 PHP 8.0 的安裝是經過本人驗證的, 現在 PHP 8.1 已經發布, 本文給出 PHP 8.1 的安裝指令. 需要注意的是, 這個指令中安裝的套件是沒有經過測試的, 可能會產生衝突, 裡面也存在一些同名不同版本的套件. 需要閣下自行調試, 如果閣下第一次嘗試安裝, 建議採用上面 PHP 8.0 的安裝指令 (PHP 8.0 和 PHP 8.1 在實際使用的時候一般人是體會不出差別的).

dnf install -y php81 php81-build php81-libzip php81-php-ast php81-php-ffi php81-php-horde-horde-lz4 php81-php-maxminddb php81-php-opcache php81-php-pdo-dblib php81-php-pdo-firebird php81-php-pecl-ahocorasick php81-php-pecl-amqp php81-php-pecl-apcu php81-php-pecl-apcu-devel php81-php-pecl-apfd php81-php-pecl-base58 php81-php-pecl-bitset php81-php-pecl-crypto php81-php-pecl-dbase php81-php-pecl-decimal php81-php-pecl-dio php81-php-pecl-eio php81-php-pecl-env php81-php-pecl-ev php81-php-pecl-event php81-php-pecl-excimer php81-php-pecl-fann php81-php-pecl-geoip php81-php-pecl-gmagick php81-php-pecl-gnupg php81-php-pecl-grpc php81-php-pecl-http php81-php-pecl-http-devel php81-php-pecl-http-message php81-php-pecl-igbinary-devel php81-php-pecl-imagick php81-php-pecl-imagick-devel php81-php-pecl-imagick-im6 php81-php-pecl-imagick-im6-devel php81-php-pecl-imagick-im7 php81-php-pecl-imagick-im7-devel php81-php-pecl-inotify php81-php-pecl-ion php81-php-pecl-ip2location php81-php-pecl-ip2proxy php81-php-pecl-json-post php81-php-pecl-jsonpath php81-php-pecl-krb5 php81-php-pecl-krb5-devel php81-php-pecl-luasandbox php81-php-pecl-lzf php81-php-pecl-mcrypt php81-php-pecl-memcache php81-php-pecl-memcached php81-php-pecl-memprof php81-php-pecl-msgpack php81-php-pecl-msgpack-devel php81-php-pecl-mustache php81-php-pecl-mysql php81-php-pecl-opencensus php81-php-pecl-pam php81-php-pecl-parle php81-php-pecl-pcov php81-php-pecl-pq php81-php-pecl-protobuf php81-php-pecl-ps php81-php-pecl-psr php81-php-pecl-raphf php81-php-pecl-rdkafka5 php81-php-pecl-rdkafka6 php81-php-pecl-redis5 php81-php-pecl-rpminfo php81-php-pecl-runkit7 php81-php-pecl-scrypt php81-php-pecl-simple-kafka-client php81-php-pecl-solr2 php81-php-pecl-ssdeep php81-php-pecl-ssh2 php81-php-pecl-stats php81-php-pecl-stomp php81-php-pecl-sync php81-php-pecl-teds php81-php-pecl-trader php81-php-pecl-translit php81-php-pecl-uopz php81-php-pecl-uploadprogress php81-php-pecl-var-representation php81-php-pecl-varnish php81-php-pecl-wddx php81-php-pecl-xattr php81-php-pecl-xdebug3 php81-php-pecl-xdiff php81-php-pecl-xlswriter php81-php-pecl-xmldiff php81-php-pecl-xmlrpc php81-php-pecl-yac php81-php-pecl-yaconf php81-php-pecl-yaf php81-php-pecl-yar php81-php-pecl-zip php81-php-pecl-zmq php81-php-phpiredis php81-php-realpath-turbo php81-php-sodium php81-php-xz php81-php-zephir-parser php81-php-zstd --skip-broken

接下來我們需要配置 PHP, 首先配置 PHP-FPM : vim /etc/opt/remi/php80/php-fpm.d/www.conf, 如果閣下安裝的是 PHP 8.1, 那麼所有指令中的 php80 都要改為 php81. 找到 user = apache 修改為 user = nginx, 找到 group = apache 修改為 group = nginx. 對於 PHP 有了解的人看到 listen = /var/opt/remi/php80/run/php-fpm/www.sock 這行可能有些奇怪, 因為原來我們一直是使用連接埠 9000, 即 127.0.0.1:9000, 現在我們改用 unix socket 的方式. 這個方式對於小的網站比較友好, 有更好的速度. 大型網站仍然建議使用連接埠的形式. 找到 ;listen.owner = nobody, 去掉前面的分號, 然後改為 listen.owner = nginx; 找到 ;listen.group = nobody, 去掉前面的分號, 然後改為 listen.group = nginx; 找到 ;listen.mode = 0660, 去掉前面的分號; 找到 listen.acl_users = apache, 修改為 listen.acl_users = nginx; 找到 ;listen.acl_groups =, 去掉前面的分號, 然後在後面添加 nginx : listen.acl_groups = nginx. 找到

;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

去掉最前面所有分號.

此時, 我們已經完成了 PHP-FPM 的配置, 接下來配置 PHP : vim /etc/opt/remi/php80/php.ini. 搜尋 mysqli.default_socket, 在後面添加 /var/lib/mysql/mysql.sock : mysqli.default_socket = /var/lib/mysql/mysql.sock. 搜尋 date.timezone, 去掉前面的分號, 在後面添加 Asia/Hong_Kong 或者改為閣下所在的時區. 時區代碼可以在 https://www.php.net/manual/en/timezones.php 上找到. 此篇文章中, 我們不對其它設定進行重新修改, 大家請自行按照自己的需求修改. 此處給出一些可能需要修改的選項, 方便大家搜尋 : max_execution_time, post_max_size, upload_max_filesize.

接下來將一些檔案夾的權限還給 Nginx : chown -R nginx:nginx /var/opt/remi/php80/lib/php/session.

接著啟動 PHP-FPM : systemctl enable --now php80-php-fpm.

另外, 我們還要把 /var/opt/remi/php80/run/php-fpm/www.sock 授權給 Nginx 才行 : chown nginx:nginx /var/opt/remi/php80/run/php-fpm/www.sock.

最後, 我們測試一下 PHP 是否被正確安裝 : mkdir /www && cd /www, 建立一個檔案 : vim info.php. 按 i 進入編輯模式, 輸入 <?php phpinfo();(不要忘了分號). Nginx 也要對這個頁面的訪問進行配置 : cd /etc/nginx/conf.d && vim test.conf. 首先給出沒有開啟 SSL 的配置, 新手建議使用這個配置 (帶有 SSL, 即開啟 HTTPS 的配置, 開啟 HTTPS 的教學可以參考《Nginx 下实现 HTTPS》) :

server {
    listen 80;    # 這是你的網頁使用的連接埠, 預設是 80 無需更改
    server_name test.jonny.vip;    # 你的網域名稱, 此處一定要更改
    root /www;    # 你的網頁檔案
    access_log /var/log/nginx/test.access.log main;
    error_log /var/log/nginx/test.error.log error;
    location / {
        index index.php index.html;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/opt/remi/php80/run/php-fpm/www.sock;    # FastCGI 模式, 如果按照本篇文章的配置, 那麼無需更改, 否則需要更改檔案夾或者更改為連接埠模式
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_send_timeout 36000s;
        fastcgi_read_timeout 36000s;
        fastcgi_buffer_size 1024k;
        fastcgi_buffers 8 1024k;
        fastcgi_busy_buffers_size 2048k;
        fastcgi_temp_file_write_size 2048k;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout 36000s;
    }
}

接下來給出 SSL 的配置 :

server {
    listen 80;    # 這是你的網頁使用的連接埠, 預設是 80 無需更改
    server_name test.jonny.vip;    # 你的網域名稱, 此處一定要更改
    rewrite ^(.*) https://$host$1 permanent;
}
server {
    listen 443 ssl http2;
    server_name test.jonny.vip;    # 你的網域名稱, 此處一定要更改
    root /www;    # 你的網頁檔案
    access_log /var/log/nginx/test.access.log main;
    error_log /var/log/nginx/test.error.log error;
    ssl_certificate 改為 SSL 證書存放位置;
    ssl_certificate_key 改為 SSL 證書 key 存放位置;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag all;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    client_max_body_size 0;
    proxy_connect_timeout 36000s;
    proxy_read_timeout 36000s;
    proxy_request_buffering off;
    send_timeout 600;
    location / {
        index index.php index.html index.htm;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/opt/remi/php80/run/php-fpm/www.sock;    # FastCGI 模式, 如果按照本篇文章的配置, 那麼無需更改, 否則需要更改檔案夾或者更改為連接埠模式
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_send_timeout 36000s;
        fastcgi_read_timeout 36000s;
        fastcgi_buffer_size 1024k;
        fastcgi_buffers 8 1024k;
        fastcgi_busy_buffers_size 2048k;
        fastcgi_temp_file_write_size 2048k;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout 36000s;
    }
}

使用 nginx -t 指令測試配置檔案是否有錯誤, 如果出現

Figure 5. Nginx 配置沒有問題

則說明配置檔案沒有問題, 接下來重新載入 Nginx : systemctl reload nginx.

最後進入瀏覽器訪問 http://你的網域名稱/info.php, 如果看到如下頁面, 就說明配置成功 (以 PHP 7 為例, PHP 8 也是類似的) :

Figure 6. PHP 配置完成

4. phpMyAdmin

首先進入我們剛剛建立的檔案夾 /www : cd /www. 然後進入網頁 https://www.phpmyadmin.net, 查找最新版本的 phpMyAdmin, 截止發文為止最新的下載地址是 https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip. 執行指令 wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip. 下載完成之後解除封存 : unzip phpMyAdmin*.zip. 我習慣重新命名 : mv phpMyAdmin* phpMyAdmin. 進入檔案夾 cd phpMyAdmin, 建立上載和存儲的檔案夾 : mkdir save && mkdir upload. 建立 tmp 檔案夾 : mkdir tmp. 建立配置檔案 cp config.sample.inc.php config.inc.php, 將檔案夾的權限授權給 Nginx : chown -R nginx:nginx /www/phpMyAdmin. 然後配置 phpMyAdmin : vim config.inc.php. 按 i 進入編輯模式, 找到 $cfg['blowfish_secret'], 在後面的單引號中添加一個至少長達 32 字元的字串, 這個字串需要隨機, 你可以使用網上的字元亂數產生來產生一個幾乎不會被猜中的字串, 比如我的是 (不要和我的相同)

Figure 7. $cfg['blowfish_secret']

接著找到 $cfg['UploadDir'] 在單引號中添加 upload, 找到 $cfg['SaveDir'] 在單引號中添加 save.

phpMyAdmin 就配置完成了,由於我們直接把 phpMyAdmin 放在 /www 檔案夾下, 所以在剛才的網域名稱後面加上 /phpMyAdmin 就可以訪問 phpMyAdmin 了. 使用者名稱是 root, 密碼是你剛才配置的 MySQL 密碼. 登陸之後就有以下的頁面. 當然也可以像第 3 節中那樣給 phpMyAdmin 配置一個獨立的網域名稱.

Figure 8. phpMyAdmin 配置完成

我們看到最後有一個警告, 我們點擊 "了解原因", 然後點擊 "建立" 即可. 這是為 phpMyAdmin 專門建立一個屬於它的資料庫.

5. vsFTPd

首先安裝 vsFTPd dnf install -y vsftpd. 建立一個專門用於 FTP 的使用者 useradd FTP (這裡的 FTP 自行修改), 給 FTP 使用者添加一個密碼 passwd FTP, 接下來輸入兩次密碼即可.

Figure 9. 建立 FTP 使用者

如果你希望這個用戶只能登陸 FTP, 那麼需要禁止其通過終端機的方式登陸, 執行以下指令 usermod -s /sbin/nologin FTP. 然後需要編輯 vim /etc/shells, 移動到最後添加一行 /sbin/nologin. 如果你開啟了 FireWall, 那麼需要執行以下指令開放 FTP 連接埠 (如果你的伺服器使用的是自建安全模組, 那麼需要添加連接埠 21 讓外界可以訪問, 模式為 TCP) :

firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload

最後我們啟用 vsFTPd : systemctl enable --now vsftpd.

我們使用 FileZilla 軟體 (可以在 https://filezilla-project.org 下載) 進行連線 :

Figure 10-1. 連線配置
Figure 10-2. 連線成功

如果無法連結, 一般是模式問題, 切換到傳輸設定選擇一個進行測試就行了. 這個可能和不同的伺服器有關 :

Figure 10-3. 連線傳輸設定

接著我們為 vsFTPd 開啟 SSL 連線. 執行指令 (老手可以個性化指令) openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem :

Figure 11. vsFTPd 的 SSL 配置
  • Country Name (2 letter code) [XX] : 國家縮寫;
  • State or Province Name (full name) [] : 洲/省份全稱;
  • Locality Name (eg, city) [Default City] : 城市名稱;
  • Organization Name (eg, company) [Default Company Ltd] : 組織名稱;
  • Organizational Unit Name (eg, section) [] : 部門名稱;
  • Common Name (eg, your name or your server's hostname) [] : 伺服器名稱;
  • Email Address [] : 郵箱地址.

這份證書僅有 365 天的有效期, 365 天之後要刪除舊的證書, 然後重新執行上述步驟.

全部輸入完畢之後, 編輯 vsFTPd 配置檔案 : vim /etc/vsftpd/vsftpd.conf, 移到最後添加

#SSL

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem    #證書 .pem 檔案地址, 老手可以根據自己的需要修改
rsa_private_key_file=/etc/vsftpd/vsftpd.key    #證書 .key 檔案地址, 老手可以根據自己的需要修改
pasv_min_port=59000    #連接埠起始, 這個可以根據你自己的需要修改
pasv_max_port=59000    #連接埠結束, 這個可以根據你自己的需要修改

除此之外, 還要關閉連接埠的 FireWall 保護 (自建安全模組的伺服器要開啟這些連接埠, 模式為 TCP) :

firewall-cmd --zone=public --permanent --add-port=59000/tcp
firewall-cmd --reload

因為剛才已經啟動了 vsFTPd, 而我們修改了配置, 因此要重新啟用它 : systemctl restart vsftpd.

FileZilla 有兩種方式可以進行 SSL 連線, 在協定中可以選擇 SFTP 或者協定中選擇 FTP, 然後在加密中選擇允許的話就透過外顯式 TLS 的 FTP. 其它的配置不變.

Figure 12. 透過 SSL 連線成功

大家會發現現在連線進入 FTP 可以隨意訪問任意檔案夾, 如果要把 FTP 帳戶限定在某一個檔案夾, 可以編輯 chroot_list 檔案 : vim /etc/vsftpd/chroot_list, 按 i 進入編輯模式, 然後添加對應的帳戶名稱就可以了. 接著同樣要修改 vsFTPd 配置文件 vim /etc/vsftpd/vsftpd.conf, 找到 chroot_list_enable=NO 修改為 chroot_list_enable=YES; 找到 chroot_list_file, 如果檔案位置不是 /etc/vsftpd/chroot_list, 那麼修改為 chroot_list_file=/etc/vsftpd/chroot_list, 如果前面有 #, 那麼要去掉. 修改之後, 重新啟動 vsFTPd systemctl restart vsftpd.

如果要修改登陸的預設檔案夾, 那麼輸入指令 usermod -m -d 檔案夾位置 帳戶名稱. 修改之後, 要授權這個帳戶這個檔案夾的全部權限, 否則就發生無法上載, 修改或著刪除的問題 chown -R 帳戶名稱 檔案夾位置.

6. WordPress

首先進入檔案夾 cd /www, 我們透過 WordPress 的網站 https://wordpress.org/download/ 下載 WordPress 的最新版本 : wget https://wordpress.org/latest.zip, 然後解壓縮 unzip latest.zip. 我個人習慣於重新命名 : mv wordpress blog. 然後授權給 Nginx : chown -R nginx:nginx blog. 接著直接訪問 http(s)://你的網域名稱/blog, 便會出現

Figure 13. WordPress 安裝頁面

根據安裝頁面的提示, 選擇適合自己的選項並且填寫相關資料, 便可以完成安裝.