Nginx的面試題

1、什麼是 Nginx ?

Nginx ,是一個 Web 服務器和反向代理服務器,用於 HTTP、HTTPS、SMTP、POP3 和 IMAP 協議。

目前使用的最多的 Web 服務器或者代理服務器,像淘寶、新浪、網易、迅雷等都在使用。

Nginx 的主要功能如下:

作爲 http server (代替 Apache ,對 PHP 需要 FastCGI 處理器支持)

FastCGI:Nginx 本身不支持 PHP 等語言,但是它可以通過 FastCGI 來將請求扔給某些語言或框架處理。

反向代理服務器

實現負載均衡

虛擬主機

nginx版本號:nginx version: nginx/1.12.2

2、爲什麼要用Nginx?

優點:

  • 跨平臺、配置簡單
  • 非阻塞、高併發連接:處理2-3萬併發連接數,官方監測能支持5萬併發
  • 內存消耗小:開啓10個nginx才佔150M內存 成本低廉:開源
  • 內置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發送的請求就不會發送到宕機的服務器了。重新將請求提交到其他的節點上。
  • 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存
  • 穩定性高:宕機的概率非常小
  • master/worker結構:一個master進程,生成一個或者多個worker進程
  • 接收用戶請求是異步的:瀏覽器將請求發送到nginx服務器,它先將用戶請求全部接收下來,再一次性發送給後端web服務器,極大減輕了web服務器的壓力
  • 一邊接收web服務器的返回數據,一邊發送給瀏覽器客戶端
  • 網絡依賴性比較低,只要ping通就可以負載均衡
  • 可以有多臺nginx服務器
  • 事件驅動:通信機制採用epoll模型

3、Nginx是如何實現高併發的?

Nginx爲一羣服務器做代理,每次請求經過nginx轉發給不同的服務器;具體的由負載均衡的策略決定

在配置文件中,配置upStream 指向多個服務器並指定負載均衡的策略

在server中配置proxy_pass指向upStream

4、Nginx是如何處理http請求的?

Nginx使用反應器模式。主事件循環等待操作系統發出準備事件的信號,這樣數據就可以從套接字讀取,在該實例中讀取到緩衝區並進行處理。單個線程可以提供數萬個併發連接。

5、nginx和apache的區別

Apache模塊多,基本想到的都可以找到,更成熟,bug少,nginx的bug多。

nginx超穩定,是目前的主流,有豐富的特性,成熟的技術和開發社區。

6、nginx用過哪些模塊

  • ngx_http_gzip_module:壓縮模塊,對Nginx返回的數據壓縮,屬於性能優化模塊
  • ngx_http_fastcgi_module:FastCGI模塊,和 動態應用相關的模塊,例如PHP
  • ngx_http_proxy_module:Proxy代理模塊
  • ngx_http_upstream_module:負載均衡模塊,可以實現網站的負載均衡功能及節點的健康檢查
  • ngx_http_rewrite_module:URL地址重寫模塊
  • ngx_http_limit_conn_module:限制用戶併發連接數及請求數模塊
  • ngx_http_log_module:訪問日誌模塊,以指定的格式記錄Nginx客戶訪問日誌等信息
  • ngx_http_stub_status_module:記錄Nginx基本訪問狀態信息等模塊
  • ngx_http_referer_module模塊: 可以基於這個模塊做防盜鏈。Referer 是 HTTP 請求header 的一部分,當瀏覽器(或者模擬瀏覽器行爲)向web 服務器發送請求的時候,頭信息裏有包含 Referer 。比如我在www.google.com 裏有一個www.baidu.com 鏈接,那麼點擊這個www.baidu.com ,它的header 信息裏就有: Referer=http://www.google.com

7、Nginx調優方式:

  • 隱藏 Nginx 版本號
  • 隱藏 Nginx 版本號和軟件名
  • 更改 Nginx 服務的默認用戶
  • 優化 Nginx worker 進程數
  • 綁定 Nginx 進程到不同的 CPU 上
  • 優化 Nginx 處理事件模型
  • 優化 Nginx 單個進程允許的最大連接數
  • 優化 Nginx worker 進程最大打開文件數
  • 優化服務器域名的散列表大小
  • 開啓高效文件傳輸模式
  • 優化 Nginx 連接超時時間
  • 限制上傳文件的大小
  • FastCGI 相關參數調優
  • 配置 Nginx gzip 壓縮
  • 配置 Nginx expires 緩存
  • 優化 Nginx日誌(日誌切割)
  • 優化 Nginx 站點目錄
  • 配置 Nginx 防盜鏈
  • 配置 Nginx 錯誤頁面優雅顯示
  • 優化 Nginx 文件權限
  • Nginx 防爬蟲優化
  • 控制 Nginx 併發連接數
  • 集羣代理優化

8、 Nginx 常用命令?

