nginx常见面试题
生活随笔
收集整理的這篇文章主要介紹了
nginx常见面试题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.nginx常用命令
啟動(dòng)nginx ?./sbin/nginx
停止nginx ./sbin/nginx -s stop ? ?./sbin/nginx -s quit
重載配置 ?./sbin/nginx -s reload(平滑重啟) ?service nginx reload?
重載指定配置文件 ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
查看nginx版本 ./sbin/nginx -v
檢查配置文件是否正確 ./sbin/nginx -t
顯示幫助信息 ./sbin/nginx -h
2.nginx狀態(tài)碼 499:服務(wù)端處理時(shí)間過長(zhǎng),客戶端主動(dòng)關(guān)閉了連接。
3.nginx是如何實(shí)現(xiàn)高并發(fā)的 一個(gè)主進(jìn)程,多個(gè)工作進(jìn)程,每個(gè)工作進(jìn)程可以處理多個(gè)請(qǐng)求 每進(jìn)來一個(gè)request,會(huì)有一個(gè)worker進(jìn)程去處理。但不是全程的處理,處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請(qǐng)求返回。那么,這個(gè)處理的worker繼續(xù)處理其他請(qǐng)求,而一旦上游服務(wù)器返回了,就會(huì)觸發(fā)這個(gè)事件,worker才會(huì)來接手,這個(gè)request才會(huì)接著往下走。 由于web server的工作性質(zhì)決定了每個(gè)request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實(shí)際上花費(fèi)在server機(jī)器上的時(shí)間片不多。這是幾個(gè)進(jìn)程就解決高并發(fā)的秘密所在。即@skoo所說的webserver剛好屬于網(wǎng)絡(luò)io密集型應(yīng)用,不算是計(jì)算密集型。
4.nginx功能 作為http server(代替apache,對(duì)PHP需要FastCGI處理器支持) 反向代理服務(wù)器 實(shí)現(xiàn)負(fù)載均衡 虛擬主機(jī) FastCGI:Nginx本身不支持PHP等語(yǔ)言,但是它可以通過FastCGI來將請(qǐng)求扔給某些語(yǔ)言或框架處理
5.502錯(cuò)誤可能原因 (1).FastCGI進(jìn)程是否已經(jīng)啟動(dòng) (2).FastCGI worker進(jìn)程數(shù)是否不夠 (3).FastCGI執(zhí)行時(shí)間過長(zhǎng) fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; (4).FastCGI Buffer不夠 nginx和apache一樣,有前端緩沖限制,可以調(diào)整緩沖參數(shù) fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; (5). Proxy Buffer不夠 如果你用了Proxying,調(diào)整 proxy_buffer_size?? 16k; proxy_buffers ?? 4 16k; (6).php腳本執(zhí)行時(shí)間過長(zhǎng) 將php-fpm.conf的<value name="request_terminate_timeout">0s</value>的0s改成一個(gè)時(shí)間
6.nignx配置 worker_processes??8; ? ? 工作進(jìn)程個(gè)數(shù) worker_connections??65535; ?每個(gè)工作進(jìn)程能并發(fā)處理(發(fā)起)的最大連接數(shù)(包含所有連接數(shù)) error_log?????????/data/logs/nginx/error.log; ?錯(cuò)誤日志打印地址 access_log ? ? ?/data/logs/nginx/access.log ?進(jìn)入日志打印地址 log_format??main??'$remote_addr"$request"?''$status?$upstream_addr?"$request_time"'; 進(jìn)入日志格式
fastcgi_connect_timeout=300; #連接到后端fastcgi超時(shí)時(shí)間 fastcgi_send_timeout=300; #向fastcgi請(qǐng)求超時(shí)時(shí)間(這個(gè)指定值已經(jīng)完成兩次握手后向fastcgi傳送請(qǐng)求的超時(shí)時(shí)間) fastcgi_rend_timeout=300; #接收fastcgi應(yīng)答超時(shí)時(shí)間,同理也是2次握手后 fastcgi_buffer_size=64k; #讀取fastcgi應(yīng)答第一部分需要多大緩沖區(qū),該值表示使用1個(gè)64kb的緩沖區(qū)讀取應(yīng)答第一部分(應(yīng)答頭),可以設(shè)置為fastcgi_buffers選項(xiàng)緩沖區(qū)大小 fastcgi_buffers 4 64k;#指定本地需要多少和多大的緩沖區(qū)來緩沖fastcgi應(yīng)答請(qǐng)求,假設(shè)一個(gè)php或java腳本所產(chǎn)生頁(yè)面大小為256kb,那么會(huì)為其分配4個(gè)64kb的緩沖來緩存 fastcgi_cache TEST;#開啟fastcgi緩存并為其指定為TEST名稱,降低cpu負(fù)載,防止502錯(cuò)誤發(fā)生
listen???????80; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?監(jiān)聽端口 server_name??rrc.test.jiedaibao.com; ? ? ? 允許域名 root??/data/release/rrc/web; ? ? ? ? ? ? ? ? ? ?項(xiàng)目根目錄 index??index.php?index.html?index.htm; ?訪問根文件
7.nginx和apache的區(qū)別 輕量級(jí),同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源? 抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能 高度模塊化的設(shè)計(jì),編寫模塊相對(duì)簡(jiǎn)單? 最核心的區(qū)別在于apache是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程?
8.fastcgi與cgi的區(qū)別 cgi: web服務(wù)器會(huì)根據(jù)請(qǐng)求的內(nèi)容,然后會(huì)fork一個(gè)新進(jìn)程來運(yùn)行外部c程序(或perl腳本...), 這個(gè)進(jìn)程會(huì)把處理完的數(shù)據(jù)返回給web服務(wù)器,最后web服務(wù)器把內(nèi)容發(fā)送給用戶,剛才fork的進(jìn)程也隨之退出。 如果下次用戶還請(qǐng)求改動(dòng)態(tài)腳本,那么web服務(wù)器又再次fork一個(gè)新進(jìn)程,周而復(fù)始的進(jìn)行。 fastcgi: web服務(wù)器收到一個(gè)請(qǐng)求時(shí),他不會(huì)重新fork一個(gè)進(jìn)程(因?yàn)檫@個(gè)進(jìn)程在web服務(wù)器啟動(dòng)時(shí)就開啟了,而且不會(huì)退出),web服務(wù)器直接把內(nèi)容傳遞給這個(gè)進(jìn)程(進(jìn)程間通信,但fastcgi使用了別的方式,tcp方式通信),這個(gè)進(jìn)程收到請(qǐng)求后進(jìn)行處理,把結(jié)果返回給web服務(wù)器,最后自己接著等待下一個(gè)請(qǐng)求的到來,而不是退出。?
2.nginx狀態(tài)碼 499:服務(wù)端處理時(shí)間過長(zhǎng),客戶端主動(dòng)關(guān)閉了連接。
3.nginx是如何實(shí)現(xiàn)高并發(fā)的 一個(gè)主進(jìn)程,多個(gè)工作進(jìn)程,每個(gè)工作進(jìn)程可以處理多個(gè)請(qǐng)求 每進(jìn)來一個(gè)request,會(huì)有一個(gè)worker進(jìn)程去處理。但不是全程的處理,處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請(qǐng)求返回。那么,這個(gè)處理的worker繼續(xù)處理其他請(qǐng)求,而一旦上游服務(wù)器返回了,就會(huì)觸發(fā)這個(gè)事件,worker才會(huì)來接手,這個(gè)request才會(huì)接著往下走。 由于web server的工作性質(zhì)決定了每個(gè)request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實(shí)際上花費(fèi)在server機(jī)器上的時(shí)間片不多。這是幾個(gè)進(jìn)程就解決高并發(fā)的秘密所在。即@skoo所說的webserver剛好屬于網(wǎng)絡(luò)io密集型應(yīng)用,不算是計(jì)算密集型。
4.nginx功能 作為http server(代替apache,對(duì)PHP需要FastCGI處理器支持) 反向代理服務(wù)器 實(shí)現(xiàn)負(fù)載均衡 虛擬主機(jī) FastCGI:Nginx本身不支持PHP等語(yǔ)言,但是它可以通過FastCGI來將請(qǐng)求扔給某些語(yǔ)言或框架處理
5.502錯(cuò)誤可能原因 (1).FastCGI進(jìn)程是否已經(jīng)啟動(dòng) (2).FastCGI worker進(jìn)程數(shù)是否不夠 (3).FastCGI執(zhí)行時(shí)間過長(zhǎng) fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; (4).FastCGI Buffer不夠 nginx和apache一樣,有前端緩沖限制,可以調(diào)整緩沖參數(shù) fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; (5). Proxy Buffer不夠 如果你用了Proxying,調(diào)整 proxy_buffer_size?? 16k; proxy_buffers ?? 4 16k; (6).php腳本執(zhí)行時(shí)間過長(zhǎng) 將php-fpm.conf的<value name="request_terminate_timeout">0s</value>的0s改成一個(gè)時(shí)間
6.nignx配置 worker_processes??8; ? ? 工作進(jìn)程個(gè)數(shù) worker_connections??65535; ?每個(gè)工作進(jìn)程能并發(fā)處理(發(fā)起)的最大連接數(shù)(包含所有連接數(shù)) error_log?????????/data/logs/nginx/error.log; ?錯(cuò)誤日志打印地址 access_log ? ? ?/data/logs/nginx/access.log ?進(jìn)入日志打印地址 log_format??main??'$remote_addr"$request"?''$status?$upstream_addr?"$request_time"'; 進(jìn)入日志格式
fastcgi_connect_timeout=300; #連接到后端fastcgi超時(shí)時(shí)間 fastcgi_send_timeout=300; #向fastcgi請(qǐng)求超時(shí)時(shí)間(這個(gè)指定值已經(jīng)完成兩次握手后向fastcgi傳送請(qǐng)求的超時(shí)時(shí)間) fastcgi_rend_timeout=300; #接收fastcgi應(yīng)答超時(shí)時(shí)間,同理也是2次握手后 fastcgi_buffer_size=64k; #讀取fastcgi應(yīng)答第一部分需要多大緩沖區(qū),該值表示使用1個(gè)64kb的緩沖區(qū)讀取應(yīng)答第一部分(應(yīng)答頭),可以設(shè)置為fastcgi_buffers選項(xiàng)緩沖區(qū)大小 fastcgi_buffers 4 64k;#指定本地需要多少和多大的緩沖區(qū)來緩沖fastcgi應(yīng)答請(qǐng)求,假設(shè)一個(gè)php或java腳本所產(chǎn)生頁(yè)面大小為256kb,那么會(huì)為其分配4個(gè)64kb的緩沖來緩存 fastcgi_cache TEST;#開啟fastcgi緩存并為其指定為TEST名稱,降低cpu負(fù)載,防止502錯(cuò)誤發(fā)生
listen???????80; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?監(jiān)聽端口 server_name??rrc.test.jiedaibao.com; ? ? ? 允許域名 root??/data/release/rrc/web; ? ? ? ? ? ? ? ? ? ?項(xiàng)目根目錄 index??index.php?index.html?index.htm; ?訪問根文件
7.nginx和apache的區(qū)別 輕量級(jí),同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源? 抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能 高度模塊化的設(shè)計(jì),編寫模塊相對(duì)簡(jiǎn)單? 最核心的區(qū)別在于apache是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程?
8.fastcgi與cgi的區(qū)別 cgi: web服務(wù)器會(huì)根據(jù)請(qǐng)求的內(nèi)容,然后會(huì)fork一個(gè)新進(jìn)程來運(yùn)行外部c程序(或perl腳本...), 這個(gè)進(jìn)程會(huì)把處理完的數(shù)據(jù)返回給web服務(wù)器,最后web服務(wù)器把內(nèi)容發(fā)送給用戶,剛才fork的進(jìn)程也隨之退出。 如果下次用戶還請(qǐng)求改動(dòng)態(tài)腳本,那么web服務(wù)器又再次fork一個(gè)新進(jìn)程,周而復(fù)始的進(jìn)行。 fastcgi: web服務(wù)器收到一個(gè)請(qǐng)求時(shí),他不會(huì)重新fork一個(gè)進(jìn)程(因?yàn)檫@個(gè)進(jìn)程在web服務(wù)器啟動(dòng)時(shí)就開啟了,而且不會(huì)退出),web服務(wù)器直接把內(nèi)容傳遞給這個(gè)進(jìn)程(進(jìn)程間通信,但fastcgi使用了別的方式,tcp方式通信),這個(gè)進(jìn)程收到請(qǐng)求后進(jìn)行處理,把結(jié)果返回給web服務(wù)器,最后自己接著等待下一個(gè)請(qǐng)求的到來,而不是退出。?
總結(jié)
以上是生活随笔為你收集整理的nginx常见面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql常见面试题
- 下一篇: php常见面试题