伺服器架設
建北電資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
什麼是伺服器
- 接收和回應請求
- 性能,多工處理
- 穩定
伺服器
伺服器託管平台
- 提供伺服器租借
- 方便管理
- 包羅萬象的雲端服務
- 網域申請
- 資料庫
- 人工智慧訓練
伺服器託管平台
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 安全驗證
- 產生公鑰和私鑰,兩兩一對
- 公鑰: 加密、公開不影響安全
- 私鑰: 解密、公開影響安全
非對稱加密
- 打開終端機
- 輸入
- 他會問一堆,按 \(Enter\) 跳過就行
- 收好你的私鑰 ~/.ssh/id_rsa
生成金鑰
ssh-keygen
- 你拿到一個私鑰 放到 ~/.ssh/
- 限制私鑰存取權
- 連線入伺服器
- 第一次會需要確認,回答 \(yes\)
ssh 登入
ssh -i <key_file> <server_username>@<server_ip>
chmod 400 <key_file>
- 輸入
- 回答 用戶名、密碼、確認密碼
(請用英文、數字、英文標點符號) - 給予 sudo 權限
- 使用 user
插播 - user 創建
sudo adduser <name>
sudo usermod -aG sudo <name>
su <name>
- 回到家目錄
- 建立 .ssh 資料夾
- 打開允許清單
- 貼上你電腦生成的公鑰(記得存檔)
設定金鑰
sudo vim ~/.ssh/authorized_keys
每次連入都打
ip、金鑰、用戶名,好長
那就來設定 ssh Host
- 回自己電腦上
- 編輯 ~/.ssh/config
- 貼上這段
- 將 <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
自首存檔
名詞介紹
- 設定 email
- 設定 帳戶名稱
(Github的) - 生成金鑰
(剛剛生成過了,跳過)
基本設定
git config --global user.email "<email>"
git config --global user.name "<name>"
ssh-keygen
基本設定
cat ~/.ssh/id-rsa.pub
- 設定 email
- 設定 帳戶名稱
(Github的) - 生成金鑰
(若有則不用)
- 複製公鑰
- 丟到 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
- 開啟防火牆
- 允許 ssh
- 允許 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⁸⁰⁷
Server
- 219