在今年年初, 我們發布過一篇文章《在 CentOS 8 下配置 Nginx + PHP 7 + MySQL 8 + phpMyAdmin + vsFTPd》. 在當時, PHP 還沒有發布 PHP 8, 現在 PHP 8 已經發布了, 所以我們嘗試進行配置

不同服務商提供的伺服器可能有細微的不同, 因此我們首先執行以下指令, 以確保我們安裝了 Vim、dnf (DaNdiFied Yum) 、unzip 以及 OpenSSL :

yum install -y vim dnf cockpit unzip openssl

接下來, 我們將全面使用 dnf 指令替換 yum 指令. 為了避免出現錯誤, 我建議大家首先升級一下伺服器中所有的套件 :

dnf -y update

1. Nginx

進入

http://nginx.org/packages/centos/8/x86_64/RPMS/

查看最新的 RPM 地址. 截止到發文為止, 最新的地址為

http://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.18.0-2.el8.ngx.x86_64.rpm

因此, 我們執行指令

rpm -Uvh http://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.18.0-2.el8.ngx.x86_64.rpm

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

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

systemctl enable --now nginx

接下來介紹一些 Nginx 的模組 (所有的地址都可以在 http://nginx.org/packages/centos/8/x86_64/RPMS/ 中找到最新版本) :

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

Nginx 的模組不止上面提到的這些, 大家可以自行探索. 這些模組只是可選的, 對於一般的人來說, 不安裝沒有任何影響, 除非你有特殊需求. 值得注意的是, 上面提到的一些模組, 在引入 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 回傳

如果你只是想臨時關閉, 那麼直接執行指令

setenforce 0

就可以了. 但是如果你想要永久關閉, 就需要修改檔案

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

vim /etc/selinux/config

找到 SELINUX=enforcing 修改為

SELINUX=disabled

然後重新啟動作業系統

reboot

對於服務商自建的安全模組, 需要開放 80443 連接埠, 模式為 TCP. 現在由於 IPv6 的普及, 建議同時為 IPv4 和 IPv6 開放這兩個連接埠. 如果你不知道如何配置服務商自建的安全模組, 請諮詢你的服務商或者尋找服務商提供的教學

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

systemctl enable --now nginx

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

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

2. MySQL

進入

https://dev.mysql.com/downloads/repo/yum/

找到最新的 RPM 包地址, 一般 CentOS 位於第一個

截止發文為止的最新地址為

https://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm

執行指令

rpm -Uvh https://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm

和 Nginx 不同的是, MySQL 並不會直接安裝, 需要手動安裝 :

dnf install -y @mysql

其中的 "@" 表示 MySQL 的套件包, 這個指令要比之前 CentOS 7 使用的指令簡單得多

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

上面這個圖是之前那個文章中發的, 結果也都差不多

完成之後, 首先需要啟動 MySQL. 和 CentOS 7 安裝時不同的是, 在 CentOS 8 中, MySQL 安裝之後並不會直接設定自動執行, 而 MySQL 一般是需要啟動後自動執行的, 所以執行指令

systemctl enable --now mysqld

然後進行配置, 配置的方法也和 CentOS 7 不同, 需要執行指令

mysql_secure_installation

在這之前, 我要提醒大家, 如果你對 MySQL 不熟悉, 那麼請按照本博客給出的方法設定 MySQL. 當然, 這個配置過程你可以完全個性化, 如果你不想確定某個操作, 不要輸入 y 或者 Y即可, 其它任意的按鍵都可以幫助你避開某個操作

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是詢問是否啟用驗證密碼套件, 一般輸入 y 確認

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是詢問 MySQL 的帳戶密碼強度. MySQL 要求任意帳戶的密碼都必須大於 8 個字元. 0 代表低強度 (LOW) 密碼, 任意大於 8 個字元的密碼均可; 1 代表中等強度 (MEDIUM) 的密碼, 除了 LOW 的要求之外, 還要求數字 + 大小寫 + 特殊字元; 2 代表高強度 (STRONG) 的密碼, 除了 MEDIUM 的要求之外, 還要求字典檔案. 一般 MEDIUM 強度即可, 不過為了安全起見, 我們使用高強度, 此處輸入 2 (如果你只想用中等強度, 那麼輸入 1, 不推薦低強度)

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是確認你剛才所輸入的密碼, 密碼的最大長度為 100 個字元

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

MySQL 會有一個不具名帳戶, 一般情況下我們輸入 y 移除它

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

MySQL 的預設帳戶 root 擁有全域的權限, 因此一般輸入 y 禁止它遠端登陸

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

MySQL 預設會創建一個名為 test 的資料庫, 一般輸入 y 移除它

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是詢問是否重新載入資料表權限, 一般輸入 y 來重新載入

到此, MySQL 安裝完成. 之前, 我們需要為 MySQL 建立一個相容的 root 帳戶, 但是目前很多程式已經支援了 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

如果你在引入包的過程中遇到了一些莫名其妙的錯誤, 比如

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

以及其它一些錯誤. 我遇到過另外一種錯誤, 不過當時連線被斷開, 所以沒辦法擷取圖片

刷新 RPM 包的緩存 (如果你沒有遇到, 那麼接下來這三步可以省略) :

dnf upgrade --refresh rpm glibc

然後假裝升級 dnf 套件 :

rm /var/lib/rpm/.rpm.lock

dnf upgrade dnf

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

通過指令 dnf module list php, 我們可以看到一些關於 PHP 的套件 :

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

作業系統本身自帶了 PHP 7.2、PHP 7.3 和 PHP 7.4, 但是我們要安裝的是 PHP 8.0

在安裝 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.noarch 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-datadog-trace 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.noarch --skip-broken

上面指令會忽略三個套件 : php80-php-pecl-krb5、php80-php-pecl-krb5-devel 和 php80-php-sqlsrv. 其中, 前面兩個套件和我們的作業系統不相容, 最後一個套件要求安裝 msodbcsq 套件, 這是關於 Microsoft 的 MSSQL 的套件, 如果沒有安裝套件 msodbcsq, 那麼就無法安裝 php80-php-sqlsrv. 因此, 上述三個套件我們直接使用 --skip-broken 跳過. 如果你的作業系統上安裝了 msodbcsq, 那麼套件 php80-php-sqlsrv 不會被跳過

接下來我們需要配置 PHP

vim /etc/opt/remi/php80/php-fpm.d/www.conf

找到 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 的方式. 這個方式對於小的網站比較友好, 有更好的速度. 大型網站仍然建議使用連接埠的形式

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

chown nginx:nginx /var/opt/remi/php80/run/php-fpm/www.sock

找到 ;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_timepost_max_sizeupload_max_filesize

接下來將一些檔案夾的權限還給 Nginx

chown -R nginx:nginx /var/opt/remi/php80/lib/php/session

接著啟動 PHP-FPM

systemctl enable --now php80-php-fpm

最後, 我們測試一下 PHP 是否被正確安裝

mkdir /www && cd /www

vim info.php

i 進入編輯模式, 輸入 (不要忘了分號)

<?php phpinfo();

接著配置 Nginx 展示這個頁面, 此處我直接將網域名稱繫結到這個頁面上. 之後我將不再單獨講解這一部分

cd /etc/nginx/conf.d

vim test.jonny.vip.conf

上面具體的名稱可以改為自己的網域名稱, 比如你的網域為 abc.com, 那就可以改為 abc.com.conf, 最後的 .conf 不能捨去. 按 i 進入編輯模式, 修改下面的配置檔案之後複製進去即可

首先給出沒有開啟 SSL 的配置, 新手請使用這個配置, 不要給自己麻煩, SSL 的配置可以之後慢慢再去學習添加

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 /var/crt/test.jonny.vip.crt;    #SSL 證書存放位置, 此處一定要更改
    ssl_certificate_key /var/crt/test.jonny.vip.key;    #SSL 證書存放位置, 此處一定要更改
    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;
    }
}

