[toc] # Linux運維工程師面試題(2) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 訪問一個網站的流程 1. 打開瀏覽器,輸入網址。首先查找本地緩存,如果有就打開頁面, ...
目錄
Linux運維工程師面試題(2)
祝各位小伙伴們早日找到自己心儀的工作。
持續學習才不會被淘汰。
地球不爆炸,我們不放假。
機會總是留給有有準備的人的。
加油,打工人!
1 訪問一個網站的流程
- 打開瀏覽器,輸入網址。首先查找本地緩存,如果有就打開頁面,如果沒有,利用DNS做功能變數名稱解析;
- 瀏覽器發出DNS請求,遞歸查詢網站的IP地址。HOSTS表 --> 本地DNS --> 上層DNS(包括根DNS);
- 經過了DNS解析,將網址轉換為IP地址,通過IP地址找到指定的Web伺服器,與伺服器建立 tcp 三次握手;
- 握手成功後瀏覽器發出HTTP請求,預設請求的是index.html;
- 伺服器接收到請求後將網頁文件發回給瀏覽器;
- 瀏覽器接收到伺服器返回的網頁文件後,瀏覽器會解析html文件,將渲染後的網頁文件呈現給用戶。
- 瀏覽器將發回的數據及狀態碼存入 Cache 以便後續快速訪問。
2 TCP 三次握手,四次揮手
三次握手
- 客戶端向伺服器端發送請求報文,報文中包含有隨機生成的seq序列號(x),並且還將報文中SYN欄位置為1,表示需要建立TCP連接請求;
- 伺服器端接收請求後回覆請求報文,報文中包含隨機生成的seq(y)序列號,並且將回覆報文的SYN欄位置1,表示也需要建立連接請求,雙向確認。而且會產生ACK驗證欄位,將ACK確認報文欄位置為1,ACK驗證欄位數值是在客戶端發過來的seq(x)序列號基礎上加1進行回覆,即回覆ack(x+1)確認號欄位,以便客戶端收到信息時,知曉自己的TCP建立請求已得到了確認,ack也可以理解為期望下次客戶端發送的seq序列號的值;
- 客戶端收到服務端發送的建立TCP連接請求後,會使自己的原有序列號(x)加1進行再次發送序列號seq(x+1),同時回覆ACK驗證請求,將ACK欄位標記為1,在伺服器端發送過來的seq(y)基礎上加1,即回覆ack確認控制欄位(y+1),以便伺服器端收到信息時,知曉自己的TCP建立請求已經得到了確認,同樣ack也可以理解為期望下次伺服器端發送的seq序列號的值。
三次握手的目的是確保兩端的序列號同步,並且雙方都可以發送和接收數據。如果第一次握手失敗,客戶端會重覆發送SYN包;如果第二次握手失敗,伺服器也會重覆發送SYN+ACK包;如果第三次握手失敗,客戶端會重新發送ACK包。
四次揮手
- 客戶端主動向伺服器端發送關閉連接請求,此時的序列號seq為u,將報文中的FIN欄位標記為1,表示要關閉TCP連接;
- 伺服器端收到報文後會發送ACK報文驗證,將ACK置為1,同時發送ack(u+1)確認欄位,此時的序列號seq為v,此次報文表示已經收到了結束請求;
- 此時伺服器可能還有數據需要發送,因此需要等待一段時間。當伺服器完成數據發送後,會發送一個FIN包,表示已經結束TCP連接,將FIN標記為1,ACK標記為1,此時的序列號seq為w,確認號ack為u+1;
- 客戶端收到FIN包後,會回應一個ACK包,表示已經收到了結束請求,將ACK置為1,序列號seq為u+1,ack為w+1,併進入TIME_WAIT狀態。等待一段時間後,客戶端關閉連接。伺服器收到ACK包後,也關閉連接。
四次揮手的目的是確保兩端都知道對方已經關閉了連接,並且不會再發送數據。如果客戶端發出FIN包後沒有收到ACK包,可以重發FIN包;如果伺服器發出FIN包後沒有收到ACK包,可以重新發送FIN包。如果客戶端在TIME_WAIT狀態結束之前收到了重覆的FIN包,可以忽略它。
3 apache 和 nginx 有哪幾種虛擬主機
- 基於IP地址的虛擬主機
- 基於功能變數名稱的虛擬主機
- 基於埠號的虛擬主機
4 TCP 和 UDP 的區別
- TCP是一種面向連接的協議,而UDP是無連接的協議。TCP是一對一傳輸,UDP支持一對一、一對多、多對一和多對多的交互通信;
- TCP提供可靠的數據傳輸,保證數據能夠完整、有序地到達目的地,而UDP不提供可靠性保證,數據傳輸可能會丟失、重覆或者亂序。
- TCP將數據分成一些數據段,每個數據段都有一個序列號,可以保證數據的有序性和完整性。而UDP將數據封裝成數據報,每個數據報都是獨立的,可能會丟失、重覆或者亂序。
- TCP是面向位元組流的,即把應用層傳來的報文看成位元組流,將位元組流拆分成大小不等的數據塊,並添加TCP首
部;UDP是面向報文的,對應用層傳下來的報文不拆分也不合併,僅添加UDP首部; - UDP比TCP快,因為它沒有TCP的可靠性保證和複雜的流量控制和擁塞控制機制。
- UDP適用於傳輸量較小但傳輸速度要求高的應用,例如視頻、音頻和游戲等;而TCP適用於傳輸量較大但對可靠性和完整性要求較高的應用,例如文件傳輸、郵件等。
- TCP支持傳輸可靠性的多種措施,包括保證包的傳輸順序、重發機制、流量控制和擁塞控制;UDP僅提供最基本的數據傳輸能力。
5 nginx 和 apache 的區別
Nginx:
- 輕量級,採用 C 進行編寫,同樣的 web 服務,會占用更少的記憶體及資源;
- 抗併發,nginx 以 epoll 和 kqueue 作為開發模型,處理請求是非同步非阻塞的,負載能力比apache 高很多,而 apache 則是阻塞型的。在高併發下 nginx 能保持低資源低消耗高性能 ,而apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現進程數飆升,從而拒絕服務的現象;
- nginx 處理靜態文件好,靜態處理性能比 apache 高三倍以上;
- nginx 的設計高度模塊化,編寫模塊相對簡單;
- nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置複雜 ,重啟的時候發現配置出錯了,會很崩潰;
- nginx 作為負載均衡伺服器,支持 4 層和 7 層負載均衡,七層負載可以有效的防止ddos攻擊;
- nginx 本身就是一個反向代理伺服器,也可以作為郵件代理伺服器來使用。
Apache:
- apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache;
- apache 發展到現在,模塊超多,基本想到的都可以找到;
- apache 更為成熟,少 bug ,nginx 的 bug 相對較多;
- apache 對 PHP 支持比較簡單,nginx 需要配合其他後端用;
- apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向;
- apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社區。
兩者最核心的區別在於 apache 是同步多進程模型,一個連接對應一個進程,而 nginx 是非同步的,多個連接(萬級別)可以對應一個進程。
需要穩定用apache,需要高性能用nginx
6 什麼是反向代理,什麼是正向代理,區別是什麼?
反向代理和正向代理都是代理伺服器的一種應用形式,它們的主要區別在於代理的方向和代理對象不同。
正向代理是在客戶端和目標伺服器之間設置代理伺服器,以代替客戶端向目標伺服器發送請求,客戶端無法直接訪問目標伺服器。正向代理伺服器一般用於加密、緩存、控制訪問、內容過濾等功能。例如,FQ工具就是一種常見的正向代理應用。
反向代理是在目標伺服器和客戶端之間設置代理伺服器,以代替目標伺服器向客戶端提供服務,客戶端無法直接訪問目標伺服器,所有的請求都要經過反向代理伺服器。反向代理伺服器可以根據客戶端的請求選擇不同的目標伺服器,從而實現負載均衡和高可用性。例如,一些大型網站和應用程式就會使用反向代理伺服器進行負載均衡和緩存。
兩者的主要區別在於代理的方向不同。正向代理是代理客戶端,把客戶端的請求轉發到目標伺服器;而反向代理是代理伺服器端,把目標伺服器的響應轉發給客戶端。
7 cookie和session的區別
- 存儲位置:Cookie保存在客戶端瀏覽器上,而Session保存在伺服器端。
- 安全性:由於Cookie保存在客戶端瀏覽器上,因此可以被竊取和篡改,存在一定的安全風險;而Session保存在伺服器端,相對來說更加安全。
- 存儲容量:Cookie的存儲容量有限,一般只能保存4KB左右的數據;而Session的存儲容量沒有限制,可以保存更多的數據。
- 作用範圍:Cookie的作用範圍是整個功能變數名稱下的所有頁面,可以在多個頁面之間共用數據;而Session的作用範圍是當前用戶與伺服器之間的會話,只能在同一會話期間內共用數據。
- 有效期:Cookie可以設置有效期,可以長期保存在客戶端瀏覽器上;而Session一般會在用戶關閉瀏覽器或者一定時間內沒有操作時自動失效。
綜上所述,Cookie適合保存一些不敏感的數據,如用戶的偏好設置、購物車信息等;而Session適合保存一些敏感的數據,如用戶的登錄狀態、許可權信息等。在實際開發中,通常會根據具體的應用場景和需求來選擇合適的機制。
8 nginx 調優
工作進程綁定,最大上傳文件大小,事件驅動模型優化,文件描述符優化,防盜鏈優化,隱藏軟體名稱和版本號,對於404、502等預設頁面的優化,從而對用戶友好展示,禁止惡意功能變數名稱解析,禁止通過IP地址訪問網站,嚴格設置web站點目錄的許可權,通過robot協議以及HTTP_USER_AGENT防爬蟲優化。防止ddos單ip併發連接的控制。status監控模塊得開啟等等。limit_rate限制上傳速率。client_max_body_size允許用戶上傳的文件最大大小。
chatgpt:
- 調整工作進程數:Nginx預設開啟的工作進程數是CPU核心數,可以根據伺服器性能和應用負載情況進行適當調整。一般情況下,可以將工作進程數設置為2倍或3倍的CPU核心數。
- 調整文件句柄限制:Nginx預設的文件句柄限制是1024,可以根據實際情況進行適當調整。可以通過修改系統參數或者在Nginx配置文件中設置"worker_rlimit_nofile"參數來調整文件句柄限制。
- 啟用TCP優化參數:Nginx提供了一些TCP優化參數,可以通過設置"tcp_nopush"、"tcp_nodelay"、"keepalive_timeout"等參數來提高TCP連接性能和可靠性。
- 啟用Gzip壓縮:啟用Gzip壓縮可以減少網路傳輸的數據量,提高頁面載入速度。可以在Nginx配置文件中設置"gzip"參數來啟用Gzip壓縮。
- 啟用HTTP緩存:啟用HTTP緩存可以減少伺服器負載和頁面載入時間,可以在Nginx配置文件中設置"proxy_cache_path"參數來啟用HTTP緩存。
- 調整Nginx記憶體占用:Nginx預設的記憶體占用較低,可以通過設置"worker_processes"、"worker_connections"等參數來調整Nginx記憶體占用,提高性能和可靠性。
9 系統出現大量的 time_wait 問題怎麼解決
一次意外,伺服器遭受了ddos攻擊,對我們造成了極大的影響,雖然我們把前端用戶訪問入口關閉暫停了ddos攻擊,但是伺服器端出現了大量的time-wait,導致的結果就是新建連接失敗,而且占用了系統大量的資源,我們的臨時解決方法就是這樣的。
在系統配置 sysctl.conf
裡面添加兩個參數
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 300
net.ipv4.tcp_syncookies = 1
改成1之後,並執行 sysctl -p
命令立即生效,然後就慢慢下來了。
chatgpt:
time_wait是TCP協議的一種狀態,表示一個TCP連接已經關閉,但是還需要一段時間等待一些延遲的數據包到達。如果系統中存在大量的time_wait狀態的連接,可能會導致系統資源的浪費和性能下降。以下是一些解決方案:
- 調整TCP參數:可以通過調整TCP參數來控制time_wait的數量和時間,如修改tcp_tw_recycle、tcp_tw_reuse等參數。但是需要註意的是,不建議在生產環境中調整這些參數,因為會帶來潛在的風險。
- 增加伺服器資源:time_wait狀態連接的數量與系統資源有關,增加伺服器資源可以降低系統中time_wait狀態連接的數量,如增加記憶體、CPU、網路帶寬等。
- 使用連接池:可以使用連接池來複用已經建立的TCP連接,避免頻繁的建立和關閉連接。連接池可以降低time_wait狀態連接的數量,並且可以提高系統的性能。
- 使用TCP快速回收技術:TCP快速回收技術是一種基於時間戳的技術,可以讓系統快速回收time_wait狀態的連接。可以通過設置net.ipv4.tcp_timestamps=1來啟用TCP快速回收技術。
總之,在解決time_wait問題時,需要根據具體的應用場景和系統資源情況綜合考慮和調整,以提高系統的性能和可靠性。同時,需要註意避免不正確的調整參數和配置,造成潛在的風險。
10 拿到一臺新伺服器後需要乾什麼,做哪些系統優化
更改ssh的埠,在公網的機器禁用密碼登錄,選擇密鑰登錄的方式;
禁止root登錄,儘量使用普通用戶登錄系統,添加sudo許可權;
配置時間同步,設置網卡名稱為 eth0 傳統命名方式;
開啟防火牆,配置好防火牆規則;
優化內核參數,修改資源限制,比如tcp參數優化,調大文件描述符;
配置本地yum源或者國內源,安裝常用軟體包,比如tcpdump等工具包。
chatgpt:
- 更新系統和軟體包:首先需要更新操作系統和軟體包到最新版本,以獲取最新的安全補丁和功能。
- 配置防火牆和安全策略:配置防火牆和安全策略可以保護伺服器免受網路攻擊和惡意軟體的侵害。
- 配置遠程訪問:配置遠程訪問可以方便管理員遠程管理伺服器,但是需要註意安全性,如使用SSH加密連接。
- 安裝必要的軟體:安裝必要的軟體可以方便伺服器的管理和維護,如編輯器、日誌分析工具、監控工具等。
- 配置系統資源限制:配置系統資源限制可以避免某些進程占用過多的系統資源,導致系統崩潰或性能下降。
- 配置系統參數:配置系統參數可以提高系統的性能和可靠性,如調整文件句柄數、記憶體大小、網路緩衝區等。
- 配置系統日誌:配置系統日誌可以方便管理員查看系統的運行情況和錯誤信息,及時發現和解決問題。
- 配置系統備份:配置系統備份可以在系統出現問題時恢複數據和服務,避免數據丟失和服務中斷。
以上是對新伺服器的基本優化建議,具體的優化方法和步驟需要根據具體的應用場景和系統配置情況綜合考慮和調整。
關於我
全網可搜《阿賢Linux》
CSDN、知乎、嗶哩嗶哩、博客園、51CTO、掘金、思否、開源中國、阿裡雲、騰訊雲、華為雲、今日頭條、GitHub、個人博客
公眾號:阿賢Linux
個人博客:blog.waluna.top
https://blog.waluna.top/
原文鏈接: Linux運維工程師面試題(2).