啓動 /usr/local/nginx/sbin/nginx 。

停止 nginx -s stop 或 nginx -s quit 。

重載配置 /usr/local/nginx/sbin/nginx -s reload(平滑重啓) 或 service nginx reload 。

重載指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。

查看 nginx 版本 /usr/local/nginx/sbin/nginx -V。

檢查配置文件是否正確 nginx -t 。

顯示幫助信息 nginx -h 。

9、nginx日誌分析怎麼做的

我們公司使用ELK做nginx的日誌分析 主要分析nginx的access.log日誌

10、nginx如何設置防ddos攻擊

限制每秒請求數

限制IP連接數

白名單設置

ngx_http_limit_req_module模塊通過漏桶原理來限制單位時間內的請求數,一旦單位時間內請求數超過限制,就會返回503錯誤。

11、Nginx 常用配置?

worker_processes  8; # 工作進程個數
worker_connections  65535; # 每個工作進程能併發處理(發起)的最大連接數(包含所有連接數)
error_log         /data/logs/nginx/error.log; # 錯誤日誌打印地址
access_log      /data/logs/nginx/access.log; # 進入日誌打印地址
log_format  main  '$remote_addr"$request" ''$status $upstream_addr "$request_time"'; # 進入日誌格式

## 如果未使用 fastcgi 功能的,可以無視
fastcgi_connect_timeout=300; # 連接到後端 fastcgi 超時時間
fastcgi_send_timeout=300; # 向 fastcgi 請求超時時間(這個指定值已經完成兩次握手後向fastcgi傳送請求的超時時間)
fastcgi_rend_timeout=300; # 接收 fastcgi 應答超時時間,同理也是2次握手後
fastcgi_buffer_size=64k; # 讀取 fastcgi 應答第一部分需要多大緩衝區,該值表示使用1個64kb的緩衝區讀取應答第一部分(應答頭),可以設置爲fastcgi_buffers選項緩衝區大小
fastcgi_buffers 4 64k; # 指定本地需要多少和多大的緩衝區來緩衝fastcgi應答請求,假設一個php或java腳本所產生頁面大小爲256kb,那麼會爲其分配4個64kb的緩衝來緩存
fastcgi_cache TEST; # 開啓fastcgi緩存併爲其指定爲TEST名稱,降低cpu負載,防止502錯誤發生

listen       80; # 監聽端口
server_name  rrc.test.jiedaibao.com; # 允許域名
root  /data/release/rrc/web; # 項目根目錄
index  index.php index.html index.htm; # 訪問根文件

12、使用“反向代理服務器”的優點是什麼?

反向代理服務器可以隱藏源服務器的存在和特徵。它充當互聯網雲和 Web 服務器之間的中間層。這對於安全方面來說是很好的,特別是當我們使用 Web 託管服務時。

13、請解釋Nginx如何處理HTTP請求。

Nginx使用反應器模式。主事件循環等待操作系統發出準備事件的信號,這樣數據就可以從套接字讀取,在該實例中讀取到緩衝區並進行處理。單個線程可以提供數萬個併發連接。

14、請解釋Nginx服務器上的Master 和 Worker進程分別是什麼?

Master進程:讀取及評估配置和維持

Worker進程:處理請求

15、nginx 有哪幾種虛擬主機

基於IP 基於端口 基於域名

基於IP的虛擬主機:每個網站都需要一個IP。缺點是:需要多個IP,如果是公網IP每個IP都需要收費

基於端口的虛擬主機:只需要一個IP。缺點:端口號沒有辦法告訴公網用戶,無法適用於公網用戶,適合內部用戶使用。

基於域名的虛擬主機:最常用的就是基於域名的虛擬主機

16、請解釋是否有可能將Nginx的錯誤替換爲502錯誤、503?

502 =錯誤網關

503 =服務器超載

有可能,但是您可以確保fastcgi_intercept_errors被設置爲ON,並使用錯誤頁面指令。

17、502錯誤問題解決辦法?

Nginx 502錯誤情況1:

網站的訪問量大,而php-cgi的進程數偏少。

針對這種情況的502錯誤,只需增加php-cgi的進程數。具體就是修改/usr/local/php/etc/php-fpm.conf 文件,將其中的max_children值適當增加。這個數據要依據你的VPS或獨立服務器的配置進行設置。一般一個php-cgi進程佔20M內存,你可以自己計算下,適量增多。

/usr/local/php/sbin/php-fpm restart 然後重啓一下.

Nginx 502錯誤情況2:

CPU佔用率、內存佔用率非常高,遭到CC攻擊.

解決方法請參考:LinuxVPS簡單解決CC攻擊

Nginx 502錯誤情況3:

CPU佔用率不高,內存溢出。

檢查一下網站程序有沒有問題?一般小偷站點常常會出現內存溢出。

