by Rain Chu | 4 月 24, 2024 | Linux , Raspberry Pi , Ubuntu
wpa_cli
是一個用於與 wpa_supplicant
交互的命令行界面工具,當然也支持在 command line 下直接使用命令控制 WIFI,可以用來管理無線網絡接口的設定和運行狀態。這個工具非常強大,支持多種操作,如掃描無線網絡、連接到網絡、變更設定等,而我都用python 透過 wpa_cli 來控制 WIFI。
首先掃描無線網路
打開終端,並且記得要用 root 權限來執行 wpa_cli
sudo wpa_cli -i wlan1 scan
sleep 5 # 給予一些時間來完成掃描
sudo wpa_cli -i wlan1 scan_results
回應如下圖
加一個網路配置
利用 ssid 和 paswword 來連線到一個已知的無線網路上,可以將下面的指令編寫成 wpa_cli_add_network.sh ,並且執行她,也可以直接使用,執行後取得的 network id 通常是一個 int 的數字,把她記起來,之後就可以透過這個 network id 來連接網路,和斷開網路
# 添加新的網絡配置
network_id=$(wpa_cli -i wlan1 add_network | awk '{print $NF}')
# 設置SSID和密碼
wpa_cli -i wlan1 set_network $network_id ssid '"你的SSID"'
wpa_cli -i wlan1 set_network $network_id psk '"你的密碼"'
# 啟用該網絡
wpa_cli -i wlan1 enable_network $network_id
# 保存配置
wpa_cli -i wlan1 save_config
連接網路以及斷開網路
# 重新連線
wpa_cli -i wlan1 reconnect
#斷開連線
wpa_cli -i wlan1 disconnect
刪除網路配置
wpa_cli -i wlan1 remove_network $network_id
檢查連線是否存在
得到的輸出通常如下
其中,檢查是否有連線成功,可以看 wpa_state 是否為 COMPLETED
檢查已經存在的網路設定
sudo wpa_cli -i wlan1 list_networks
輸出如下
可以用 flags CURRENT 來檢查現在是連線到那一個 network ,也可以取得 network id ,並且用他來連線
by Rain Chu | 4 月 17, 2024 | Nginx , NodeJS , SERVER , 程式
如果你有用 Nginx 的快取服務,無論是 fastcgi or proxy cache,都會遇到很難有一套真正好用的清除工具,這邊示範一套自己開發的清除工具,也支援多伺服器使用
安裝必要的套件
你先需要有nodejs ,沒有的人先去官網安裝下,安裝完畢的人,先建立一個目錄,並且輸入以下指令,安裝必要的套件
npm init -y
npm install express
建立一個 Node.js App
可以命名為 app.js,內容如下,會建立一個小型的伺服器,用來處理 http 的請求,並且刪除指定的目錄
const express = require('express');
const { exec } = require('child_process');
const fs = require('fs');
const app = express();
const PORT = 3000;
const logFile = 'application.log';
function log(message) {
const timestamp = new Date().toISOString();
fs.appendFileSync(logFile, `${timestamp} - ${message}\n`);
}
app.get('/delete-dir', (req, res) => {
let dir = req.query.dir;
if (!dir || /[^a-zA-Z0-9_\-\/]/.test(dir)) {
log('提供的路徑不合法!');
return res.status(400).send('提供的路徑不合法!');
}
const command = `sudo find /run/proxy_cache/${dir} -mindepth 1 -type d -exec rm -rf {} +`;
exec(command, (error, stdout, stderr) => {
if (error) {
log(`执行错误: ${error}`);
return res.status(500).send('删除子目錄失敗!');
}
log('子目錄删除成功!');
res.send('子目錄删除成功!');
});
});
app.listen(PORT, () => {
log(`服务器正在运行于 http://localhost:${PORT}`);
});
其中我把能刪除的資料定義在只有這個目錄下的才行 /run/proxy_cache/ ,避免權限過大問題
配置 sudo 權限
打開 sudoers 文件
加入指令,記得把 <username> 改成自己的名字,或是 www-data
<username> sudo find /run/proxy_cache/ -mindepth 1 -type d -exec rm -rf {} +
完成後的測試
可以利用 CURL 呼叫 API ,成功就會看到 “子目錄删除成功!” 的訊息
curl "http://localhost:3000/delete-dir?dir=cache_directory"
結論與注意事項
要記得別讓外部的人可以輕易地存取這項服務,防火牆要記得把port鎖好,執行權限要小心設定,這樣就可以搭配 Nginx Cache 使用,之後再來出對應的刪除功能。
開機時候自動執行
要讓 Node.js 應用在系統開機時由特定使用者(例如 www-data
)啟動,需要配置一個 systemd
服務單元。在這個情況中,我們將創建一個服務單元文件來確保 Node.js 應用作為 www-data
使用者運行。
創建 systemd 服務文件
建立一個新的 systemd 服務文件。
sudo nano /etc/systemd/system/nodeapp.service
加入以下配置
[Unit]
Description=Node.js Web Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node /path/to/your/app/app.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
參數意思如下
Description : 服務的描述。
After : 這個單元應該在網絡服務可用之後啟動。
User 和 Group : 指定運行此服務的使用者和組。
WorkingDirectory : 指定 Node.js 應用的工作目錄。
ExecStart : 指定啟動應用的命令。
Restart : 指定何時重新啟動服務,on-failure
表示只在程序異常退出時重啟。
啟用和啟動服務
重新加載 systemd
配置以讀取新的服務文件:
sudo systemctl daemon-reload
啟用剛創建的服務,使其在開機時自動啟動:
sudo systemctl enable nodeapp.service
啟動服務以檢查它是否運行正常:
sudo systemctl start nodeapp.service
檢查服務的狀態來確認一切正常:
sudo systemctl status nodeapp.service
by Rain Chu | 4 月 16, 2024 | Nginx , SERVER , web , wordpress , 程式
sudoers
檔案控制了使用者及群組在使用 sudo
指令時的權限。為了安全編輯這個檔案,應該使用 visudo
指令,因為它會檢查語法錯誤,避免創建一個無法使用的 sudoers
檔案。
更新 sudoers
檔案的步驟:
開啟終端機 :
開啟你的伺服器的命令行介面。
使用 visudo
編輯 sudoers
檔案 : 輸入以下指令以安全方式編輯 sudoers
檔案:
新增規則 :
在編輯器中,新增一條規則,允許 www-data
使用者無需密碼執行特定指令。
www-data ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /path/to/nginx/cache/*
指令的意義是:
www-data :指定的使用者。
ALL=(ALL) :這表示 www-data
使用者可以從任何主機以任何使用者身份執行指令。
NOPASSWD :允許 www-data
使用者在執行指定的指令時不需要輸入密碼。
/usr/bin/rm -rf /path/to/nginx/cache/ *:指定 www-data
使用者無密碼可以執行的指令。
儲存並退出編輯器 :
如果你使用的是 nano
,按 Ctrl+X
來退出,然後按 Y
鍵儲存更改,最後按 Enter
鍵確認檔案名稱。
測試配置 :
為了確保設定正確無誤,可以用 www-data
份執行指令:
sudo -u www-data sudo /usr/bin/rm -rf /path/to/nginx/cache/*
如果不需要密碼且指令執行成功,代表 sudoers
檔案配置正確。
安全注意事項:
最小權限原則 :只授權必要的最小權限,避免給予 www-data
使用者太廣泛的權限。
明確指令路徑 :使用完整的指令路徑(如 /usr/bin/rm
),避免安全風險。
定期審計 :定期檢查 sudoers
檔案,確保所有條目仍然符合組織的安全政策和操作需要。
by Rain Chu | 4 月 1, 2024 | Linux , Ubuntu
調整NFS(Network File System)的效能可以從多個角度進行,包括調整NFS伺服器和客戶端的參數、網絡配置、以及文件系統的選擇。
調整 NFS 參數:
NFS Server 端
使用 NFSv4: NFSv4 提供更好的效能和安全性。
根據工作負載調整 rpc.mountd.port
和 rpc.nfsd.port
參數的值。
調整 nfsd.minthreads
和 nfsd.maxthreads
參數的值,以優化執行緒數量。
調整 nfs.readahead
和 nfs.writebehind
參數的值,以優化讀寫緩衝區大小。
範例如下
我的主機是 4VPU,4G RAM 來設計
修改 /etc/nfs.conf
文件(或你系統中相對應的配置文件),設置最小執行緒數為 8,最大執行緒數為 64 :
調整邏輯,將 nfsd.minthreads
和 nfsd.maxthreads
參數設置為與 CPU 核心的數量相同或是略高一些
編輯 /etc/sysctl.conf
# NFS Setup
nfsd.minthreads =8
nfsd.maxthreads = 64
nfs.readahead = 65536
nfs.writebehind = 262144
重啟主機
sudo service nfs-kernel-server start
NFS Client 端
使用 NFSv4: NFSv4 提供更好的效能和安全性。
調整 mount.nfs.rsize
和 mount.nfs.wsize
參數的值,以優化讀寫緩衝區大小。
調整 mount.nfs.mountd_port
和 mount.nfs.nfsd_port
參數的值。
調整邏輯,將 mount.nfs.rsize
和 mount.nfs.wsize
參數設置為與 TCP MTU 相同或是略低一點
範例如下
/etc/fstab
server:/path/to/share /mnt/nfs nfs rw,nfsvers=4,noatime,rsize=32768,wsize=32768 0 0
提高讀取的性能
mount -o async,noac,rsize=1048576 nfs://server/share /mnt
兼顧安全性以及效能的設定可以參考
mount -o async,noac,noatime,nodev,noexec,norecovery,rsize=1048576,tcp,nfsvers=4 nfs://server/share /mnt
讀取大型文件,如影音,透過 readahead 來幫助提高性能,這裡將 readahead
設置為 128
塊(每塊的大小依賴於系統配置,通常是 4KB)
sudo mount -t nfs -o rsize=32768,wsize=32768,readahead=128 server:/path/to/share /mnt/nfs
調整網路配置:
使用高性能網路設備。
調整 TCP/IP 參數,例如 tcp_keepalive
和 tcp_window_size
。
常見的 NFS 掛載選項
async
: 允許 NFS 客户端在將數據寫入磁碟之前將其發送到伺服器。這可以提高寫入性能,但可能會導致數據丟失。
bg
: 在後台掛載 NFS 共享。
intr
: 允許 NFS 客户端在伺服器無響應時中斷操作。
noac
: 不使用 NFS 屬性緩衝區。這可以提高性能,但可能會導致文件屬性不一致。
noatime
: 不更新文件的訪問時間。這可以提高性能,但可能會導致文件元數據不準確。
nodev
: 不將 NFS 共享上的設備映射到本地設備。
noexec
: 不允許在本地執行 NFS 共享上的可執行文件。
norecovery
: 在 NFS 伺服器發生故障時不嘗試重新掛載共享。
ro
: 以唯讀模式掛載 NFS 共享。
rsize
: 設置 NFS 客户端每次讀取操作從伺服器接收的最大數據量。
rw
: 以讀寫模式掛載 NFS 共享。
soft
: 在 NFS 伺服器無響應時允許 NFS 客户端重試操作。
tcp
: 使用 TCP 而不是 UDP 進行 NFS 通信。
timeo
: 設置 NFS 客户端在伺服器無響應之前等待的時間。
nfsvers
: 指定 NFS 協議版本
其中最常用到的是 async, noac, noatime, rsize, nfsvers.
noatime
多數情況下,禁用對文件訪問時間的更新可以提升性能,因為它減少了對伺服器的寫操作。
rsize和wsize:
對於現代網絡,32768
(32KB)或65536
(64KB)是比較常見的設定值,能夠提供良好的效能。你可以從這個基點開始,進行實際的性能測試來找到最適合你環境的值。
NFS 版本的比較說明 (nfsvers)
NFSv4 比較新,提供了更好的安全性(如Kerberos身份驗證)和效能優化,包括更高效的文件鎖定機制和狀態保持功能。
NFSv3 在一些舊系統上仍然很流行,對於不需要v4的安全性增強的環境來說,可能仍是一個好選擇。在某些情況下,它可能由於其無狀態性而提供更好的效能。
監控與調整
使用 nfsstat
這樣的工具來監控 NFS 伺服器的性能,然後根據實際運行情況進行調整。
之後就可以輸入 nfsstat 取得相關資訊
高效能伺服器
使用 NFS Ganesha: NFS Ganesha 高性能的 NFS 代理伺服器
近期留言