Nginx是網頁服務器運維人員不可能繞開的一個彎,剩下幾個比較高危的面試范圍是:linux基礎、網絡知識基礎、python,或許還會有zabbix等監控工具。這里先說nginx,后面幾個肯定也會寫。
試題
【試題1】缺省安裝的 nginx + php-fpm 環境,假設用戶瀏覽一個耗時的網頁,但是卻在服務端渲染頁面的中途關閉了瀏覽器,那么請問服務端的 php 腳本是繼續執行還是退出執行?
【解答】正常情況下,如果客戶端client異常退出了,服務端的程序還是會繼續執行,直到與IO進行了兩次交互操作。服務端發現客戶端已經斷開連接,這個時候會觸發一個user_abort,如果這個沒有設置ignore_user_abort,那么這個php-fpm的程序才會被中斷。
拓展閱讀:http://www.cnblogs.com/yjf512/p/5362025.html?foxhandler=RssReadRenderProcessHandler
【試題2】首先,Nginx 日志格式中的 $time_local 表示的是什么時間?請求開始的時間?請求結束的時間?其次,當我們從前到后觀察日志中的 $time_local 時間時,有時候會發現時間順序前后錯亂的現象,請說明原因。
【解答】$time_local:在服務器里請求開始寫入本地的時間,因為請求發生時間有前有后,所以會時間順序前后錯亂。
【試題3】在Nginx+PHP環境中,Web錯誤日志里偶爾會出現如下錯誤信息:「recv() failed (104: Connection reset by peer) while reading response header from upstream」,請分析可能的原因是什么。
【解答】遇到這種情況,第一解決方法是重啟php服務,service php5-fpm restart,但是這個治標不治本,相對治本的方法是把php的pm.max_requests值改大一點,比如500;第二個方法,修改php-fpm的request_terminate_timeout,把值改成=0。
這個情況要看后端的php,要么是鏈接不上,要么是php服務掛了,要么就是鏈接超時。
worker數不夠掛掉就會504,worker處理超時就會502。
拓展閱讀:http://serverfault.com/questions/543999/nginx-errors-recv-failed-104-connection-reset-by-peer-while-reading-respon
【試題4】已知Nginx和PHP-FPM安裝在同一台服務器上,Nginx連接PHP-FPM有兩種方式:一種是類似127.0.0.1:9000的TCP socket;另一種是類似/tmp/php-fpm.sock的Unix domain socket。請問如何選擇,需要注意什么。
【解答】Unix domain socket的流程不會走到TCP 那層,直接以文件形式,以stream socket通訊。如果是TCP socket,則需要走到IP層。說的通俗一點,追求可靠性就是tcp(需要占用一個端口,更穩),追求高性能就是Unix Socket(不需要占用端口,更快)。
拓展閱讀:https://blog.linuxeye.com/364.html
http://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-unix-domain-socket/ (這篇文章強烈推薦,寫得特別好!)
【試題5】在Nginx中,請說明Rewrite模塊里break和last的區別。
【解答】官方文檔的定義如下:
last:停止執行當前這一輪的ngx_http_rewrite_module指令集,然后查找匹配改變后URI的新location;
break:停止執行當前這一輪的ngx_http_rewrite_module指令集;
千言萬語舉個例子:
location /test1.txt/ {
rewrite /test1.txt/ /test2.txt break;
}
location ~ test2.txt {
return 508;
}
使用break會匹配兩次URL,如果沒有滿足項,就會停止匹配下面的location,直接發起請求www.xxx.com/test2.txt,由於不存在文件test2.txt,則會直接顯示404。
使用last的話,會繼續搜索下面是否有符合條件(符合重寫后的/test2.txt請求)的location,匹配十次,如果十次沒有得到的結果,那么就跟break一樣了。返回上面的例子,/test2.txt剛好與面location的條件對應上了,進入花括號{}里面的代碼執行,這里會返回508。(這里的508是我自己隨便設定的)