檢查一下/var/log/目錄下的日誌,看看是不是有人爆破SSH和FTP端口?

SSH、FTP遭到窮舉也會佔用大量內存。是的話改掉SSH端口和FTP端口即可

18、 nginx 500、304、499 是什麼問題導致的

500:

1.web腳本錯誤,如php語法錯誤,lua語法錯誤等。

2.訪問量大的時候,由於系統資源限制,而不能打開過多的文件

硬盤空間滿了:

使用 df -k 查看硬盤空間是否滿了。清理硬盤空間就可以解決500錯誤。Nginx	如果開啓了access log,在不需要的情況下,最好關閉access log。access log	會佔用大量硬盤空間。

分析思路:

查看nginx error log ,查看php error log

如果是腳本的問題,則需要修復腳本錯誤,並優化代碼

各種優化都做好,還是出現too many open files,那就要考慮做負載均衡, 把 流量分散到不同服務器上去了。

304:未修改(表示客戶機緩存的版本是最新的,客戶機應該繼續使用它。)

499:服務端處理時間過長,客戶端主動關閉了連接。

19、tomcat端口有哪些,都是什麼用途

答:80port:服務器連接器的端口號,該連接器將在指定端口偵聽來自客戶端的請求。

8005 port:指定一個端口,這個端口負責監聽關閉Tomcat的請求

20、請解釋ngx_http_upstream_module的作用是什麼?

ngx_http_upstream_module用於定義可通過fastcgi傳遞、proxy傳遞、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務器組。

21、請解釋什麼是C10K問題?

C10K問題是指無法同時處理大量客戶端(10,000)的網絡套接字。

22、解釋如何在Nginx中獲得當前的時間?

要獲得Nginx的當前時間,必須使用SSI模塊、dategmtdate_gmt和date_local的變量。

Proxy_set_header THE-TIME $date_gmt;

23、Nginx的負載均衡算法都有哪些

nginx 的 upstream目前支持 4 種方式的分配

0)、輪詢(默認)

每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。

1)、weight

指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。

2)、ip_hash

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。

3)、fair(第三方)

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

4)、url_hash(第三方)

根據url的hash結果分配

24、nginx 有什麼使用場景

我們公司使用nginx做負載均衡,反向代理,也做web服務器來使用;比如負載均衡,主要是用upstream模塊,nginx的代理功能是使用http proxy模塊做的。

25、 使用反向代理服務器的好處是什麼?

反向代理服務器可以隱藏源服務器的存在和特徵。它充當互聯網雲和web服務器之間的中間層。這對於安全方面來說是很好的,特別是當您使用web託管服務時

26、舉例nginx服務器的最佳用途?

Nginx服務器的最佳用法是在網絡上部署動態HTTP內容,使用SCGI、WSGI應用程序服務器、用於腳本的FastCGI處理程序。它還可以作爲負載均衡器。

27、 如何設置在81端口上運行nginx?

爲了通過一個不同的端口開啓Nginx,你必須進入/etc/Nginx/sites-enabled/,如果這是默認文件,那麼你必須打開名爲“default”的文件。編輯文件,並放置在你想要的端口:

28、反向代理配置

客戶端本來可以直接通過HTTP協議訪問某網站應用服務器,網站管理員可以在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,然後將結果返回給客戶端,此時Nginx就是反向代理服務器。

server {
  listen80;
  location / {
    proxy_pass http://192.168.20.1:8080; # 應用服務器HTTP地址
}

負載均衡配置

upstream myapp {
server192.168.20.1:8080; # 應用服務器1
server192.168.20.2:8080; # 應用服務器2
}
  server {
listen80;
location / {
    proxy_pass http://myapp;
}
}

虛擬主機配置

多個域名指向同一臺主機

server {
listen80default_server;
server_name _;
return444; # 過濾其他域名的請求,返回444狀態碼
}
    server {
listen80;
server_name www.aaa.com; # www.aaa.com域名
location / {
    proxy_pass http://localhost:8080; # 對應端口號8080
}
}
server {
listen80;
server_name www.bbb.com; # www.bbb.com域名
location / {
    proxy_pass http://localhost:8081; # 對應端口號8081
}
}

29、正向代理

一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器)

然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理

正向代理總結就一句話:代理端代理的是客戶端

30、反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求,發給內部網絡上的服務器

並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器

反向代理總結就一句話:代理端代理的是服務端

31、動態資源、靜態資源分離

動態資源、靜態資源分離是讓動態網站裏的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後

我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路

動態資源、靜態資源分離簡單的概括是:動態文件與靜態文件的分離

32、爲什麼要做動、靜分離?

在我們的軟件開發中,有些請求是需要後臺處理的(如:.jsp,.do等等),有些請求是不需要經過後臺處理的(如:css、html、jpg、js等等文件)

