打得很好的東西
伺服器傳承的啦:https://serverbook.ckefgisc.org/
如果我不知道中文是什麼的名詞我就會用英文寫(? 大家可以自行查詢!
在 1960 年代,那時候的電腦就像是巨大的機器,占滿了整個房間,而且每一台都非常專門化,就像一台只能執行特定任務的巨型複雜打字機。
Multics(Multiplexed Information and Computing Service)是由麻省理工學院(MIT)、貝爾實驗室(Bell Labs)和通用電氣公司(GE)共同開發的一個大型操作系統項目,旨在創建一個多用戶、多任務的系統。
但這個計畫最終失敗於它太過複雜以及過於昂貴,以致於有了後面計畫的誕生。
在貝爾實驗室,Ken Thompson 和 Dennis Ritchie 等研究人員決定從頭開始,開發一個更簡單、更有效的系統。他們的目標是建造一個小巧靈活的系統,就像是一座精緻的小樓房,雖然不那麼華麗,但功能實用且易於維護。
這就是 Unix 的誕生。Unix 系統設計簡單、結構清晰,並且允許多個用戶同時使用,這使得它迅速在學術界和企業界流行起來。
到了 1990 年代,個人電腦(PC)變得越來越普及,人們需要一種可以在這些新型電腦上運行的高效操作系統。這時候,一位芬蘭的大學生 Linus Torvalds 出現了。Linus Torvalds 在 1991 年開始開發一個基於 Unix 原理的操作系統內核(Kernel),他稱之為 Linux。可以將 Linux 比作是一個開源(Open source)的建築藍圖,任何人都可以使用、修改它。
他在互聯網上分享了這個Kernel的代碼,並邀請其他人參與開發。這就像是在全球範圍內邀請建築師和工程師一起來改進這個建築藍圖。由於這種開源的模式,Linux 迅速得到了全球開發者的支持和貢獻,成為一個強大且靈活的操作系統。
這個企鵝是 Linux 的吉祥物,他叫做 Tux 。
這裡都是基礎的 Commands ,希望大家可以熟練。順帶一提,像 ls -al
的 -al
被稱為 Command flags ,用來改變 Command 執行的細節,有時候也會被叫做 Options 。
其中最重要的指令:man
- 查看命令手冊
然後它就會詳細跟你講那個命令怎麼用,比我下面寫的詳細。
另外也可以看 Linux Command Library ,裡面有很多各式各樣的 Commands 可以參考。下面是 Linux 自帶的最基礎的 Commands :
ls
- 列出目錄內容Flags:
-l
: 以詳細列表格式顯示文件和目錄,包括權限、所有者、大小和修改時間。-a
: 顯示所有文件,包括隱藏文件(以 . 開頭的文件)。cd
- 切換目錄pwd
- 打印工作目錄cp
- 複製文件或目錄Flags:
-r
: 遞迴地(Recursively)複製整個源目錄到目標目錄。mv
- 移動或重命名文件或目錄Flags:
-r
: 遞迴地(Recursively)移動整個源目錄到目標目錄。rm
- 刪除文件或目錄Flags:
-r
: 遞迴地(Recursively)刪除整個目錄。-f
: 強制刪除。mkdir
- 創建目錄cat
- 顯示文件內容Flags:
-r
: 遞迴地(Recursively)建立路徑上的所有目錄。後面是稍微難一點的,但等等可能會用到:
ln
- 創建連結連結有分成兩種,硬連結(Hard link)跟軟連結(Soft link),使得兩個檔案的內容同步:
-s
,向下面這樣:軟連結簡單來說就是捷徑,形成一個指標指向源文件,但一旦刪掉源文件,那所有指向它的軟連結都會失效。軟連結也能允許跨硬碟的傳輸,是比較靈活的連結。
ssh
- 連線到遠端主機ssh
是 Secure shell 的縮寫,提供了一個安全的方式連線到遠端的主機。有些時候,為了區別不同的服務(可以看後面協定的章節),我們需要在連線的時候用 -p
來指定連接埠(Port):
ping
- 測試遠端是否連通grep
- 一個搜尋工具正則表達式(regex)由一組特殊的字符和符號組成,用來描述搜索模式。這些模式可以非常簡單,也可以非常複雜,取決於你的需求。
這個不是今天的重點,所以不會教你們怎麼寫正則表達式。如果真的需要的話可以考慮問ChatGPT,他還蠻擅長這個工作的,或者可以用 RegexOne 這個網站來學。
輸出分為標準輸出(stdout)跟標準錯誤(stderr),如果要重定向 stdout :
他會把命令的stdout覆蓋並寫到指定文件,如果想要單純加在文件後面的話:
要重定向 stderr 的話:
也可以一次定向兩個:
輸入只有一種,也就是標準輸入(stdin),也是一樣的用法:
Pipe 的用途把一個命令的輸出當作另一個命令的輸入,避免要先寫進一個檔案的麻煩:
使用重定向和 Pipe 可以很大程度的提升工作效率。讓人能夠靈活地控制命令的輸入和輸出,並將多個命令組合起來,形成複雜的處理流水線。
我們先介紹一個 Command :
sudo
- Superuser do
用 sudo
執行命令的話,那我們便可以暫時取得最高級用戶 root
的權限,執行一些大程度改變系統的命令。(sudo
通常是個內建命令,如果不是的話記得要裝。)
先講如何安裝一個軟體或者套件,我們現在使用的是 Ubuntu 系統,是一個 Debian 架構的系統,而所有 Debian 架構的系統都可以使用 apt
或 apt-get
作為套件管理工具:
在沒有圖形化介面的 Linux 的文字編輯器主要有 vim 、 nano 。
這裡是強烈推薦 vim :
最重要的幾個鍵有:
i
- 進入 insert modeEsc
- 回到 normal mode:wq
- 儲存並退出剩下的可以看大陸的菜鳥教程
首先大家都應該要有一個 GitHub 帳號(也不是不能用 GitLab ,但可能不是今天)。
git
其實是一門大學問,這裡就大概講一下:
然後有時間的話可以用一下 SSH key ,這是 GitHub 的教學
systemd
是 system daemon 的縮寫,其中 daemon 是常駐程式的意思。而 systemd
就是用來管理系統常駐程式的框架:
首先, systemctl
可以用來啟動或中止服務:
現在不會也沒關係,反正等等會一直用到。
每個服務運行的內容被寫在一個單元文件(Unit file)裡,這個蠻複雜的,詳細的說明可以看 Arch Wiki (有點小硬)。
我們可以類比現實一下:
想像你在一個大型郵局裡,負責處理來自世界各地的信件和包裹。每個包裹都有自己的標籤,上面寫著發件人、收件人地址、郵政編碼等信息。這些標籤就像網絡協議中的規則,確保每個數據包都能準確無誤地送達目的地。
網絡協議是網絡通信的規則和約定,規範了數據如何在網絡上傳輸、接收和解碼。網路協議可以被分成 4 層 (或 5 層,以下 4 層加上 Physical Layer),每一層都依賴於下面一層的服務:
應用層就像是郵政系統的前台服務,提供了各種專門的服務窗口,如信件投遞、包裹郵寄、匯款等。
應用層會跟用戶互動並根據應用程式不同的需求,把資料給傳輸下去:
HTTP 跟 HTTPS 都會有一個 header ,用來定義該操作的一些參數。
HTTPS (Port:443) 是安全版的 HTTP (Port:80) ,透SSL/TLS(Secure Sockets Layer/Transport Layer Security)來加密數據傳輸。
它的主要作用是將人類易於記憶的域名(Domain Name)轉換成電腦能夠了解的 IP 位址。一旦你使用域名而非 IP 位址,電腦便會發送一個 DNS 請求,由本地的DNS解析器找尋伺服器上有沒有對應的域名,並返回 IP 位址。
傳輸層就像是郵政系統中的包裹處理中心,負責將包裹按照正確的順序和完整性送達目的地,並處理包裹的跟蹤和確認。
傳輸層提供了端到端的通信服務,確保數據在應用層之間可靠地傳輸:
TCP 是一種可靠的傳輸方法、會固定傳輸的順序,依靠多次握手來確保資料傳輸順利,但速度比較慢;而 UDP 是一種不可靠的傳輸方法,可能會造成部分資料的丟失,但速度比較快。
網路層就像是郵政系統的分類中心,負責根據郵政編碼將信件和包裹路由到最終目的地。
網路層負責數據包的尋址和路由,確保數據包從源地址傳輸到目標地址:
IPv4:使用 32 位地址(如 192.168.1.1)。
IPv6:使用 128 位地址(如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。
鏈路層就像是郵遞員,負責將包裹從一個郵局送到另一個郵局,直到到達最終目的地。
鏈路層負責物理鏈路上的數據傳輸:
web server 包含了一連串控制網路用戶如何訪問託管檔案 。HTTP 伺服器是其中一個部份,它理解 URLs 與 HTTP(瀏覽器用來觀察網頁的協議)。它能透過域名(domain name)訪問託管的網站,並將其內容遞送到終端用戶的設備上。
除此之外,web server 用途還包含反向代理、Http Cache、負載平衡器等等
指令
除錯
Nginx 若無法正確啟用,絕大多數時間是 port 80 或是 port 443 被其他服務站用。若用 5. 之方法查明為此原因,可以透過以下指令檢查誰監聽哪個口。
除此之外,也可以透過配置文件內
配置文件
目錄:/etc/nginx
(以下用這目錄的相對路徑表示)
主文件:nginx.conf
http
階段裡放置 web server 相關設定Virtual Host 文件目錄:
./conf.d/
(recommended)./sites-enable/
-> ./sites-avaliable/
Virtual Host 文件寫法
其他 Nginx 指令
Dockerfile 是一個純文字檔案,包含了一系列指令,這些指令描述了如何構建一個 Docker 映像檔。透過 Dockerfile,可以自動化創建 Docker 映像檔,確保開發、測試和生產環境的一致性。
每個 Dockerfile 通常會包含以下幾個部分:
建立一個 Node.js 應用:
創建一個 package.json
檔案:
創建 Dockerfile:
建立和運行 Docker 映像檔:
以下是 docker-compose.yml 的基本範例,定義了一個簡單的 Web 應用,包含一個 Web 服務和一個 Redis 服務:
可以在 docker-compose.yml
文件中定義多個服務,例如 Web 應用和數據庫:
卷可以用來持久化數據,例如數據庫的數據:
可以定義自定義網絡來控制服務之間的通信: