2025年9月29日 星期一

資深 PHP 後端工程師面試指南:Linux 篇

 

資深 PHP 後端工程師面試指南:Linux 篇

在資深 PHP 後端工程師的面試中,Linux 相關知識是展現技術深度與系統管理能力的重要部分。本文根據 Albert Chen 的 PHP/後端工程師面試指南 與其他面試經驗,整理出 Linux 核心知識的七大追問方向,並提供模擬問答、程式碼範例與實戰建議,幫助你在面試中脫穎而出。這份指南也適用於技術創作者,將內容轉化為影片或部落格教學。


1. Linux 系統操作與原理

問題:你如何排查 Linux 系統資源異常?

回答要點

  • 使用工具如 tophtopvmstatiotopstrace 進行系統資源監控與診斷。
  • 按 CPU、記憶體、I/O 或網路逐層排查,展現邏輯化分析能力。
  • 強調問題定位的步驟化思維與工具選擇的優先級。

模擬答案

  1. 初步檢查:執行 tophtop,觀察 CPU、記憶體使用率及高負載進程。例如,若 CPU 使用率高,記下相關進程的 PID。
  2. 深入分析:針對 CPU 問題,用 pidstat -u 查看進程 CPU 佔用;針對 I/O 瓶頸,用 iotop -o -a 檢查磁碟讀寫。
  3. 網路排查:用 ss -tulnnetstat 檢查異常連線或端口佔用。
  4. 進階診斷:若進程行為異常,用 strace -p <pid> 追蹤系統調用,找出問題根源。

範例程式碼

# 查看系統資源使用情況
top -b -n 1 | head -n 10
# 檢查磁碟 I/O
iotop -o -a
# 追蹤進程系統調用
strace -p 12345 -o strace.log

實戰建議:在面試中,說明排查順序(如「先看整體負載,再聚焦具體進程」),並提及如何根據工具輸出快速定位問題。


2. Shell Script 與 Bash 熟練度

問題:請寫一段 script 來監控某個服務是否存活,並自動重啟。

回答要點

  • 展示 #!/bin/bash、條件語句、迴圈、錯誤處理與日誌記錄。
  • 強調腳本的可維護性與健壯性(如使用 set -e 確保錯誤退出)。
  • 提到 cronsystemd timer 進行定期執行。

模擬答案

  1. 使用 pgrepsystemctl status 檢查服務狀態。
  2. 若服務停止,記錄日誌並用 systemctl restart 重啟。
  3. 設定 cron 排程(如每分鐘檢查一次)或使用 systemd timer 確保持續監控。

範例程式碼

#!/bin/bash
SERVICE="nginx"
LOG_FILE="/var/log/service_monitor.log"

# 檢查服務是否存活
if ! pgrep -x "$SERVICE" > /dev/null; then
    echo "[$(date)] $SERVICE is down, restarting..." >> "$LOG_FILE"
    systemctl restart "$SERVICE"
    if [ $? -eq 0 ]; then
        echo "[$(date)] $SERVICE restarted successfully" >> "$LOG_FILE"
    else
        echo "[$(date)] Failed to restart $SERVICE" >> "$LOG_FILE"
    fi
else
    echo "[$(date)] $SERVICE is running" >> "$LOG_FILE"
fi

實戰建議:將腳本存為 monitor_service.sh,用 chmod +x 賦予執行權限,並設定 cron(如 */1 * * * * /path/to/monitor_service.sh)。面試時可提及如何透過日誌追蹤問題。


3. 權限與使用者管理

問題:請說明 Linux 權限 755 與 644 的差異。

回答要點

  • 解釋 Linux 權限結構(r=4, w=2, x=1)與三組對象(owner、group、others)。
  • 對比 755(可執行檔案/目錄)與 644(普通檔案)的應用場景。
  • 提到 chmodchownvisudo 的使用,強調最小權限原則。

模擬答案

  1. 權限結構:Linux 權限由三組數字表示,分别對應 owner、group 和 others 的讀(r=4)、寫(w=2)、執行(x=1)權限。
  2. 755:擁有者可讀寫執行(7=4+2+1),群組與其他人可讀執行(5=4+1)。適用於腳本或目錄(如 /usr/bin)。
  3. 644:擁有者可讀寫(6=4+2),群組與其他人只可讀(4)。適用於設定檔或靜態檔案(如 /etc/nginx/nginx.conf)。
  4. 應用實例:用 chmod 755 script.sh 確保腳本可執行;用 chmod 644 config.ini 保護設定檔。

範例程式碼

# 設定執行腳本權限
chmod 755 /path/to/script.sh
# 設定設定檔權限
chmod 644 /path/to/config.ini
# 檢查權限
ls -l

實戰建議:面試時可補充如何用 chown 更改檔案擁有者,或用 visudo 限制 sudo 指令,展現安全意識。


4. 網路與防火牆設定

問題:如何設定 Linux 防火牆只允許特定 IP 存取某個 port?