這些不需要經過後臺處理的文件稱爲靜態文件,否則動態文件。因此我們後臺處理忽略靜態文件。這會有人又說那我後臺忽略靜態文件不就完了嗎

當然這是可以的,但是這樣後臺的請求次數就明顯增多了。在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的策略去解決

動、靜分離將網站靜態資源(HTML,JavaScript,CSS,img等文件)與後臺應用分開部署,提高用戶訪問靜態代碼的速度,降低對後臺應用訪問

這裏我們將靜態資源放到nginx中,動態資源轉發到tomcat服務器中

33、nginx配合php工作Fastcgi原理

Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket(這個socket可以是文件socket,也可以是ip socket)。爲了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解爲用於啓動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據通過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。這就是Nginx+FastCGI的整個運作過程

34、負載均衡

負載均衡即是代理服務器將接收的請求均衡的分發到各服務器中

負載均衡主要解決網絡擁塞問題,提高服務器響應速度,服務就近提供,達到更好的訪問質量,減少後臺服務器大併發壓力

2、fastcgi 與 cgi 的區別?

1)cgi

web 服務器會根據請求的內容,然後會 fork 一個新進程來運行外部 c 程序(或 perl 腳本…), 這個進程會把處理完的數據返回給 web 服務器,最後 web 服務器把內容發送給用戶,剛纔 fork 的進程也隨之退出。

如果下次用戶還請求改動態腳本,那麼 web 服務器又再次 fork 一個新進程,週而復始的進行。

2)fastcgi

web 服務器收到一個請求時,他不會重新 fork 一個進程(因爲這個進程在 web 服務器啓動時就開啓了,而且不會退出),web 服務器直接把內容傳遞給這個進程(進程間通信,但 fastcgi 使用了別的方式,tcp 方式通信),這個進程收到請求後進行處理,把結果返回給 web 服務器,最後自己接着等待下一個請求的到來,而不是退出。

35、LVS 與 Nginx 區別

LVS:Linux 虛擬機、流量調度,負載均衡

單向的 End user -----> LVS -----> tomcat -----> end user

nginx:高性能代理服務器,系統內部流量分發,反向代理

有來回 End user -----> Ngnix -----> tomcat -----> Ngnix -----> end user

nginx 和 LVS 作對比的結果:

  1. nginx 工作在網絡的第 7 層,可以作爲網頁靜態服務器,支持 Rewrite 重寫規則;支持 GZIP 壓縮,節省帶寬;可以做緩存;可以針對 http 應用本身來做分流策略,靜態分離,針對域名、目錄結構等
    相比之下 LVS 並不具備這樣的功能,所以 nginx 單憑這點可以利用的場合就遠多於 LVS 了;但 nginx 有用的這些功能使其可調整度要高於 LVS,所以經常要去觸碰,人爲出現問題的機率也就大
  2. nginx 對網絡的依賴較小,理論上只要 ping 得通,網頁訪問正常,nginx 就能連得通,nginx 同時還能區分內外網,如果是同時擁有內外網的節點,就相當於單機擁有了備份線路;LVS 就比較依賴於網絡環境,目前來看服務器在同一網段內並且 LVS 使用 direct 方式分流,效果較能得到保證。另外注意,LVS 需要向託管商至少申請多於一個 ip 來做 visual ip
  3. nginx 安裝和配置比較簡單,測試起來也很方便,因爲它基本能把錯誤用日誌打印出來。LVS 的安裝和配置、測試就要花比較長的時間,因爲同上所述,LVS 對網絡依賴性比較大,很多時候不能配置成功都是因爲網絡問題而不是配置問題,出了問題要解決也相應的會麻煩的多
  4. nginx 也同樣能承受很高負載且穩定,但負載度和穩定度差 LVS 還有幾個等級:nginx 處理所有流量所以受限於機器 IO 和配置;本身的 bug 也還是難以避免的;nginx 沒有現成的雙機熱備方案,所以跑在單機上還是風險比較大,單機上的事情全都很難說
  5. nginx 可以檢測到服務器內部的故障(健康檢查),比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點。目前 LVS 中 ldirectd 也能支持針對服務器內部的情況來監控,但 LVS 的原理使其不能重發請求。比如用戶正在上傳一個文件,而處理該上傳的節點剛好在上傳過程中出現故障,nginx 會把上傳切到另一臺服務器重新處理,而 LVS 就直接斷掉了

36、haproxy和nginx有什麼區別?

Haproxy特點

  • 支持TCP與Http協議,工作在網絡4層和7層
  • 支持Session共享、Cookies引導
  • 支持通過URL健康檢測
  • 支持8種負載均衡策略
  • 支持心跳檢測

Nginx特點

  • 支持Http協議,工作在網絡7層
  • 支持通過端口健康檢測
  • 支持強大的正則匹配規則
  • 支持WebSocket協議
  • 支持Http Cache
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章