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

0. 前言

CentOS 8 於 2019 年 9 月釋出, 目前很多伺服器提供商已經可以部署 CentOS 8 的實例. 本人已經嘗試在 CentOS 8 上進行配置, 發現 CentOS 8 上的有一些操作與 CentOS 7 有很大的不同, 所以寫了這篇文章.

考慮到這篇文章主要可能面向新人, 所以我將盡可能詳細地描述每一個步驟, 必要時將會有圖像進行說明. 不同的伺服器提供的作業系統可能有一些差異, 所以當有步驟的回饋與本文給出的圖像不符合的時候, 要仔細閱讀作業系統給定的說明. 如果出現錯誤, 請仔細審核步驟是否相同, 如果還是出現錯誤, 請留下評論或著 Google 搜尋.

在開始之前, 我需要說明的是, 我使用的伺服器提供商提供的 CentOS 8 預裝了 Vim, dnf (DaNdiFied Yum), unzip 以及 OpenSSL. 為了防止不同伺服器提供商提供的作業系統預裝軟體不同, 如果大家對自己的作業系統是否預裝上述軟體的情況不太了解, 建議執行指令 yum install -y vim dnf unzip openssl.

目前暫時不打算對這篇文章進行歸檔, 這篇文章的重點在於 PHP 7.

更新紀錄 :

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

1. Nginx

進入 http://nginx.org/packages/centos/8/x86_64/RPMS/ 查看 nginx-1.xx.x-x.el8.ngx.x86_64.rpm 最新的那個版本. 截止到發文為止, 最新版本的地址為 https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.20.2-1.el8.ngx.x86_64.rpm. 所以我們執行指令 rpm -Uvh https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.20.2-1.el8.ngx.x86_64.rpm.

Figure 1. Nginx 安裝完成

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

CentOS 8 預設啟用了 SELinux, 一部分伺服器提供商也啟用了 Firewall. 本文章不研究 SELinux, 因為本文安裝的內容過多, 它的管理實在是太過麻煩. 對於新手來說, 你可以直接修改 SELinux 的配置檔案 vim /etc/selinux/config, 找到 SELINUX=enforcing 修改為 SELINUX=disabled, 然後通過 reboot 指令重新啟動即可. 如果 Firewall 也啟用了, 那麼需要開放和網站相關的連結埠 :

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

每一條指令執行之後, 都會有 success 回傳.

如果伺服器提供商提供了自建的安全模組, 那麼請自行搜尋伺服器提供商提供的安全模組設定的教學, 開放 80443 連接埠, 模式為 TCP.

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

Figure 2. Nginx 提供的預設網頁

2. MySQL

進入 https://dev.mysql.com/downloads/repo/yum/ 找到 Red Hat Enterprise Linux 8 / Oracle Linux 8 (Architecture Independent), RPM Package. 然後提取下載地址, 截止發文為止的最新地址為 https://repo.mysql.com//mysql80-community-release-el8-3.noarch.rpm. 執行指令 rpm -Uvh https://repo.mysql.com//mysql80-community-release-el8-1.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-releasencurses-devel : dnf install -y epel-release ncurses-devel. 然後直接執行指令引入 RPM 包 :

rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
rpm -Uvh http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/libedit-devel-3.1-23.20170329cvs.el8.x86_64.rpm
rpm -Uvh http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic//libsz2-2.1-alt4.x86_64.rpm
rpm -Uvh http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic//libsz2-devel-2.1-alt4.x86_64.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/8/remi/x86_64//libwebsockets-2.4.2-1.el8.remi.x86_64.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/8/remi/x86_64//libwebsockets-devel-2.4.2-1.el8.remi.x86_64.rpm

首先是必選的一些套件, 這些套件幾乎不會和程式不相容 :

dnf install -y php74-runtime php74-scldevel php74 php74-build php74-php php74-php-ast php74-php-bcmath php74-php-brotli php74-php-channel-horde php74-php-cli php74-php-common php74-php-componere php74-php-dba php74-php-dbg php74-php-devel php74-php-embedded php74-php-enchant php74-php-fpm php74-php-gd php74-php-geos php74-php-gmp php74-php-horde-horde-lz4 php74-php-imap php74-php-interbase php74-php-intl php74-php-ioncube-loader php74-php-json php74-php-ldap php74-php-libvirt php74-php-libvirt-doc php74-php-litespeed php74-php-lz4 php74-php-mbstring php74-php-mysqlnd php74-php-odbc php74-php-opcache php74-php-pdo php74-php-pdo-dblib php74-php-pear php74-php-pgsql php74-php-phalcon3 php74-php-phpiredis php74-php-pinba php74-php-process php74-php-pspell php74-php-recode php74-php-smbclient php74-php-snappy php74-php-snmp php74-php-snuffleupagus php74-php-soap php74-php-sodium php74-php-tarantool php74-php-tidy php74-php-wkhtmltox php74-php-xml php74-php-xmlrpc php74-php-zephir-parser php74-php-zstd php74-uwsgi-plugin-php php74-zephir php74-zephir-parser php74-php-channel --skip-broken