回答要點

  • 熟悉 iptablesfirewalldufw 的使用。
  • 說明規則的優先級與持久化保存。
  • 展現對網路安全的理解(如限制不必要的端口訪問)。

模擬答案

  1. 使用 iptables 設定規則,允許特定 IP(如 192.168.1.100)訪問 80 端口,其他全部拒絕。
  2. 使用 service iptables saveiptables-save 持久化規則。
  3. 若使用 firewalld,則用 firewall-cmd 實現相同功能。

範例程式碼(以 iptables 為例):

# 允許特定 IP 訪問 80 端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
# 拒絕其他 IP 訪問 80 端口
iptables -A INPUT -p tcp --dport 80 -j DROP
# 保存規則
service iptables save

實戰建議:面試時可提到 iptablesfirewalld 的差異(前者更底層,後者更易用),並補充如何用 nftables 替代舊系統。


5. 效能與資源監控

問題:請說明 load average 的意義。

回答要點

  • 定義 load average(1、5、15 分鐘的平均負載)與其反映的系統狀態。
  • 解釋如何結合 CPU 核心數解讀負載。
  • 介紹相關工具如 uptimesardstat

模擬答案

  1. 定義load average 表示過去 1、5、15 分鐘內等待 CPU 或 I/O 的平均進程數,顯示於 uptime 輸出。
  2. 解讀:在一台 4 核 CPU 的系統上,load average 為 4.0 表示 CPU 負載飽和;若超過 4.0,則有進程在排隊。
  3. 排查:用 top 檢查進程佔用,用 sar -q 分析歷史負載趨勢,用 iotop 檢查 I/O 瓶頸。

範例程式碼

# 查看 load average
uptime
# 輸出示例:load average: 1.50, 2.00, 1.80
# 採樣負載數據
sar -q 1 3

實戰建議:面試時可補充如何根據 load average 判斷系統瓶頸(CPU 或 I/O),並提及如何用 dstat 監控即時資源使用。


6. 部署與 CI/CD 整合

問題:你如何在 Linux 上部署 Laravel 應用?

回答要點

  • 熟悉 PHP 環境(PHP-FPM、Nginx、MySQL)與 Laravel 部署流程。
  • 提到 supervisor 管理 Queue 進程與 systemctl 管理服務。
  • 展示 CI/CD 工具(如 GitHub Actions)的整合經驗。

模擬答案

  1. 環境準備:安裝 PHP 8.1、Composer、Nginx、MySQL,啟用 php-fpm
  2. 應用部署:用 git clone 拉取程式碼,執行 composer install,設定 .env 檔案,運行 php artisan migrate
  3. 伺服器配置:配置 Nginx 指向 Laravel 的 public 目錄,確保 php-fpm 正常運作。
  4. 進程管理:用 supervisor 管理 Laravel Queue,設定 systemctl 啟動服務。

範例程式碼(Nginx 配置):

server {
    listen 80;
    server_name example.com;
    root /var/www/laravel/public;
    index index.php;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

實戰建議:面試時可補充如何用 GitHub Actions 自動化部署(如運行測試、推送程式碼到伺服器),展現 DevOps 能力。


7. 容器與虛擬化

問題:你如何在 Linux 上使用 Docker Compose 部署多服務?

回答要點

  • 解釋 Docker 的 namespace、cgroups 與 image layering 原理。
  • 展示 docker-compose.yml 的撰寫,涵蓋服務、網路與卷管理。
  • 提到容器化的優勢(如環境一致性、可移植性)。

模擬答案

  1. 定義服務:撰寫 docker-compose.yml,包含 PHP、Nginx、MySQL 等服務。
  2. 網路與卷管理:使用 Docker 網路確保服務間通信,設定持久化卷存儲 MySQL 數據。
  3. 啟動與管理:用 docker-compose up -d 啟動,檢查容器狀態與日誌。

範例程式碼

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - app-network
  php:
    image: php:8.1-fpm
    volumes:
      - ./app:/var/www/html
    networks:
      - app-network
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network
networks:
  app-network:
    driver: bridge
volumes:
  db_data:

實戰建議:面試時可補充如何用 docker logsdocker exec 排查容器問題,並提到 Docker 與 VM 的性能差異。


總結與面試建議

面試技巧

  1. 結構化回答:將答案分為「定義 → 步驟 → 範例」,展現邏輯清晰。
  2. 展示實戰經驗:結合具體案例(如部署 Laravel 或排查高負載)讓回答更具說服力。
  3. 強調安全與最佳實踐:如最小權限原則、規則持久化、日誌記錄等。

進階學習資源

  • Linux 基礎:閱讀 man 頁面(如 man iptables)、《Linux System Programming》。
  • 容器化:參考 Docker 官方文件與《Docker in Action》。
  • 效能監控:學習 sarprometheus 等進階工具。

透過反覆練習這些模擬問答,並結合實戰案例,你將能在面試中自信展現 Linux 技能!若需將本文轉化為影片腳本或補充視覺化圖表,請隨時告訴我。

沒有留言:

張貼留言

熱門文章