伺服器架設

建北電資2024寒訓

你資道我喜歡你嗎

事前安裝

for Windows users

  • wsl (推薦)
  • 虛擬機

安裝清單

WSL 安裝

  • Windows Subsystem for Linux
  • 適用於Linux的Windows子系統
  • 可以使用linux的軟體

WSL

WSL安裝 - step 0

去 設定>系統>選用功能
點開

\(更多 Windows 功能\)

WSL安裝 - step 1

勾選 \(Windows 子系統 Linux 版\) \(虛擬機器平台\)

然後按下 \(確定\)

WSL安裝 - step 2

重新開機

WSL安裝 - step 3

同時按下

\(Windows鍵\) \(R\)

左下角有小視窗

WSL安裝 - step 4

輸入

\(powershell\)

然後 \(Enter\)

WSL安裝 - step 5

可選的wsl清單

輸入

wsl -l -o

WSL安裝 - step 6

輸入

wsl --install -d Ubuntu

WSL安裝 - step 7

輸入用戶名稱

請用英文或數字

創建密碼 請記好 (輸入時不會顯示)

兩次密碼不同才會出現

WSL安裝 - 完成

事前安裝

for Mac users

  • brew (推薦),操作方式可能不同
  • 虛擬機 (virtual box)

安裝清單

Homebrew 安裝

homebrew 安裝

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)
  • 和等等會講的 apt 類似
  • 安裝套件方式

homebrew 用法

brew install <package>

Homebrew 安裝完成

事前安裝

for Linux users

什麼是伺服器

  • 接收和回應請求
  • 性能,多工處理
  • 穩定

伺服器

伺服器託管平台

  • 提供伺服器租借
  • 方便管理
  • 包羅萬象的雲端服務
    • 網域申請
    • 資料庫
    • 人工智慧訓練

伺服器託管平台

Google

Cloud

常見平台

Amazon Web Service

Microsoft Azure

伺服器作業系統

  • 管理運行的軟硬體
  • 提供與系統互動介面

作業系統

Mac

PC 作業系統

Linux

Windows

  • 安全
  • 穩定
  • 效率
  • 高可擴展性

伺服器作業系統

FreeBSD

常見伺服器作業系統

Linux

終端機

  • 和電腦互動的介面
  • 資料輸入輸出
  • 可為純電子或實體

終端機

  • 依據作業系統而定
  • 有預設、或可另外安裝

終端機軟體

內建兩中、混亂不堪

Windows 終端機

cmd

powershell

Windows 的終端機

cmd

powershell

原先存在、兼容性高

新東西、支援更多功能

Linux 的終端機

bash

zsh

用戶多、更穩定、兼容

速度快、自訂性高

指令相似

預設

Mac 的終端機

bash

zsh

用戶多、更穩定、兼容

速度快、自訂性高

指令相似

預設

今天要用哪種?

bash

  • Bourne shell ( born again )
  • 適用Unix的終端機
  • 最廣泛使用
  • Windows WSL 也是

bash

bash

裝置名稱

user名稱

目前路徑

指令輸入區

什麼是路徑?

電腦中檔案或資料夾的地址

  • 絕對路徑:
    • 從根目錄開始到目標位置
  • 相對路徑
    • 從當前目錄開始

路徑

絕對路徑 的

/home/ckeisc/hello_world.cpp

根目錄中的

home中的

ckeisc中的

hello_world.cpp

相對路徑 的

ckeisc/hello_world.cpp

當前中的

ckeisc中的

hello_world.cpp

  • 路徑的起點
  • 包含所有檔案
  • 以 / 表示

根路徑

  • 你家的路徑
  • 裡面都是你的
  • User有各自的
  • 以 ~ 表示

家路徑

  • \(.\) 表示當前目錄
  • \(..\) 表示上一層的目錄

其他符號

講義上 的

