Ubuntu 20.04 伺服器設定 (Nginx, PHP, MySQL, phpMyAdmin, Python 3.9)

1. 新增使用者

sudo 指令的意思是 “superuser do! ”,告訴Linux此指令要以系統颴理員的權限去執行。

adduser 新增使用者

sudo adduser john

系統將提示您輸入新密碼,可以在這邊去產生隨機密碼或是自行建立密碼。這邊需要注意的是,在Linux輸入密碼時,螢幕不會出現任何反應,但是不要擔心,Linux會紀錄使用這輸入的密碼的。

輸入新密碼後,還將要求你輸入聯繫方式。其實不需填寫這些,只需按一下 ENTER 預設值即可。

usermod 將用戶附加到某一群組

創建新用戶後,可以使用usermod 指令為這個用戶授予超級用戶特權。-aG 參數是指**附加(Append)群組(Group)**的縮寫指令,下面的例子是附加到及超級用戶組sudo

sudo usermod -aG sudo john

一旦運行命令,如果沒有錯誤,將不會得到錯誤訊息,同時也不會得到任何成功訊息。Linux通常就是這樣,如果沒有錯誤訊息出現,則可視為正常成功。

su 切換用戶 (substitute user)

我們可以使用 指令 su(substitute)切換到新帳戶 john。

sudo su - john

當然要輸入john的密碼:

Password:
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.

john@servername:~$

從現在開始,您可以使用該新用戶登錄Ubuntu 20.04。

2. 設置防火牆

設置防火牆以確保僅允許連接到某些服務始終是一個好主意。Ubuntu 20.04的預設防火牆配置工具是 ufw 。它提供了一種用戶友好的方式來創建基於IPv4或IPv6主機的防火牆。

如果通過SSH連接,請首先建立允許OpenSSH的為防火牆規則,以免被阻擋在防火牆外面,無法遠端連入。

sudo ufw allow OpenSSH

如果成功,你將看到 “Rules updated” 的訊息。

現在啟用防火牆,然後按 y 再按 ENTER ,然後螢幕將出現警示訊息 “Command may disrupt existing ssh connections” ,意思是說,如果之前沒有開啟OpenSSH的連線規則,而直接開啟防火牆的話,目前的遠端連線會被中斷。

啟動防火牆的指令為:

sudo ufw enable

顯示防火牆狀態的指令為:

sudo ufw status

這時會看到以下的狀態顯示訊息:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

3. 時區設定

查看目前Linux系統的時間與時區:

date

顯示所有時區:

timedatectl list-timezones

會出現:

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa

可以使用page uppage down切換上下頁,如果要中斷時區列表的顯示請按下 ctrl + c

設定台灣時區:

sudo timedatectl set-timezone Asia/Taipei

顯示時間設定資訊:

timedatectl

此時會看到以下訊息:

                      Local time: Sat 2018-05-12 09:35:11 UTC
                  Universal time: Sat 2018-05-12 09:35:11 UTC
                        RTC time: Sat 2018-05-12 09:35:12
                       Time zone: Etc/UTC (UTC, +0000)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

開啟時間同步功能

確定 System clock synchronizedsystemd-timesyncd.service active 設定為 yes。如果是 no 的話,可以用以下指令開啟:

sudo timedatectl set-ntp on

4. 更新Ubuntu 20.04系統

運行以下指令以下載並安裝最新的軟體包。使用 && 把指令分隔,並將連續運行。如果螢幕有提示訊息,請按 yENTER

sudo apt update && sudo apt upgrade && sudo apt dist-upgrade

更新後,或許需要重新啟動系統:

sudo reboot

5. 建立交換空間

為什麼需要交換空間?如果您的Ubuntu 20.04伺服器在重負載期間磁碟空間不足,則某些關鍵服務(例如MySQL)可能會崩潰。重要的是要有一些交換空間,如果確實需要,可以將內存擴展到該交換空間。

swapon --show
sudo fallocate -l 2G /swapfile
ls -lh /swapfile
-rw-r--r-- 1 root root 2.0G Aug 3 18:59 /swapfile

6. Nginx網頁伺服器安裝與設定

6.1 安裝Nginx伺服器

安裝Nginx的指令如下:

sudo apt update && sudo apt install nginx

