摘要訊息 : 在 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
.
和 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
即可. 對於服務商自建的安全模組, 需要開放 80
與 443
連接埠, 模式為 TCP. 現在由於 IPv6 的普及, 建議同時為 IPv4 和 IPv6 開放這兩個連接埠. 如果你不知道如何配置服務商自建的安全模組, 請諮詢你的服務商或者尋找服務商提供的教學.
Tip : 按下 "
/
" 再輸入字元就是 Vim 的搜尋; 按下i
進入編輯模式, 使用鍵盤上的上下左右按鍵進行移動; 按下esc
按鍵退出編輯模式; 按下 ":
" + "w
" + "ENter" 保存; 按下 ":
" + "q
" + "Enter
" 退出; 輸入 "wq
" 組合表示保存的同時退出, 最後加一個 "!
" 表示強制性的.
設定完成之後, 直接訪問你的 IP, 就可以看到如下的頁面 :
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 使用的指令簡單得多.
完成之後, 首先需要啟動 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
. 如果你在引入包的過程中遇到了一些莫名其妙的錯誤, 比如
可以刷新 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
指令測試配置檔案是否有錯誤, 如果出現
則說明配置檔案沒有問題, 接下來重新載入 Nginx : systemctl reload nginx
.
最後進入瀏覽器訪問 http://你的網域名稱/info.php
, 如果看到如下頁面, 就說明配置成功 (以 PHP 7 為例, PHP 8 也是類似的) :
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 字元的字串, 這個字串需要隨機, 你可以使用網上的字元亂數產生來產生一個幾乎不會被猜中的字串, 比如我的是 (不要和我的相同)
接著找到 $cfg['UploadDir']
在單引號中添加 upload
, 找到 $cfg['SaveDir']
在單引號中添加 save
.
phpMyAdmin 就配置完成了,由於我們直接把 phpMyAdmin 放在 /www
檔案夾下, 所以在剛才的網域名稱後面加上 /phpMyAdmin
就可以訪問 phpMyAdmin 了. 使用者名稱是 root
, 密碼是你剛才配置的 MySQL 密碼. 登陸之後就有以下的頁面. 當然也可以像第 3 節中那樣給 phpMyAdmin 配置一個獨立的網域名稱.
我們看到最後有一個警告, 我們點擊 "了解原因", 然後點擊 "建立" 即可. 這是為 phpMyAdmin 專門建立一個屬於它的資料庫.
5. vsFTPd
首先安裝 vsFTPd dnf install -y vsftpd
. 建立一個專門用於 FTP 的使用者 useradd FTP
(這裡的 FTP
自行修改), 給 FTP 使用者添加一個密碼 passwd 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 下載) 進行連線 :
如果無法連結, 一般是模式問題, 切換到傳輸設定選擇一個進行測試就行了. 這個可能和不同的伺服器有關 :
接著我們為 vsFTPd 開啟 SSL 連線. 執行指令 (老手可以個性化指令) openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.key -out /etc/vsftpd/vsftpd.pem
:
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. 其它的配置不變.
大家會發現現在連線進入 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
, 便會出現
根據安裝頁面的提示, 選擇適合自己的選項並且填寫相關資料, 便可以完成安裝.
自創文章, 原著 : Jonny. 如若閣下需要轉發, 在已經授權的情況下請註明本文出處 :