.
├── 20231022
│   ├── a.cpp
│   └── b.cpp
└── 20240107
    ├── 1.cpp
    ├── 2.cpp
    ├── 3.cpp
    ├── 4.cpp
    └── a.out
~/code/apcs

當前目錄

4.cpp 的相對路徑

20240107/4.cpp

4.cpp 的絕對路徑

~/code/apcs/20240107/4.cpp
/home/ckeisc807/code/apcs

也就是:

(假設用戶名稱是 ckeisc807)

講義上 的

.
├── 20231022
│   ├── a.cpp
│   └── b.cpp
└── 20240107
    ├── 1.cpp
    ├── 2.cpp
    ├── 3.cpp
    ├── 4.cpp
    └── a.out
20231022

移動到:

4.cpp 的相對路徑變為

../20240107/4.cpp

絕對路徑不受影響

操作指令

  • 顯示內建指令表

help

顯示當前路徑

pwd

(print the name of current/working directory)

  • 清除終端機

clear

After

Before

顯示資料夾內容

  • 含影藏檔案
  • 條列式輸出
  • 給人讀的檔案大小
  • 含資料夾內

ls

ls -a
ls -l
ls -h
ls -R

還可以這樣用!

ls -alhR
  • \(ls == list\)
  • 顯示特定資料夾內容
  • \(<dir> =\) 該資料夾路徑

ls <dir>

  • \(cd == change \space directory\)
  • 移動至特定目錄
  • \(<dir> =\) 目標目錄路徑

cd <dir>

  • 移動到家目錄
  • 還原移動

cd

cd
cd -
  • \(mkdir == make \space directories\)
  • 建立新空目錄(資料夾)
  • \(<dir> =\) 該目錄路徑

mkdir <dir>

  • 建立空檔案
  • \(<file> =\) 該檔案路徑

touch <file>

  • \(cp == copy\)
  • 複製檔案
  • 將 \(<file1>\) 複製到 \(<file/dir2>\)

cp <file1> <file/dir2>

  • 複製資料夾&內容
  • 將 \(<dir1>\) 複製到 \(<dir2>\)

cp -r <dir1> <dir2>

  • \(mv == move\)
  • 移動檔案
  • 將 \(<file/dir1>\) 移動到 \(<file/dir2>\)

mv <file/dir1> <file/dir2>

  • \(\sout{cat == 貓}\)
  • 輸出檔案
  • \(<file> = \) 要輸出的檔案

cat <file>

  • \(\sout{head == 頭}\)
  • 輸出第一部分檔案
  • \(<file> = \) 要輸出的檔案

head <file>

?

  • 輸出一段字
  • \(<text> = \) 要輸出的文字
  • \(\sout{echo == 回音}\)

echo <text>

  • \(rm == remove\)
  • 刪除檔案
  • \(<file> =\) 該檔案路徑

rm <file>

  • 刪除目錄
  • \(<dir> =\) 該目錄路徑

rm -r <dir>

  • 刪除目錄
  • \(<dir> =\) 該目錄路徑

\(rmdir <dir>\)

  • 設定環境變數
  • 將變數 \(<text0>\) 設為 \(<text1>\)
  • 關閉終端機就失效

export <text0>=<text1>

$ 變數取值

  • 設定指令別名
  • 將 \(<text0>\) 設為 \(<text1>\)的別名
  • 關閉終端機就失效

alias <text0>=<text1>

  • 關閉終端機

exit

  • 尋找某個檔案或資料夾
  • <file/dir> = 檔名或資料夾名

\(find <dir> -name <file/dir>\)

.
├── 20231022
│   ├── a.cpp
│   └── b.cpp
└── 20240107
    ├── 1.cpp
    ├── 2.cpp
    ├── 3.cpp
    ├── 4.cpp
    └── a.out
  • 尋找某個檔案或資料夾
  • \(<dir1> =\)尋找範圍
  • \(<file/dir2> =\) 目標檔案、資料夾名稱

find <dir1> -name <file/dir2>