接下來是一些可選套件, 值得注意的是, 這些可選套件有些可能會和你的程式不相容 :

dnf install -y php74-php-pecl-amqp php74-php-pecl-apcu php74-php-pecl-apcu-bc php74-php-pecl-apcu-devel php74-php-pecl-apfd php74-php-pecl-apm php74-php-pecl-bitset php74-php-pecl-cassandra php74-php-pecl-cmark php74-php-pecl-couchbase2 php74-php-pecl-crypto php74-php-pecl-dbase php74-php-pecl-dio php74-php-pecl-druid php74-php-pecl-ds php74-php-pecl-eio php74-php-pecl-env php74-php-pecl-ev php74-php-pecl-event php74-php-pecl-fann php74-php-pecl-gearman php74-php-pecl-gender php74-php-pecl-geoip php74-php-pecl-geospatial php74-php-pecl-gnupg php74-php-pecl-grpc php74-php-pecl-handlebars php74-php-pecl-hdr-histogram php74-php-pecl-hprose php74-php-pecl-hrtime php74-php-pecl-http php74-php-pecl-http-devel php74-php-pecl-igbinary php74-php-pecl-igbinary-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-inotify php74-php-pecl-ip2location php74-php-pecl-json-post php74-php-pecl-jsond php74-php-pecl-jsond-devel php74-php-pecl-krb5 php74-php-pecl-krb5-devel php74-php-pecl-leveldb php74-php-pecl-libsodium php74-php-pecl-lua php74-php-pecl-lzf php74-php-pecl-mailparse php74-php-pecl-mcrypt php74-php-pecl-memcache php74-php-pecl-memcached php74-php-pecl-mogilefs php74-php-pecl-mongodb php74-php-pecl-mosquitto php74-php-pecl-msgpack php74-php-pecl-msgpack-devel php74-php-pecl-mustache php74-php-pecl-mysql php74-php-pecl-mysql-xdevapi php74-php-pecl-nsq php74-php-pecl-oauth php74-php-pecl-opencensus php74-php-pecl-parle php74-php-pecl-pcs php74-php-pecl-pcs-devel php74-php-pecl-pdflib php74-php-pecl-pq php74-php-pecl-propro php74-php-pecl-protobuf php74-php-pecl-psr php74-php-pecl-radius php74-php-pecl-raphf php74-php-pecl-rar php74-php-pecl-rdkafka php74-php-pecl-redis4 php74-php-pecl-ref php74-php-pecl-request php74-php-pecl-rpminfo php74-php-pecl-rrd php74-php-pecl-scrypt php74-php-pecl-seaslog php74-php-pecl-selinux php74-php-pecl-solr2 php74-php-pecl-sphinx php74-php-pecl-ssdeep php74-php-pecl-ssh2 php74-php-pecl-stats php74-php-pecl-stomp php74-php-pecl-swoole-serialize php74-php-pecl-swoole4 php74-php-pecl-sync php74-php-pecl-taint php74-php-pecl-tcpwrap php74-php-pecl-termbox php74-php-pecl-timecop php74-php-pecl-trace php74-php-pecl-trader php74-php-pecl-translit php74-php-pecl-uploadprogress php74-php-pecl-uuid php74-php-pecl-uv php74-php-pecl-varnish php74-php-pecl-vips php74-php-pecl-vld php74-php-pecl-weakref php74-php-pecl-xattr php74-php-pecl-xdebug php74-php-pecl-xdiff php74-php-pecl-xlswriter php74-php-pecl-xmldiff php74-php-pecl-xxtea php74-php-pecl-yac php74-php-pecl-yaconf php74-php-pecl-yaf php74-php-pecl-yaml php74-php-pecl-yar php74-php-pecl-yaz php74-php-pecl-zip php74-php-pecl-zmq php74-php-pggi php74-php-pecl-propro-devel php74-php-pecl-psr-devel php74-php-pecl-raphf-devel php74-php-pecl-xmldiff-devel php74-php-pecl-yaconf-devel php74-php-pecl-memprof php74-php-pecl-uopz --skip-broken

比如最後兩個套件 : php74-php-pecl-memprofphp74-php-pecl-uopz 就和 WordPress 不相容, 如果你想要安裝 WordPress, 那麼就不能安裝這兩個套件 (當時安裝的時候確實是這樣, 至於這兩個套件後面升級之後是否還是和 WordPress 不相容還需要經過測試). 另外, 此處我給出偵錯的辦法. 大家如果把上面的可選套件全都安裝了, 但是又找不到哪幾個套件和你的程式不相容, 那麼大家可以通過折半搜尋, 也就是解除安裝一半 (可以是前面一半也可以是後面一半). 如果此時大家發現自己的程式正確運作了, 那麼問題就在移除的那部分套件中. 然後重新安裝上那部分套件, 再解除安裝一半中的一半, 如此循環就可以找到哪個套件和你的程式不相容了. 一般折半搜尋只需要在可選的套件中進行. 移除的指令為 dnf remove -y 套件名稱. 另外, 由於不同的伺服器會有不同的情況, 上述所有套件不一定會全部被安裝, 有一些會被跳過, 這是正常的.