安裝完畢後,可以使用以下指令查詢Nginx的狀態:

sudo service nginx status

如果Nginx有正常啟動,會出現如下的狀態訊息:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-04-27 23:05:58 UTC; 2min 26s ago
       Docs: man:nginx(8)
   Main PID: 2433 (nginx)
      Tasks: 2 (limit: 1137)
     Memory: 5.1M
     CGroup: /system.slice/nginx.service
             ├─2433 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─2434 nginx: worker process

Apr 27 23:05:58 ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 27 23:05:58 ubuntu systemd[1]: Started A high performance web server and a reverse proxy server.

你可以按下 q離開狀態檢視畫面。

6.2 設定Nginx的防火牆規則

先把OpenSSH的防火牆規則打開,以確保等一下可以持續連線,不會連線中斷

sudo ufw allow OpenSSH

把Nginx伺服器的通訊規則打開:

sudo ufw allow 'Nginx Full'

這時螢幕將輸出:

Rule added
Rule added (v6)

設定好之後,就可以開啟防火牆:

sudo ufw enable

然後可以檢查防火牆狀態:

sudo ufw status

這時會出現以下畫面:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

6.3 測試網頁

可以在瀏覽器輸入該伺服器的ip address,就可以連到我們剛剛所設定的網頁伺服器,

如果不知道ip address,可以輸入以下指令查看:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

網頁的預設畫面如下:

image

以上的頁面對應到ubuntu伺服器的某一個檔案,其路徑為 /var/www/html/index.nginx-debian.html ,如果要修改預設網頁的內容,可以使用 nano 指令:

sudo nano /var/www/html/index.nginx-debian.html

就可以進入文字編輯環境。如果修改完畢後要儲存,可以按下 ctrl + x,然後再按下 y 以及 ENTER來儲存檔案。

以上就是一個網站的情況。

6.4 配置伺服器區塊 Server Blocks

實際的情況中,多個網站共用一個ip,多個網站共用同一台ubuntu住機是很常見的。我們將示範在一個ubuntu主機的Nginx下面,建立兩個網站。假設這兩個網站的domain name分別為 mytest1.commytest2.com

6.4.1 設定各自的網頁根目錄

Nginx預設的網頁目錄為: /var/www

預設網站的根目錄為:/var/www/html

現在我們要新增量個網站分別為 mytest1.commytest2.com,所以我門設定這兩個網站的根目錄分別為:
/var/www/mytest1.com/public_html

/var/www/mytest2.com/public_html

所以使用 mkdir 指令建立目錄,指令分別為:

sudo mkdir -p /var/www/mytest1.com/public_html
sudo mkdir -p /var/www/mytest1.com/public_html

如果我們希望普通的非root用戶能夠修改這些目錄中的文件,則必須更改所有權。

sudo chown -R $(whoami):$(whoami) /var/www/mytest1.com/public_html
sudo chown -R $(whoami):$(whoami) /var/www/mytest2.com/public_html

其中, $(whoami) 變數自動將使用當前登錄用戶的值。

我們還必須確保將常規Web目錄/var/www 及其內容的權限 設置為,755 以便可以正確提供頁面,讓匿名用戶也可以有權限查看。指令如下:

sudo chmod -R 755 /var/www

6.4.2 建立測試網頁

現在,我們將index.html 使用echo 命令為每個域創建一個簡單的網頁 。

如果您有一個域名,請不要忘記在此處 用自己的域名替換 mytest1.com

sudo echo "Welcome to mytest1.com!" > /var/www/mytest1.com/public_html/index.html

現在對mytest2 .com 進行相同的 操作

sudo echo "Welcome to mytest2.com!" > /var/www/mytest2.com/public_html/index.html

6.4.3 配置第一個伺服器區塊

Nginx包含一個默認的伺服器區塊/etc/nginx/sites-available/default ,可以作我們自己的服務器塊的模板。將此文件複製到以您的域命名的新文件。在此範例中,我們的domain name為 mytest1.com ,因此:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mytest1.com

編輯剛剛複製的文件:

sudo nano /etc/nginx/sites-available/mytest1.com

在編輯畫面中,找到以下的區塊:

        listen 80 default_server;
        listen [::]:80 default_server;

