日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx基本原理介绍

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx基本原理介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

代理與反向代理

代理服務器的作用

反向代理服務器的作用

nginx的作用

nginx的工作過程

nginx的事件驅動機制

epoll庫

nginx的詳細配置


代理與反向代理

代理服務器是位于客戶端和原始服務器的一臺中間服務器,為了從原始服務器獲取到內容,客戶端向代理服務器發送一個請求并帶上目標服務器(原始服務器),代理服務器在接收到請求后就會將請求轉發給原始服務器,并將從原始服務器上獲取到的數據返回給客戶端,代理服務器是代理的客戶端,所以一般客戶端是知道代理服務器的存在的,比如翻墻就用了代理服務器。

反向代理服務器是位于原始服務器端的服務器,反向代理服務器接受來自互聯網的請求,然后將這些請求發送給內網的服務器,并將從內網的服務器獲取結果返回給互聯網上的客戶端,反向代理服務器是代理的服務端,所以客戶端是不知道反向代理服務器的存在的,服務端是知道反向代理服務器的。

代理服務器的作用

1. 訪問原來無法訪問的資源?
2. 用作緩存,加速訪問速度?
3. 對客戶端訪問授權,上網進行認證?
4. 代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息

反向代理服務器的作用

1. 保護內網安全?
2. 負載均衡?
3. 緩存,減少服務器的壓力?

nginx的作用

1.反向代理,將多臺服務器代理成一臺服務器

2.負載均衡,將多個請求均勻的分配到多臺服務器上,減輕每臺服務器的壓力,提高服務的吞吐量

3.動靜分離,nginx可以用作靜態文件的緩存服務器,提高訪問速度

nginx的工作過程

1.在nginx啟動后,會有一個master進程和多個worker進程,master進程主要用來管理worker進程,包括:接受信號,將信號分發給worker進程,監聽worker進程工作狀態,當worker進程退出時(非正常),啟動新的worker進程。基本的網絡事件會交給worker進程處理。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的?。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。?worker進程的個數是可以設置的,一般我們會設置與機器cpu核數一致,這里面的原因與nginx的進程模型以及事件處理模型是分不開的?。

2.當master接收到重新加載的信號會怎么處理(./nginx -s reload)?,master會重新加載配置文件,然后啟動新的進程,使用的新的worker進程來接受請求,并告訴老的worker進程他們可以退休了,老的worker進程將不會接受新的,老的worker進程處理完手中正在處理的請求就會退出。

3.worker進程是如何處理用戶的請求呢?首先master會根據配置文件生成一個監聽相應端口的socket,然后再faster出多個worker進程,這樣每個worker就可以接受從socket過來的消息(其實這個時候應該是每一個worker都有一個socket,只是這些socket監聽的地址是一樣的)。當一個連接過來的時候,每一個worker都能接收到通知,但是只有一個worker能和這個連接建立關系,其他的worker都會連接失敗,這就是所謂的驚群現在,為了解決這個問題,nginx提供一個共享鎖accept_mutex,有了這個共享鎖后,就會只有一個worker去接收這個連接。當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。

nginx的事件驅動機制

為什么幾個worker進程(每一個worker進程里面其實只有一個主線程)能同時接收上萬的請求呢?這是因為nginx事件處理機制是異步非阻塞的。nginx將一個請求劃分為多個階段來異步處理模塊,每個階段只是處理請求的一部分,如果請求的這一部分發生阻塞,nginx不會等待,它會處理其他的請求的某一部分。傳統web服務器的每個事件消費者獨占一個進程(線程)資源,這種情況對于用戶規模較小的情況來說,用戶響應速度快,但是當并發規模達到數十萬上百萬的時候,由于線程(進程)數目過多,會頻繁的切換,而且當線程阻塞的時候會進行睡眠,也會造成資源的浪費,這樣服務器就會產生瓶頸.

? ? nginx服務器采用的事件驅動機制不同,他不會為每個消費事件創建一個進程或線程,這樣就不會產生由于進程間頻繁切換占用cpu而產生的瓶頸,而且nginx不會讓事件阻塞,即采用無阻塞事件驅動模型,這樣就不會因為事件阻塞使進程睡眠而造成的資源浪費.