提前說明 : 按下 "/" 再輸入字元就是 vim 的搜尋, 按下 i 進入編輯模式, 使用鍵盤上的上下左右按鍵進行移動, 按下 esc 按鍵退出編輯模式, 按下 ":" + "w" + "回車" 保存, 按下 ":" + "q" + "回車" 退出

接下來我們配置 PHP-FPM : vim /etc/opt/remi/php74/php-fpm.d/www.conf. 找到 user = apache 修改為 user = nginx, 找到 group = apache 修改為 group = nginx. 對於有了解 PHP的人看到 listen = /var/opt/remi/php74/run/php-fpm/www.sock 這行可能有些奇怪, 因為原來我們一直是使用連接埠 9000, 即 127.0.0.1:9000, 現在我們改用 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 : vim /etc/opt/remi/php74/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_sizeupload_max_filesize. 將一些檔案夾的權限還給 Nginx :

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

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

最後, 我們測試一下 PHP 是否被正確安裝 : mkdir /www && cd /www && vim info.php. 按 i 進入編輯模式, 輸入 (不要忘了分號) :

<?php
    phpinfo();

接著配置 Nginx 展示這個頁面, 此處我直接將網域名稱繫結到這個頁面上. 首先給出沒有開啟 SSL 的配置, 新手請使用這個配置, 不要給自己麻煩, SSL 的配置可以之後慢慢再去學習添加. 使用指令 vim /etc/nginx/conf.d/test.conf 創建新的 Nginx 配置檔案, 按 i 進入編輯模式, 修改下面的配置檔案之後複製進去即可 :

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/php74/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 的配置 (具體開啟 HTTPS 的學習請看這篇教學文章《Nginx 下实现 HTTPS》) :

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/php74/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 4. Nginx 檔案檢查結果

說明配置檔案沒有問題. 然後通過指令 systemctl reload nginx 重新載入 Nginx 配置檔案. 最後進入瀏覽器訪問 http://你的網域名稱/info.php, 如果看到如下頁面, 就說明配置成功

Figure 5. 成功配置 PHP

4. phpMyAdmin

首先進入我們剛剛建立的檔案夾 /www : cd /www. 然後進入網頁 https://www.phpmyadmin.net 查找最新版本的 phpMyAdmin. 截止發文為止最新的下載地址是 https://files.phpmyadmin.net/phpMyAdmin/5.1.3/phpMyAdmin-5.1.3-all-languages.zip, 執行指令 wget https://files.phpmyadmin.net/phpMyAdmin/5.1.3/phpMyAdmin-5.1.3-all-languages.zip. 下載完成之後解除封存 : unzip phpMyAdmin-*.zip, 並重新命名 mv phpMyAdmin-5.0.0-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. 找到 $cfg['blowfish_secret'], 在後面的單引號中添加一個至少長達 32 字元的字串, 這個字串需要隨機, 你可以使用網上的字元亂數產生工具來產生一個幾乎不會被猜中的字串, 比如我的是 (不要和我的相同) :

Figure 6. $cfg['blowfish_secret']

接著找到 $cfg['UploadDir'] 在單引號中添加 upload, 找到 $cfg['SaveDir'] 在單引號中添加 save. phpMyAdmin 就配置完成了,由於我們直接配置在 /www 檔案夾下, 所以在剛才的網域名稱後面加上 /phpMyAdmin 就可以訪問 phpMyAdmin 了 :

Figure 7. phpMyAdmin 登錄頁

對於老手來說, 可能會對 phpMyAdmin 配置 SSL 以及獨立的網域名稱, 這一步大家可以自己嘗試, 所有的步驟和第 3 節類似.

使用者名稱是 root, 密碼是第 2 節中配置的 MySQL 密碼. 登陸之後就有以下的頁面 :

Figure 8. phpMyAdmin 操作頁

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

Figure 9. 臨時檔案夾問題

解決的方法很簡單, 建立一個 tmp 的檔案夾 cd /www/phpMyAdmin && mkdir tmp 然後授權給 Nginx 即可 chown -R nginx:nginx tmp. 刷新之後就看不到這個錯誤了, phpMyAdmin 到此就配置完成了.

5. vsFTPd

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

Figure 10. 建立 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 11-1. 連線配置
Figure 11-2. 連線成功

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

Figure 11-3. 連線傳輸設定

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

Figure 12. 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 13. 透過 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 帳戶名稱 檔案夾位置.