只有一個伺服器區塊可以具有該 default_server 規範,作為預設的網站。所以這邊我們會把 default_server 刪除,所以以上的內容將被修改為:

        listen 80;
        listen [::]:80;

CTRL + W 並搜尋 root /var/www/html;

由於我們的 mytest1.com 網站的根目錄為 /var/www/mytest1.com/public_html ,所以設定請修改為:

    root /var/www/mytest1.com/public_html;

CTRL + W 並搜尋 server_name _;

我們可以在這邊加上我們的 domain name,這裡是 mytest1.com,也可以把 www.mytest1.com加進去。

    server_name mytest1.com www.mytest1.com;

保存並退出(按 CTRL + XY 然後按 ENTER

在繼續下一步之前,請確保Nginx配置文件語法有效。指令如下:

sudo nginx -t

如果參數設定正確,就會輸出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6.4.4 配置第二個伺服器區塊

現在,我們將為其他domain name(在本範例中為 mytest2.com )創建一個伺服器區塊 。

首先,我們將預設伺服器區塊 /etc/nginx/sites-available/default 複製到 /etc/nginx/sites-available/mytest2.com

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mytest2.com

現在編輯剛剛複制的文件。

sudo nano /etc/nginx/sites-available/mytest2.com

CTRL + W 並蒐索 default_server;

將會找到以下的內容:

        listen 80 default_server;
        listen [::]:80 default_server;

同樣的,把 default_server 字樣刪除,所以設定變為:

        listen 80;
        listen [::]:80;

將此更改為您的domain name。在我們的範例中,我們的domain name為 mytest2.com ,另外,我們再把 www.mytest2.com 加進去。

    server_name mytest2.com www.mytest2.com;

保存並退出(按 CTRL + XY 然後按ENTER

在繼續下一步之前,請確保Nginx配置文件語法有效。

sudo nginx -t

輸出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6.4.5 Create Symbolic Links

現在,我們將創建從 sites-available 目錄到sites-enabled 目錄的符號鏈接,在啟動過程中Nginx會讀取該 鏈接 。如果有domain name,請確保將 mytest1.commytest2.com 替換為您自己的 domain name。指令為 ln

sudo ln -s /etc/nginx/sites-available/mytest1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/mytest2.com /etc/nginx/sites-enabled/

現在重新啟動Nginx。

sudo service nginx restart

6.4.6 測試Nginx

假設您已經在域註冊服務上配置了DNS,以將網域指向Nginx服務器的IP,那麼您現在應該能夠在瀏覽器中查看這些測試網頁。
image

7. 為Nginx安裝PHP

7.1. 安裝PHP

與Apache不同,Nginx不包含本地PHP處理。為此,我們必須安裝PHP-FPM(FastCGI流程管理器)。FPM是PHP FastCGI的替代實現,具有一些對重載站點有用的附加功能。

在安裝php-fpm之前,應添加Ubuntu的Universe存儲庫,以確保獲得正確的軟件包。

sudo add-apt-repository universe

現在更新軟件包列表,並在Ubuntu 20.04上安裝PHP-FPM。我們還將安裝 php-mysql 以允許PHP與MySQL數據庫進行通信。 當要求繼續時,按 yENTER

sudo apt update && sudo apt install php-fpm

如果打算使用MySQL,還應該安裝該php-mysql 軟體。

sudo apt install php-mysql

安裝後,檢查PHP版本。

php --version

如果PHP安裝正確,您應該會看到類似下面的內容。

PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

上面我們使用的是PHP 7.4 版本 儘管根據存儲庫中的哪個軟件包**,** 這可能是您的更高版本。

根據您安裝的Nginx和PHP版本,您可能需要手動配置Nginx將連接到的PHP套接字的位置。

列出目錄的內容 /var/run/php/

ls /var/run/php/

您應該在這裡看到一些項目。

total 4
lrwxrwxrwx 1 root     root     30 Apr 27 23:28 php-fpm.sock -> /etc/alternatives/php-fpm.sock
-rw-r--r-- 1 root     root      5 Apr 27 23:28 php7.4-fpm.pid
srw-rw---- 1 www-data www-data  0 Apr 27 23:28 php7.4-fpm.sock

在上方我們可以看到套接字被稱為 php7.4-fpm.sock 。請記住這一點,因為下一步將會需要它。

7.2. 為PHP配置Nginx

現在,我們需要對Nginx伺服器區塊進行一些設定上的調整。

伺服器區塊的位置可能會因您的設置而異。預設情況下,它位於 /etc/nginx/sites-available/default 。如果您遵循之前Nginx的設置多個domain name的指南,則您的配置文件可能位於 /etc/nginx/sites-available/example.com

同樣使用nano來編輯文件。

sudo nano /etc/nginx/sites-available/default

7.2.1. 優先index.php

CTRL + W 並搜尋 index.html

index.php 添加在 index.html 之前,這樣預設文件將以 index.php 視為最優先順位,將 index.html 視為次一順位。

所以實際上將修改為:

    index index.php index.html index.htm index.nginx-debian.html;

7.2.2. 檢查伺服器名稱

CTRL + W 並蒐索該行 server_name

在此處輸入服務器的IP,如果有domain name,則輸入domain name。

        server_name YOUR_DOMAIN_OR_IP_HERE;

7.2.3. 指定由php來處理php script

CTRL + W 並搜尋 location ~ \.php

您需要在此處取消註釋某些行,方法是刪除 # 下面用紅色標記的四行之前的符號。

還要確保 fastcgi_pass 套接字路徑的值正確。例如,如果您安裝了PHP版本7.4,則套接字應為: /var/run/php/php7.4-fpm.sock

如果不確定在此使用哪個套接字,請退出nano並運行 ls /var/run/php/

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }
 

7.2.4. 保存並重啟Nginx服務

進行必要的更改後,保存並關閉(按 CTRL + X ,然後按 yENTER 確認保存)

現在檢查配置文件,以確保沒有語法錯誤:

sudo nginx -t

如果沒有錯誤,就會輸出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

此時就可以重新加載Nginx配置,讓Nginx服務重新啟動。

sudo service nginx reload

7.2.5. 測試php

要查看PHP 7.4 在Ubuntu 20.04上是否正常運行info.php ,請在文檔根目錄中創建一個新的PHP文件 。預設情況下,它位於中 /var/www/html/ ,或者如果你根據之前的設定,在同一個server上設定了多個domain name,,則它可能位於類似 /var/www/mytest1.com/public_html

擁有正確的文檔根目錄後,使用 nano 文本編輯器創建一個新文件 info.php

sudo nano /var/www/html/info.php

將以下代碼鍵入或粘貼到新文件中。

<?php
phpinfo();

保存並退出(按 CTRL + XY 然後按ENTER

現在,您可以在Web瀏覽器中查看此頁面,方法是訪問服務器的域名或公共IP地址,後跟/info.php: http://your_domain_or_IP/info.php

如果不知道ip,可以使用以下指令得到server的 ip 位址:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

phpinfo() 將會輸出有關PHP當前狀態的大量訊息,包含PHP編譯選項、插件擴展的信息、PHP版本和服務器資訊等。如果成功顯示以下的PHP組態內容,就代表你現在已在Ubuntu 20.04上成功為Nginx安裝了PHP-FPM。

image

之後,最好刪除 info.php,因為這上面包含很多伺服器的重要資訊,可能會讓別人有機會攻擊你的server。

8. 安裝MySQL

我們將會在這個章節做到以下事項:

  • 安裝MySQL
  • 設定root的密碼,並根據資安原則,拒絕root在遠端登入
  • 新增一個超級使用者,並給予足夠的權限

8.1 安裝MySQL

讓我們首先更新存儲庫,並使用來安裝適用於Ubuntu 20.04的MySQL軟件包 apt

sudo apt update && sudo apt install mysql-server

在螢幕出現提示時,按 yENTER 來安裝MySQL。

MySQL安裝完成後,我們可以檢查MySQL服務是否正在運行。

sudo service mysql status

如果正在運行,您將看到綠色的“活動”狀態,如下所示:

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-04-02 02:40:59 CEST; 2min 47s ago
   Main PID: 18476 (mysqld)
     Status: "Server is operational"
      Tasks: 27 (limit: 4915)
     CGroup: /system.slice/mysql.service
             └─18476 /usr/sbin/mysqld

Apr 02 02:40:59 ubuntu2004 systemd[1]: Starting MySQL Community Server...
Apr 02 02:40:59 ubuntu2004 systemd[1]: Started MySQL Community Server.

你可以按 q 來退出服務顯示畫面。

8.2 設定root的密碼

現在可以使用指令 mysql_secure_installation 來配置MySQL伺服器的安全性。

sudo mysql_secure_installation

8.2.1 安全性插件

系統將詢問您是否要設置“驗證密碼”插件。除非您出於某種原因要強制執行嚴格的密碼策略,否則實際上並沒有必要。

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No:

如果不想安裝安全性插件,建議可以直接按下 ENTER

8.2.2 設定root用戶的密碼

Please set the password for root here.

New password:

Re-enter new password:

可以使用這個網址來產生隨機高強度密碼。這邊請注意一下,當您在Linux中輸入密碼時,鍵入時不會顯示任何內容(沒有星號或點)。

8.2.3 刪除匿名帳戶

接下來,將要求您刪除匿名用戶。

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :

yENTER 來刪除匿名用戶。

8.2.4 禁止遠端登入

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

yENTER 禁止遠端root登錄。這樣可以防止殭屍程式和駭客嘗試猜測root的密碼。

8.2.5 刪除測試資料庫

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

yENTER 刪除測試資料庫。

8.2.6 重新加載權限設定

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

yENTER 重新加載權限設定。

8.2.7 測試MySQL服務

現在,您可以登錄到MySQL服務器。因為您以sudo身份運行此命令,所以它將使用MySQL根帳戶自動登錄到MySQL。如果提示您輸入密碼,請輸入Linux根帳戶密碼,而不是MySQL。

sudo mysql

輸出:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.19-0ubuntu5 (Ubuntu)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

要退出MySQL,請輸入exit 並按 ENTER

mysql> exit

你現在已經成功安裝並配置了MySQL!

8.3 新增一個超級使用者,並給予足夠的權限

使用MySQL的 root 帳戶與密碼登錄到MySQL。

sudo mysql -u root -p

登錄後,使用您選擇的用戶名添加一個新的MySQL超級用戶。在此範例中,我們稱之為 pmauser可以使用此網站處生成一個高強度密碼, 並將下面指令的 password_here 替換為高強度密碼。

mysql> CREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'password_here';

現在,向我們的新用戶 pmauser 授予超級用戶特權。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'pmauser'@'localhost';

此時,雖然 pmauser 具有足夠的權限可以新增並讀寫新的資料表,但是沒有權限設定其他帳戶新權限,現在我們要將 pmauser 具有這樣的權限。

使用的指令為:

mysql> GRANT ALL ON *.* TO 'pmauser'@'localhost' WITH GRANT OPTION;

現在我們已經可以使用 pmauser 來登入MySQL資料庫了。

9. 安裝 phpMyAdmin

我們在 6.4 配置伺服器區塊 Server Blocks 章節學會了在同一台server使用一個IP安裝多個網站。現在我們要安裝一個新個網站,讓這個網站執行 phpMyAdmin 網頁APP,未來可以用網頁登入到pgpMyAdmin網站來管理MySQL資料庫。

9.1 新增伺服器區塊

首先,我們將預設伺服器區塊 /etc/nginx/sites-available/default 複製到 /etc/nginx/sites-available/phpmyadmin.mytest.com

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/phpmyadmin.mytest.com

現在編輯剛剛複制的文件。

sudo nano /etc/nginx/sites-available/phpmyadmin.mytest.com

CTRL + W 並蒐索 default_server;

將會找到以下的內容:

        listen 80 default_server;
        listen [::]:80 default_server;

同樣的,把 default_server 字樣刪除,所以設定變為:

        listen 80;
        listen [::]:80;

CTRL + W 並搜尋 root /var/www/html;

我們的 phpmyadmin.mytest.com 網站的根目錄為 /var/www/phpmyadmin.mytest.com/phpMyAdmin-5.1.0-all-languages ,所以設定請修改為:

    root /var/www/phpmyadmin.mytest.com/phpMyAdmin-5.1.0-all-languages;

修改網站跟目錄,按 CTRL + W 並搜尋 server_name _;

將此更改為您的domain name。在我們的範例中,我們的domain name為 phpmyadmin.mytest.com

    server_name phpmyadmin.mytest.com;

由於phpMyAdmin使用PHP語法,我們要在伺服器區塊設定中指定使用 php7.4-fpm.sock 來處理PHP Script

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }

保存並退出(按 CTRL + XY 然後按ENTER

在繼續下一步之前,請確保Nginx配置文件語法有效。

sudo nginx -t

輸出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

9.2 Create Symbolic Links

現在,我們將創建從 sites-available 目錄到sites-enabled 目錄的符號鏈接,在啟動過程中Nginx會讀取該鏈接 。指令為 ln

sudo ln -s /etc/nginx/sites-available/phpmyadmin.mytest.com /etc/nginx/sites-enabled/

現在重新啟動Nginx。

sudo service nginx restart

9.3 下載 phpMyAadmin並解壓縮

先把工作目錄移到 /var/www/phpmyadmin.mytest.com

cd /var/www/phpmyadmin.mytest.com

使用 wget 指令下載 phpMyAdmin:

sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.tar.gz

之後解壓縮:

tar zxvf phpMyAdmin-5.1.0-all-languages.tar.gz

9.4 測試phpMyAdmin網站

連線到 phpmyadmin.mytest.com ,你應該會看到 phpMyAdmin 網站如下,代表phpMyAdmin已經安裝成功了。

image

10. 安裝Nginx的Let’s Encrypt SSL證書

Let’s Encrypt 是一個證書頒發機構,它提供與當前付費證書一樣安全的免費SSL證書。我們將在Ubuntu 20.04上為Nginx配置SSL證書。

10.1 安裝“Let’s Encrypt用戶端”(Certbot)

讓我們首先更新在Ubuntu 20.04上安裝Certbot for Nginx的軟體包列表。

sudo apt update && sudo apt install certbot python-certbot-nginx

如果出現提示請鍵入 yENTER

如果出現錯誤 “python-certbot-nginx has no installation candidate” ,請嘗試運行 sudo apt install certbot python3-certbot-nginx

10.2 取得 SSL 證書

現在,我們將獲得我們的測試域example.com 的證書。Certbot具有適用於Ubuntu 20.04的Nginx插件,該插件可自動執行證書安裝。

sudo certbot --nginx

將出現以下畫面:

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

請輸入電子郵件地址,以便在緊急更新和安全通知時與您聯繫。

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:

aENTER 同意服務條款。

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

nENTER 不與EFF分享您的電子郵件地址。

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

選擇想要安裝證書的domain name,如1

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/nginx/sites-available/example.com-le-ssl.conf
Enabled Nginx socache_shmcb module
Enabled Nginx ssl module
Deploying Certificate to VirtualHost /etc/nginx/sites-available/example.com-le-ssl.conf
Enabling available site: /etc/nginx/sites-available/example.com-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

按下 2 以設定將所有流量重定向到HTTPS。

Redirecting vhost in /etc/nginx/sites-enabled/example.com.conf to ssl vhost in /etc/apache2/sites-available/example.com-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

11. 設定FTP

11.1 安裝vsftpd

下面我們有兩個命令,以分隔 && 。第一條命令將更新軟體包列表,以確保您獲得vsftpd的最新版本和依賴關係。然後,第二個命令將下載並安裝vsftpd。 當要求繼續時,按 y 和 ENTER 。

sudo apt update && sudo apt install vsftpd

安裝完成後,檢查vsftpd的狀態

sudo service vsftpd status

如果正常,將出現以下畫面:

● vsftpd.service - vsftpd FTP server
     Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-04-27 19:35:30 IST; 13s ago
   Main PID: 54532 (vsftpd)
      Tasks: 1 (limit: 1137)
     Memory: 652.0K
     CGroup: /system.slice/vsftpd.service
             └─54532 /usr/sbin/vsftpd /etc/vsftpd.conf

Apr 27 19:35:30 ubuntu systemd[1]: Starting vsftpd FTP server...
Apr 27 19:35:30 ubuntu systemd[1]: Started vsftpd FTP server.

11.2 配置防火牆

如果尚未這樣做,建議您ufw 為Ubuntu 20.04 / 20.10啟用 防火牆。在啟用ufw 防火牆之前 ,請確保添加了SSH規則,否則,如果遠程連接,則可能會被鎖定在服務器之外。如果您不想設置防火牆,請跳至下一個步驟。

sudo ufw allow OpenSSH

讓我們為FTP打開端口20和21,為被動FTP打開端口40000-50000。我們還將為TLS打開990端口,稍後我們將對其進行設置。

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw allow 990/tcp

現在,啟用防火牆(如果尚未啟用)。如果出現警示訊息,可以按下 yENTER以啟用防火牆。

sudo ufw enable

要檢查防火牆的狀態,請運行:

sudo ufw status

如果防火牆正在運行,您應該會看到 Status: active 以及我們剛剛添加的防火牆規則。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
3306                       ALLOW       Anywhere
20/tcp                     ALLOW       Anywhere
21/tcp                     ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)
3306 (v6)                  ALLOW       Anywhere (v6)
20/tcp (v6)                ALLOW       Anywhere (v6)
21/tcp (v6)                ALLOW       Anywhere (v6)
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)
990/tcp (v6)               ALLOW       Anywhere (v6)