? ? ?nginx將一個請求劃分成多個階段異步處理,每個階段僅僅完成一個請求中的一部分,當本階段任務完成后進入下一階段.等待事件發生不是阻塞的等待,等待事件發生時候內。

事件發生源產生事件->事件收集器來收集分發事件(選擇自己感興趣的)->消費事件.

epoll庫

? ? epoll庫是Nginx服務器支持的高性能事件驅動庫之一。它是公認的最好的事件驅動模型。和poll庫及select庫有很大的區別。

? ? poll和select都是創建一個待處理事件列表,然后把這個列表發給內核,返回的時候,再去輪詢檢查這個列表。以判斷這個事件是否發生。在描述符太多的情況下,就會明顯效率低下了。

? ? epoll是這么做的,它把事件描述符列表的管理交給內核復制。一旦有某個事件發生,內核將發生事件的事件描述符交給Nginx的進程,而不是將整個事件描述符列表交給進程,讓進程去輪詢具體是哪個描述符。epoll()避免了輪詢整個事件描述符列表。所以顯得更高效。

? ? epoll庫的基本步驟:

? ? 首先:epoll庫通過相關調用通知內核創建一個有N個描述符的事件列表。然后給這個事件列表設置自己關心的事件。并把它添加到內核中。在具體的代碼中還可以實現對相關調用的事件描述符列表進行修改和刪除。

? ? 之后,一旦設置完成就一直等待內核通知事件發生了,某一事件發生后,內核就將發生事件的描述符給epoll庫,epoll庫去處理事件。

nginx的詳細配置

1、全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。

2、events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。

3、http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。

4、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。

5、location塊:配置請求的路由,以及各種頁面的處理情況

########### 每個指令必須有分號結束。################# #user administrator administrators; #配置用戶或者組,默認為nobody nobody。 #worker_processes 2; #允許生成的進程數,默認為1 #pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址 error_log log/error.log debug; #制定日志路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg events {accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為onmulti_accept on; #設置一個進程是否同時接受多個網絡連接,默認為off#use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections 1024; #最大連接數,默認為512 } http {include mime.types; #文件擴展名與文件類型映射表default_type application/octet-stream; #默認文件類型,默認為text/plain#access_log off; #取消服務日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式access_log log/access.log myFormat; #combined為日志格式的默認值sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大于設定的值,默認為0,即不設上限。keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。upstream mysvr { server 127.0.0.1:7878;server 192.168.10.121:3333 backup; #熱備}error_page 404 https://www.baidu.com; #錯誤頁server {keepalive_requests 120; #單連接請求上限次數。listen 4545; #監聽端口server_name 127.0.0.1; #監聽地址 location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。#root path; #根目錄#index vv.txt; #設置默認頁proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表deny 127.0.0.1; #拒絕的ipallow 172.18.5.54; #允許的ip } } }

上面是nginx的基本配置,需要注意的有以下幾點:

1、1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;?2.$remote_user :用來記錄客戶端用戶名稱;?3.$time_local : 用來記錄訪問時間與時區;4.$request : 用來記錄請求的url與http協議;

? 5.$status : 用來記錄請求狀態;成功是200,?6.$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;7.$http_referer :用來記錄從那個頁面鏈接訪問過來的;?8.$http_user_agent :記錄客戶端瀏覽器的相關信息;

2、驚群現象:一個網路連接到來,多個睡眠的進程被同事叫醒,但只有一個進程能獲得鏈接,這樣會影響系統性能。

3、每個指令必須有分號結束。

nginx的介紹基本到這就結束了,這篇博文呢基本不是自己寫的,我只是將一些好的博客里面的重點部分給組織了一下,后面會開始學習分布式dubbo和zookerper。下面的幾個幾個鏈接都是我參考的博客

1.最好的nginx介紹文章:https://www.cnblogs.com/mfc-itblog/p/5176792.html

2.最好的nginx配置文件介紹文章:https://www.cnblogs.com/knowledgesea/p/5175711.html? ?

總結

以上是生活随笔為你收集整理的nginx基本原理介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。