具體開啟 HTTPS 的學習請看這篇文章《Nginx 下实现 HTTPS》

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

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

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

systemctl reload nginx

最後進入瀏覽器訪問 http://你的網域名稱/info.php, 如果看到如下頁面, 就說明配置成功

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

4. phpMyAdmin

首先進入我們剛剛建立的檔案夾 /www

cd /www

然後進入網頁

https://www.phpmyadmin.net

查找最新版本的 phpMyAdmin, 截止發文為止最新的下載地址是

https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.zip

執行指令

wget https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.zip

下載完成之後解除封存

unzip phpMyAdmin-5.0.4-all-languages.zip

重新命名

mv phpMyAdmin-5.0.4-all-languages phpMyAdmin

進入檔案夾

cd phpMyAdmin

建立上載和存儲的檔案夾

mkdir save

mkdir upload

建立配置檔案

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 字元的字串, 這個字串需要隨機, 你可以使用網上的字元亂數產生來產生一個幾乎不會被猜中的字串, 比如我的是

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

不要與我的相同!

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

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

phpMyAdmin 就配置完成了,由於我們直接配置在 /www 檔案夾下, 所以在剛才的網域名稱後面加上 /phpMyAdmin 就可以訪問 phpMyAdmin 了

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

對於老手來說, 可能會對 phpMyAdmin 配置 SSL 以及獨立的網域名稱, 這一步新手可以自己嘗試, 所有的步驟在上面已經給出來了, 依樣畫葫蘆就可以了