.
├── 20231022
│   ├── a.cpp
│   └── b.cpp
└── 20240107
    ├── 1.cpp
    ├── 2.cpp
    ├── 3.cpp
    ├── 4.cpp
    └── a.out
  • 以腳本方式執行檔案
  • 通用用於變更完 ~/.bashrc 後,使用 source ~/.bashrc

source <file>

  • 僅顯示部分內容
  • 常用用法 \(cat <file> |\space less\)
  • 用上下方向鍵移動
  • 按\(q\)退出

less

  • 擷取含特定文字的內容
  • 常用用法 \(cat <file> |\space grep <text>\)
  • \(<text> =\) 要擷取的內容

grep <text>

  • 用 \(root\) 權限執行某個指令

sudo <command>

\(root\) 權限:

Linux 中的最高權限,可對系統進行任何操作,但不慎使用恐導致系統出錯

  • 切換使用者
  • \(<user> =\) 要切換的使用者
  • 使用 \(root\) 

su <user>

sudo su

關機

(不要再伺服器上用)

shutdown now

重新開機

reboot

  • 可能需要 \(root \) 權限
  • 變更檔案使用權

chmod ... <file>

符號 使用者類型
u user
g group
o others
a all
符號 使用者類型
+ 增加
- 減少
= 設為
符號 使用者類型
r read
w write
x 執行
... ...

權限分級 - 符號式

權限分級 - 八進位

r (read) w (write) x (execute)
寫入 讀取 執行
4 2 1

權限數值合 0~7

user group all

三碼分別是三者權限

權限分級 的

chmod u+x <file>

將 <file> 設為此 user 可以執行

chmod -r <file>

移除 user 讀 <file> 的權限

chmod 400 <file>

只有 user 可以讀,無其他權限

  • 變更檔案擁有者
  • \(<user> =\) 新的用有者
  • \(<file> =\) 變更的檔案

chown <user> <file>

套件管理工具apt

  • 尋找
  • 安裝
  • 管理
  • 刪除 套件

套件管理工具 - 功能

  • 用於 \(Debian\)、\(Ubuntu\) 等等
  • 非常方便 至少根 Windows 比
  • 套件非常豐富

apt

再開始之前

絕對沒有打錯字

必須先更新

sudo apt update
sudo apt upgrade

需使用 \(root\) 權限

他會問

Do you want to continue? [Y/n]

然後

就輸入 \(Y\) 作確認

  • \(<package> =\) 安裝的套件
  • 輸入 \(Y\) 確認安裝

套件安裝

sudo apt install <package>
  • 如果你用的是 Mac
  • 不能用 sudo

套件安裝

brew install <package>

安裝套件 的

sudo apt install neofetch

安裝 neofetch

他會問

Do you want to continue? [Y/n]

就輸入 \(Y\) 作確認

輸入 \(Y\) 好麻煩?

那就用 surfshark vpn

sudo apt install <package> -y
  • \(<package> =\) 刪除的套件

套件刪除

sudo apt remove <package>
  • \(<package> =\) 重裝的套件

套件重新安裝

sudo apt reinstall <package>
  • apt-get
  • snap

其他分支

好用的套件

好用的套件

neofetch

  • 顯示系統資訊
    • cpu
    • os
    • gpu
    • memory
    • ...

neofetch

好像沒什麼用

但顯然否...

neofetch 最強功能!

neofetch 最強功能!

顯示好看的圖標

其實 Android 也是Linux

neofetch

作業系統

開機時間

記憶體大小

Linux Distro 圖標

想不到吧

好用的套件

編輯器

  • 檢視
  • 編輯 文字檔案
  • 常見的有
    • vscode
    • 記事本 ...

文字編輯器

但不能在終端機裡

對吧

那有什麼可用?

cli 文字編輯器

vim

nano

nano

  • 內建預設
  • 下方有快捷提示

nano

vim

  • 快速、方便
  • 上手難度高

vim