11.3 創建FTP用戶

現在,我們將創建一個用於登錄FTP的新用戶。在此示例中,我們將創建一個名為的新用戶 ftpuser

sudo adduser ftpuser

生成一個 安全的密碼,並確保其安全。

可能還會要求您輸入一些聯繫信息。您只需按 ENTER 每個即可。

如果只想 ftpuser 通過FTP登錄,則應通過在SSH配置文件中將其用戶名列入黑名單來禁用其SSH訪問。否則,請跳至下一個步驟。

在nano中打開SSH配置。

sudo nano /etc/ssh/sshd_config

將以下內容添加到文件底部,替換 ftpuser 為您要拒絕SSH和SFTP訪問的用戶。您可以在此處添加多個用戶,並用一個空格隔開。(要粘貼到nano中,請按鼠標右鍵)。/ etc / ssh / sshd_config

DenyUsers ftpuser

要保存文件並退出,請按 CTRL + X ,再按 Y ,然後按 ENTER

重新啟動SSH服務。

sudo service sshd restart

11.3 設定目錄權限

sudo usermod -d /var/www ftpuser
sudo chown ftpuser:ftpuser /var/www

11.4 配置vsftpd

在Ubuntu 20.04 / 20.10上開始使用FTP之前,我們必須對vsftpd配置文件進行一些更改。

