此為看尚硅谷Linux運維面試題(大廠linux面試題攻略) 的學習筆記
1. 簡述Raid 0 、Raid1、Raid 5、Raid 10 的特點與原理。
分析:最好畫圖講解,比較直觀。
2. 軟Raid與硬Raid的區別?
- 軟Raid:是由操作系統模擬的Raid,一旦硬盤損壞,操作系統也會損壞,Raid會喪失作用。
- 硬Raid:是獨立於硬盤之外,硬件Raid卡組成;就算硬盤損壞,也不會導致Raid卡損壞,硬盤容錯才能起作用。
3. 簡述Linux啟動的過程
CentOS 6.x
- 加電自檢,加載BOIS信息,BOIS進行系統檢測
- 加載啟動引導grub
- 由grub加載系統內核(這里也加載一些必要驅動)
- 內核重新自檢,並加載硬件驅動
- 由內核啟動系統第一個進程/sbin/init
- 由/sbin/init進程調用/etc/init/rcS.conf,進行系統初始化配置
- 由/etc/init/rcS.conf調用/etc/inittab,確認 系統默認運行級別
- 確認默認運行級別后,調用/etc/init/rc.conf配置文件
- 運行相應的運行級別目錄/etc/rc[0-6].d中的配置文件
- 在啟動登錄界面之前,執行/etc/rc.d/rc.local中的程序
CentOS 7.x
- 加電自檢,加載BOIS信息,BOIS進行系統檢測
- 加載啟動引導grub2
- 由grub加載系統內核(這里也加載一些必要驅動)
- 內核重新自檢,並加載硬件驅動
- 內核啟動系統的第一個進程,也就是systemd
- systemd開始調用默認單元組(default.target),並按照默認單元組開始運行子單元組
- systemd調用sysinit.target單元組,初始化系統。
- systemd調用basic.target單元組,准備操作系統。
- systemd調用multi-user.tartget單元組,啟動字符界面所需程序。
- systemd調用multi-user.target單元組中的/etc/rc.d/rc.local文件,執行文件中的命令。
- systemd調用multi-user.target單元組中的getty.tartget單元組。初始化本地終端(tty)及登陸界面,如果字符集界面啟動,到此啟動完成。
CentOS 6.x 與CentOS 7.x的啟動區別
前者到第5步開始線性的一個進程調用一個進程來啟動;
后者到第5步調用第一個進程后開始並發式(瀑布式)的調用所需啟動的進程。
4. 如何進行Linux系統優化?
- 禁用不需要的服務
ntsysv命令最方便 - 避免直接使用root用戶,普通用戶通過sudo授權操作
- 通過chattr鎖定重要文件,需要用的時候再解鎖
/etc/passwd
/etc/shadow
/etc/grup
/etc/gshadow
/etc/inittab - 配置國內yum源,加快下載速度
- 配置系統同時打開最大文件數
vim /etc/profile
ulimit -SHn 65535 - 同步時間服務器(比如mysql主從復制就要求高度同步時間)
ntpdtae ntp1.aliyun.com
通過crond定時任務,讓時間同步命令沒一個小時執行一次 - 修改ssh服務的默認端口,配置ssh秘鑰對登錄
- 配置合理的iptables防火牆規則
- 配置SELinux安全上下文(很復雜,很多公司服務器是直接關掉的)
- 指定合理的監控策咯
- 定時備份系統重要文件
5. 哪些設置能夠提升SSH遠程管理的安全等級?
- ssh的登錄驗證
通過密鑰對登錄 - ssh端口與監聽
vim /etc/ssh/sshd_config
Port 22222
ListtenAdress <u>本機本地IP</u>
#通過監聽自己本地IP地址,來實現限制外網登錄。也可以通過防火牆來指定訪問IP,推薦使用白名單
- ssh的登錄用戶限制
vim /etc/ssh/sshd_config
#PermitRootLogin no #不讓root用戶遠程登錄
- ssh的超時限制
vim /etc/profile #在文件最末加入以下。配置完加載一下
export TMOUT=300 #默認為s
- ssh的最大登錄失敗設置
vim /etc/ssh/sshd_config
#MaxAuthTries 6
6. ssh連接時認證時間過長如何解決?
vim /etc/ssssh/ssssshd_config
#UsseDns no #取消ssh登錄時DNS域名解析功能
7. scp和rsync進行遠程文件復制有什么區別
備份方式 | 數據形式 | 傳輸方式 | 消耗資源 | |
---|---|---|---|---|
scp | 全量備份 | 文件級傳輸 | 加密傳輸 | 資源消耗少 |
rsync | 差異對比,增量備份 | 分塊校驗,部分傳輸 | 非加密傳輸 | 資源消耗高(零散文件較多) |
8. 公司里有一台服務器,需要在上面跑兩個網站,並且其中一個網站需要更換新域名,請問如何處理?
網站1:www.a.com
網站2:www.b.com(舊) www.d.com(新)
分析:
- 訪問舊的地址跳轉到新的地址;
- 虛擬主機實現一台服務器跑多個網站;
- 如果新的地址有支付功能等,需要https加密的。http端口80 —》https端口443,就需要rewrite地址重寫功能來實現 ;
虛擬主機的三種方式:
-
基於IP的虛擬主機(少用,浪費IP)
-
基礎IP+端口的虛擬主機(訪問時需要加端口,客戶不可能記得端口,所以不太常用)
-
基於域名的虛擬主機(常用)
#此處省略通過DNS域名解析服務器配置www.a.com、www.b.com、www.d.com的過程。也可用hosts來簡單的配置實驗環境
# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/aaa
ServerName www.a.com
ErrorLog logs/1-error_log
CustomLog logs/1-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/bbb
ServerName www.b.com
ErrorLog logs/2-error_log
CustomLog logs/2-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/ddd
ServerName www.d.com
ErrorLog logs/1-error_log
CustomLog logs/1-access_log common
</VirtualHost>
# systemctl restart httpd
再基於虛擬主機的基礎上,通過配置rewrite實現訪問訪問www.b.com跳轉到www.d.com
# vim /etc/httpd/conf/httpd.com
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/aaa
ServerName www.a.com
ErrorLog logs/1-error_log
CustomLog logs/1-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/bbb
ServerName www.b.com
ErrorLog logs/2-error_log
CustomLog logs/2-access_log common
<IfModule mod_rewrite.c> #在指定網站目錄下調用rewrite模塊
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.b.com
RewriteRule ^(.*)$ http://www.d.com/$1 [R=301,L]
</IfModule>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/ddd
ServerName www.d.com
ErrorLog logs/1-error_log
CustomLog logs/1-access_log common
</VirtualHost>
# systemctl restart httpd
<IfModule mod_rewrite.c> #在指定網站目錄下調用rewrite模塊
RewriteEngine on #開啟rewrite功能
RewriteCond %{HTTP_HOST} ^www.b.com #吧www.b.com開頭的內容復制給HTTP_HOST變量
RewriteRule ^(.*)$ http://www.d.com/$1 [R=301,L]
# ^(.*)$指代客戶端要訪問的資源
#$1 吧。*所指代的內容復制到$1變量中
#R=permanent 永久重定向 =301
#L 指定該規則為最后一條生效的規則,以后的不在生效
</IfModule>
9. 簡述Apache的三種工作模式?
prefork模式:
- Apache最早的工作模式
- 子進程會提前開啟准備好
- 一個線程只處理一個請求
- 此模式每個請求都非常穩定,但是消耗資源非常大
worker模式:
- 一個子進程對應多個線程,資源復用率提高了
- 並發能力比prefork模式強一些
- 但是穩定性上差一些。可能因為一個線程故障,導致它所在的子進程和子進程相關的線程都故障。
event模式:
- 相對於worker模式,多了個叫做Keepalive的線程,管理HTTP請求的保持與斷開,合理分配管理網站線程資源
- 對比worke模式,更適應高並發情況使用
查看方式:
# httpd -V |grep -i "server mpm"
指定方式:
在編譯時,在選項中指定, --with-mpm=xxx
10. 請寫出工作中常見的Apache優化策咯
考慮兩方面1:安全; 2:效率
- 日志的輪替
利用Apache自帶的rotatelogs工具進行日志切割,保證單個日志不會過大
access_log 訪問日志
error_log 錯誤日志
vim /etc/httpd/conf/http.conf
...
CustomLog "|/bin/rotatelogs -l /wwwlog/access_%Y%m%d.log 8640" combined
#把內容通過管道符傳給rotatelogs,每天的日志都分成一個日志文件,8640是一天的秒數
...
- 內化錯誤頁面
可以將404、500等錯誤信息頁面重定向到網站首頁或其他頁面,提升用戶體驗
vim /etc/httpd/conf/httpd.conf
...
ErrorDocument 404 http://www.a.com
ErrorDocument 500 http://www.a.com/500.html
···
- 屏蔽Apache的版本信息,防止別人獲取Apache的相應版本,利用其漏洞
- 配置靜態緩存,減少對服務器的訪問壓力
- 禁止解析指定目錄下的頁面程序,比如upload。禁止解析用戶上傳的腳本文件
- ......
11. 有哪些技術可以提高網站的安全和效率?
答:CDN技術
12. Apache 和Nginx的各有什么優缺點,應該如何選擇?
Apache的優缺點:
優點:
- Apache的rewrite功能比nginx的要強大
- 模塊非常多,基本想要的功能都能找到對應的模塊,直接在配置文件調用就行了
- 存在時間較長,文獻較全,bug也相對比較少
- 動靜態解析都超級穩定
缺點:
- 由於工作模式是同步阻塞型,導致資源消耗比較高,並發能力較差
nginx的優缺點:
優點:
- 輕量級服務,比Apache 占用更少的內存及資源
- 並發能力強,nginx處理請求是異步非阻塞的,而Apache測試阻塞型的,在高並發下的nginx能保持資源低消耗高性能
- 高度模塊化的設計,編寫模塊相對簡單
- 社區活躍,各種高性能模塊產出迅速
缺點:
- 動態處理需要使用fastcgi連接PHP的FPM服務,相對比Apache不占優勢
Apache和Nginx的選擇
Nginx適合做靜態處理,簡單,效率高
Apache適合做動態處理,穩定功能強
並發較高的情況下盡量選擇Nginx,並發要求不高的情況下兩者都可以,規模稍大的可以使用Nginx作為反響代理,然后將動態請求負載到后端的Apache上。
13. 為什么Nginx的並發能力強,消耗資源低?
解析:
同步:客戶端發送請求后,只要客戶端沒有斷開請求,就算在不用處理事務時,服務器也一直等待着
異步:客戶端發送請求后,只有要為客戶端處理事務的時候,才會開啟線程
阻塞:除了處理此客戶端的請求什么都不做
非阻塞:在處理此次請求的事務的間歇,可以處理其他事務
答:因為Nginx是以異步非阻塞型的方式工作,過程如下:
- 客戶端發送request(請求),服務器分配work進程來處理
- 能立即處理完的,處理后work進程釋放資源,進行下一個request
- 不能立即處理完的work進程注冊成返回事件,然后接着去處理其他的request
- 當之前的request結果返回后,觸發返回事件,由空閑work進程接着處理
通過這種快速處理,快速釋放請求的方式,達到同樣的配置可以處理更大並發量的目的
14. 寫出幾個Nginx的常用模塊,並描述其功能
- http_ssl_module
實現服務器加密傳輸的模塊,部署完成后可使用https://協議進行數據傳輸,保證數據傳輸過程的安全 - https_image_filter_module
通過該模塊可以實現圖片裁剪。將過大的圖片裁剪為指定大小的圖片,生成省咯圖,保證傳輸速率,該選項默認不開啟,需要認為開啟
image_filter resize $h $w - http_rewrite_module
Nginx 的地址重寫模塊,功能同Apache的一樣,可以實現通過正則匹配來完成條件判斷,然后進行域名或url的重寫。例如:多域名、http->https - http_proxy_module
Nginx的反響代理功能,由於Nginx的高並發特性,很多時候我們都選擇使用Nginx作為網站的前置服務器,一般會和upstream模塊一起使用,完成壓力分攤工作。 - http_upstream_module
Nginx 的負載均衡模塊,一般和http_proxy模塊一起使用,用來對后台服務器的任務調度及分配,分配原則可以通過算法進行控制。常見模式:Nginx+Apache、Nginx+
15. 請解釋Nginx是如何連接PHP進行頁面解析的
Nginx收到客戶端的請求,然后通過fastcgi模塊訪問php-fpm服務,來實現php頁面解析
16. 請描述Nginx和Tomcat之間的數據傳輸過程
可以nginx反響代理一個或多個Tomcat,並可以只把動態請求轉發給Tomcat來處理,靜態請求轉發給靜態服務器就好了。
17. 請列舉幾個你常見的http狀態碼
HTTP狀態碼的是5個不同的類別:
1:信息,服務器收到請求,需要請求繼續執行操作
2:成功,操作被成功接收並處理
3:重定向,需要進一步的操作以完成請求
4:客戶端錯誤,請求包含語法錯誤或無法完成請求
5**:服務器錯誤,服務器在處理請求的過程中發生了錯誤
五個類別的響應狀態碼的第一個數字是唯一代表。
18. MySQL一主多從,主機宕機,如何合理切換到從庫,其他從庫如何處理?
- 登錄所有從數據庫查看post信息,使用POST最大的作為新的主庫,然后將從數據庫提升為主庫,登錄從庫(新主庫)執行 stop slave
- 修改my.cnf配置文件,開啟log-bin並重新啟動數據庫服務,登錄數據庫執行restet master,show master status\G;查看主庫信息,最后創建權同步用戶與權限和網站使用數據庫的用戶與權限,最后修改對應服務器的IP地址等信息
- 登錄其他從庫,執行change master同步操作,查看同步狀態
19. 簡述一下mysql主從服務器的原理
技術點:bin-log日志(記錄主服務器的關於數據庫修改的SQL語句)
開啟主服務器的bin-log日志記錄功能,將主服務器的bin-log日志傳到從服務器,從服務器根據日志內容將數據還原到本地。
主從服務器:
從服務器主動把從服務器上的數據同步到本地(備份)
20. 單台MySQL達到性能瓶頸時,如何擊碎性能瓶頸?
使用數據庫代理工具,比如Amoeba。Amoeba致力於MySQL的分布式數據庫前段代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專注於分布式數據庫代理層開發。具有負載均衡、高可用、SQL過濾、讀寫分離、可路由相關的目標數據庫、可並發請求多台數據庫合並結果。通過Amoeba你能夠完成多數數據的高可用、負載均衡、數據切片的功能。
tip:為了防止Amoeba突然宕機,所以企業可以隨時備着另一台沒有在使用的Amoeba備用機。
21. MySQL什么時候需要建立索引?
分析考察點:
什么是索引?
索引的分類
索引的劣勢
什么時候需要建立索引
什么時候不要建立索引
什么是索引?
索引的本質是數據結構,排序好的快速查找數據結構,可以提高查找效率。比如新華字典里的目錄。數據庫執行查詢的時候,如果那張表設置了索引,則數據庫會先訪問索引表,然后通過一些特殊的算法實現快速的查找。
索引的分類
- 主鍵索引
- 單值索引,一個索引包含一個列,一個表可以有多個單列索引。如果字段會被經常用來檢索就可以用單值索引
- 復合索引,一個索引包含多個列,如電話簿上姓+名。最好不要超過5個字段
- 唯一索引,所有列的值必須唯一,但允許空值
- 普通索引和唯一索引可以稱為鋪助索引
劣勢是什么?
- 實際上索引也是一張表,該表保存了主鍵和所有字段,並指向實體表的記錄,索引列也是要占用空間的
- 雖然所有達達提高了查詢速度,但是會降低更新表的速度,如對表進行INSERT、UPDATE、DELETE。因為更新表示,MySQL不僅要保存數據,還要保存一下所以文件每次更新添加了所以列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
- 索引只是提高效率的一個因素,如果MySQL有大數據量的表,就 需要花時間研究建立最優秀的所以,或優化查詢。
什么時候需要創建索引
- 主鍵 自動建立唯一索引
- 頻繁作為查詢條件的字段應該創建索引
- 查詢中與其他表關聯的字段,外鍵關系建立索引
- 頻繁更新的字段不適合創建索引,因為每次更新不單單是更新了記錄還會更新索引
- where條件里用不到的字段不創建索引
- 單鍵/組合索引的選擇問題,在並發下傾向創建組合索引
- 查詢中排序的字段,排序字段若通過索引去訪問將大大提升排序速度
- 查詢中統計或者分組字段(group by)
什么時候不需要創建索引
- 表記錄太少,如果才幾萬條數據,不要建索引。三百萬條數據量創索引
- 頻繁更新的字段不合適創建索引,因為每次更新不單單是更新了記錄還會索引
- 性別,國際字段。有選擇性的字段。
22. 誤操作drop語句導致數據庫數據破壞,請給出回復的實際大體步驟
- 手動切割bin-log日志並記好切割好的bin-log日志文件位置,這里假設我009,備份全部binlog日志
- 找到之前全備數據最后備份到的bin-log日志文件位置並記錄好位置,這里假設為005
- 用mysqladmin命令將005到008bin-log文件中的SQL語句分離出來,並找到drop庫的語句將其刪除
- 將之前全非數據導入mysql服務器
- 將步驟3中分離出來的SQL語句導入msyql服務器
- 將009bin-log文件刪除,再次刷新bin-log日志,到此數據庫恢復成功
23. 如何保證Redis能永久保存數據?
分析:
永久保存=持久化=內存里的數據保存到磁盤上
RDB方式:在Redis運行時,RDB程序將當前內存中的數據庫快照保存到磁盤中。當Redis重啟時,RDB會通過重載RDB文件來還原數據庫。(保存快照時,會阻塞主進程,保證數據的一致性)
AOF方式:以協議文本的方式,將所有對數據庫進行的寫入操作命令記錄到AOF文件,達到記錄數據庫的目的。類似mysql的bin-log日志。
24. 如何利用Redis對MySQL進行優化?
- Web服務器發送查詢請求,會先看看Redis緩存數據庫有沒有此查詢數據,有則直接從Redis數據庫讀取;
- 如果沒有則再從mysql數據庫讀取數據;
- mysql數據庫返回數據給web后,同時也在Redis數據庫插入此條數據,並給此條數據設置TTL(有效時間)