遠端連線工具

ssh

  • 能在任何地方管理
  • 增加安全性
  • 降低移動成本

Why 遠端管理

遠端連線工具

ssh

vnc

  • Secure Shell Protocol
  • 安全可靠
  • 廣泛用於 Linux
  • 用於遠端登入、檔案傳輸

ssh 

安全?

怎麼保密的?

  • 密碼
  • 金鑰
  • 有密碼的金鑰
     
  • 利用非對稱加密

ssh 安全驗證

  • 產生公鑰和私鑰,兩兩一對
     
  • 公鑰: 加密、公開不影響安全
  • 私鑰: 解密、公開影響安全

非對稱加密

  1. 打開終端機
  2. 輸入
  3. 他會問一堆,按 \(Enter\) 跳過就行
  4. 收好你的私鑰 ~/.ssh/id_rsa

生成金鑰

ssh-keygen
  1. 你拿到一個私鑰 放到 ~/.ssh/
  2. 限制私鑰存取權
  3. 連線入伺服器
     
  4. 第一次會需要確認,回答 \(yes\)

ssh 登入

ssh -i <key_file> <server_username>@<server_ip>
chmod 400 <key_file>
  1. 輸入
  2. 回答 用戶名、密碼、確認密碼
    (請用英文、數字、英文標點符號)
  3. 給予 sudo 權限
     
  4. 使用 user

插播 - user 創建

sudo adduser <name>
sudo usermod -aG sudo <name>
su <name>
  1. 回到家目錄
  2. 建立 .ssh 資料夾 
  3. 打開允許清單
     
  4. 貼上你電腦生成的公鑰(記得存檔)

設定金鑰

sudo vim ~/.ssh/authorized_keys

每次連入都打

ip、金鑰、用戶名,好長

那就來設定 ssh Host

  1. 回自己電腦上
  2. 編輯 ~/.ssh/config
  3. 貼上這段

     
  4. 將 <nick_name>, <server_ip>, <user_name> 改為你的

設定 ssh Host

Host <nick_name>
Hostname <server_ip>
Port 22
User <user_name>
identityfile ~/.ssh/id_rsa

好欸 都設定好了

以後都用

ssh <nick_name>

就好

scp 上傳檔案

  • 上傳檔案
scp <local_file> <nick_name>:<server_file/dir>
  • 上傳資料夾
scp -r <local_dir> <nick_name>:<server_dir>

scp 下載檔案

  • 上傳檔案
scp <nick_name>:<server_file> <local_file/dir>
  • 上傳資料夾
scp -r <nick_name>:<server_file> <local_dir>

專案管理工具

git

  • 分散式版本控制工具
    • 版本控制
    • 分支協作
    • 追溯變更

git

  • 去中心化
  • 每個開發者都有檔案
    • 備份多
    • 洩漏風險高

分散式版本控制工具

git

working directory

staging area

local repository

remote repository

git add

git commit

git push

git pull

git ch e ckout

git clone

git 遠端平台

Github

GitLab

今天要用的

  • 最大開源平台
  • 社群功能
  • 其他服務
    • Github Pages
    • Codespaces
    • Github Copilot

Github Gayhub

還不快去註冊

  • repositoris (repo) 儲存庫
  • README 讀我 說明文件
  • commit 自首 存檔

名詞介紹

  1. 設定 email
     
  2. 設定 帳戶名稱
    (Github的)
  3. 生成金鑰
    (剛剛生成過了,跳過)

基本設定

git config --global user.email "<email>"
git config --global user.name "<name>"
ssh-keygen

基本設定

cat ~/.ssh/id-rsa.pub
  1. 設定 email
     
  2. 設定 帳戶名稱
    (Github的)
  3. 生成金鑰
    (若有則不用)





















     
  4. 複製公鑰
     
  5. 丟到 Github 上 (settings/SSH and GPG keys)
  • 剛設定過金鑰,可用ssh