重命名配置文件。

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak

使用nano 編輯器創建一個新的配置文件。

sudo nano /etc/vsftpd.conf

粘貼以下內容:

listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
force_dot_files=YES
pasv_min_port=40000
pasv_max_port=50000

我們完成了vsftpd.conf

要保存文件並退出,請按 CTRL + X ,再按 Y ,然後按 ENTER

重新啟動vsftpd。

sudo systemctl restart vsftpd

11.5 使用TLS保護FTP(推薦)

使用FTP時,請記住一些重要事項-默認情況下未加密,這意味著您發送的憑據和文件容易受到攔截。為了解決這個問題,您應該使用FTPS(基於SSL / TLS的FTP)連接到vsftpd。

首先,使用該openssl 工具創建一個新證書 。

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

系統將要求您輸入一些詳細信息,例如國家(地區)等。您不必填寫這些信息。您只需按一下即可 ENTER 獲得默認值。

現在您的私鑰已創建,我們必須對vsftpd配置文件進行一些更改。

nano 編輯器中打開配置文件 。

sudo nano /etc/vsftpd.conf

重新啟動vsftpd。

sudo systemctl restart vsftpd

接著你可以使用FileZilla測試FTP網站連線,記得要選擇sFTP,讓連線保持加密,以確保帳號密碼不會被監聽。

12. 安裝Python 3.9.2

請依照以下步驟:

sudo apt update
sudo apt install wget build-essential checkinstall 
sudo apt install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev

mkdir ~/tmp
cd ~/tmp
sudo wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz
tar xzf Python-3.9.2.tgz
cd Python-3.9.2
sudo ./configure --enable-optimizations
sudo make altinstall

安裝完後,使用python3.9指令即可呼叫Python3.9.2

確認版本:

python3.9 -V
# Python 3.9.2

原本的Python3還是可以使用:

python3 -V
# Python 3.8.5