使用者名稱是 root, 密碼是你剛才配置的 MySQL 密碼. 登陸之後就有以下的頁面

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

我們看到最後有一個警告, 我們點擊 "了解原因"

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

然後點擊 "建立" 即可

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

如果出現以下錯誤

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

解決的方法很簡單, 建立一個 tmp 的檔案夾然後把權限給 Nginx 即可

cd /www/phpMyAdmin

mkdir tmp

chown -R nginx:nginx tmp

刷新之後就看不到這個錯誤了

phpMyAdmin 到此就配置完成了

5. vsFTPd

首先安裝 vsFTPd

dnf install -y vsftpd

建立一個 FTP 用戶

useradd FTP

給 FTP 用戶添加一個密碼, 這個用戶名你可以用你自己喜歡的

passwd FTP

接下來輸入兩次密碼即可

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

如果你希望這個用戶只能登陸 FTP, 那麼需要禁止其通過終端機的方式登陸, 執行以下指令

usermod -s /sbin/nologin FTP

vim /etc/shells

移動到最後添加一行

/sbin/nologin

讓 vsFTPd 自動執行並且啟用它

systemctl enable --now vsftpd

如果你開啟了 FireWall, 那麼需要執行以下指令

firewall-cmd --permanent --add-port=21/tcp

firewall-cmd --permanent --add-service=ftp

firewall-cmd --reload

如果你的伺服器使用的是自建的安全模組, 那麼需要添加連接埠 21 讓外部可以訪問, 模式為 TCP

接著, 我們使用 FileZilla 進行連線

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

如果無法連結, 一般是模式問題, 切換到傳輸設定選擇一個進行測試就行了

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

如果一個不行就選擇另外一個

接著我們為其開啟 SSL 連線

執行指令 (老手可以個性化指令)

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

首先輸入國家的縮寫 (兩個字元)

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

輸入省份或著洲的名稱

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

輸入城市的名稱

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

輸入公司的名稱

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

輸入組織的名稱

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

填寫網域名稱

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

填寫你的 E-Mail 地址. 值得注意的是, 這份證書僅有 365 天的有效期, 365 天之後要刪除舊的證書, 然後重新執行上述步驟

全部輸入完畢之後, 編輯配置檔案

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=59010    #連接埠結束, 這個可以根據你自己的需要修改

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

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

firewall-cmd --reload

因為剛才已經啟動了 vsFTPd, 而我們修改了配置, 因此要重新執行它

systemctl restart vsftpd

FileZilla 有兩種方式可以進行 SSL 連線

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是第一種, 比較推薦使用這一種

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

這是第二種. 中間如果遇到要求確認證書, 那麼直接點擊確認即可

大家會發現現在連線進入 FTP 可以隨意訪問任意檔案夾, 如果要把 FTP 帳戶限定在某一個檔案夾, 可以編輯 chroot_list 檔案

vim /etc/vsftpd/chroot_list

i 進入編輯模式, 然後添加對應的帳戶名稱就可以了

接著要修改配置文件

vim /etc/vsftpd/vsftpd.conf

找到 chroot_list_enable=NO 修改為

chroot_list_enable=YES

找到 chroot_list_file, 如果檔案的位置不對, 那麼修改為

chroot_list_file=/etc/vsftpd/chroot_list

如果前面有 "#", 那麼要去掉

修改之後, 要記得重新啟動 vsFTPd

systemctl restart vsftpd

如果要修改登陸的預設檔案夾, 那麼輸入指令

usermod -m -d 檔案夾位置 帳戶名稱

修改之後, 要授權這個帳戶這個檔案夾的全部權限, 否則就發生無法上載、修改或著刪除的問題

chown -R 帳戶名稱 檔案夾位置

6. 【One More Thing】嘗試安裝 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

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

我們可以看到這個頁面, 直接跟著上面的步驟進行安裝

在 CentOS 8 下配置 Nginx + PHP 8 + MySQL 8 + phpMyAdmin + vsFTPd-Jonny'Blog

安裝完成之後, 我們發現, 完全可以正常訪問