下載開源專案

git clone <url>

創建 repo

  • 這不用解釋了吧
  • repo 的資料夾
  • 將檔案加入git
  • 提交變更
  • 上傳到 遠端

更新到雲端

git add .
git commit -m "<commit_message>"
git push

更新本地資料庫

git pull
  • 將資料拉下

切換分支

git chekcout <branch>
  • \(<branch>=\) 要切換的分支

git

working directory

staging area

local repository

remote repository

git add

git commit

git push

git pull

git ch e ckout

git clone

網頁伺服器軟體

nginx

  • 和其他都一樣

nginx 安裝

sudo apt install nginx

用 nginx 架個靜態網頁

  • ssh 連入伺服器

nginx 靜態網頁 - step 0

ssh <server_name>

從 Github 下載 網站專案

nginx 靜態網頁 - 偷網站

git clone <url>

建議用 ssh

將網頁檔案複製到 /var/www/

nginx 靜態網頁 - 複製

sudo cp -r <repo_name> /var/www/

進到這個目錄 /etc/nginx/conf.d

我們要開始設定 nginx 了

nginx 靜態網頁 - http

cd /etc/nginx/conf.d
  • 建立 nginx 設定檔 <name.conf>
     
  • 寫上這段

nginx 靜態網頁 - http

sudo vim <name.conf>
server{
    listen 80;
    listen [::]:80;
    root /var/www/<reponame>;
    server_name <domain>;
    index index.html;
    location / {
         try_files $uri $uri/ =404;
    }
}

改成網頁檔案路徑

改成網域域名

  • 測試 ngnix 設定正確

nginx 靜態網頁 - 測試

sudo nginx -t

成功

失敗

nginx 靜態網頁 - 測試

成功

失敗

  • 前往下一步
  • 開始 debug
  • 再重試一次
  • 重啟 nginx

     
  • 網站可以用了

nginx 靜態網頁 - 重啟

sudo systemctl restart nginx

為什麼不安全

http 不會加密

telnet 也不會

  • HyperText Transfer Protocol Secure
  • http 安全版
  • 網頁最常見傳輸協定

https

  • 生成 SSL 加密密鑰
  • 憑證交換
  • 443 port 開啟

建立 https 連線

憑證申請好麻煩

沒關係 我們有 certbot

  • 自動生成密鑰
  • 自動申請憑證
  • 自動更新憑證
  • 將 http 升級 https

certbot

  • snap 更新

     
  • certbot 安裝

nginx 靜態網頁 - Step 1

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
  • link 連結兩個檔案

     
  • link 後如同 /usr/bin 裡也有 certbot

nginx 靜態網頁 - Step 1

sudo ln -s /snap/bin/certbot /usr/bin/certbot
  • 去 /etc/nginx/sites-available

     
  • 將 default 複製,檔名必須為 網域

nginx 靜態網頁 - Step 1

cd /etc/nginx/sites-available/
sudo cp default <domain>
  • Uncomplicated Firewall
  • 防火牆管理套件
  • 防火牆 限制連線,確保安全
  • 查看防火牆狀態

ufw 

sudo ufw status
  • 防火牆設定

nginx 靜態網頁 - Step 1

  1. 開啟防火牆
  2. 允許 ssh
  3. 允許 nginx
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow "Nginx Full"

nginx 靜態網頁 - Step 1

  • 用 certbot 申請憑證

     
  • 效期只有 60 天
sudo certbot --nginx -d <domain>

nginx 靜態網頁 - Step 1

  • 查看自動更新是否進行中,應該是 \(Inactivated\)

     
  • 開啟自動更新
sudo systemctl status snap.certbot.renew.service
sudo certbot renew --dry-run
  • 一樣要重啟 nginx

nginx 靜態網頁 - Step 1

sudo nginx -t
sudo systemctl restart nginx
  • 應該就會 安全了

Server

By 建中店自計算機研習社學術長807⁸⁰⁷