反向代理Nginx

来源:https://www.cnblogs.com/lene-y/archive/2019/06/26/11089450.html
-Advertisement-
Play Games

引用:https://baijiahao.baidu.com/s?id=1600687025749463237&wfr=spider&for=pc 參考下圖,正向代理用途:Client無法直接訪問Server,比如谷歌翻牆,於是請求發送給代理,代理可以訪問Server並將其返回信息返回給Client ...


引用:https://baijiahao.baidu.com/s?id=1600687025749463237&wfr=spider&for=pc

參考下圖,正向代理用途:Client無法直接訪問Server,比如谷歌FQ,於是請求發送給代理,代理可以訪問Server並將其返回信息返回給Client。

反向代理用途:1.把Server的IP功能變數名稱隱藏起來不直接暴露,Proxy充當跳板機/前置機的功能;2.對於大量的客戶端併發請求,進行分發給各個伺服器,實現負載均衡。

反向代理TCP/UDP負載均衡配置和選擇:編輯nginx.conf文件

#進程數,一般一個進程就夠了
worker_processes  1;  
 
events {  
    #單個進程最大連接數(最大連接數=連接數*進程數)
    worker_connections  1024;  
}  

#TCP/UDP套接字固定字元串:stream
stream {
    #反向代理URL管理
    upstream myproxy {
        #源地址哈希法,就是對訪問客戶端的IP進行hash後的結果進行分配,這樣每一個客戶端固定請求同一個後端伺服器。
        #ip_hash;    
        
        #按照伺服器響應時間的長短來進行分發的,伺服器響應時間越短的,優先分發。
        #fair

     #正常分發 server
192.168.3.22:13333; server 192.168.3.22:13334; #權重,權重越大,連接數量越多,壓力越大。 #server 11.22.333.44:5555 weight=2; #server 11.22.333.11:6666 weight=1; #表示當前的server臨時不參與負載。 #server 11.22.333.22:8888 down; #其他全部的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。 #server 11.22.333.33:8888 backup; } server { #region 統一監聽埠 listen 13335; #連接超時時間 proxy_connect_timeout 3s; #N秒內伺服器沒有接收到數據自動斷開與客戶端的連接,如不想要此功能則註釋該行 #proxy_timeout 10s; #反向代理URL proxy_pass myproxy; } }

 

打開cmd,輸入nginx -c nginx.conf,回車執行。

註意如果要關閉nginx,關了控制台是沒用的,需要另外打開一個cmd視窗輸入nginx -s quit,回車執行。

一般只修改配置文件,不需要重啟或關閉nginx,執行 nginx -s reload 重新載入配置文件即可。

 

深入Nginx

附上原文鏈接:https://blog.csdn.net/wy757510722/article/details/75267431

 

nginx是以多進程的方式來工作的,當然nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式,也是nginx的預設方式:

1.nginx、redis等每個單獨的進程都可以獨占資源,通常情況下每個伺服器會開幾十個nginx、redis進程,這樣如果採用多線程的模式,各個線程能夠利用的資源就會受到一些限制,諸如:ulimit -n 命令展示的每個進程最多可以打開的文件數這樣的限制。

2.nginx中除了master需要跟worker通過管道進行通信,worker之間不需要通信,而且每個worker的功能都一樣,屬於常駐進程。在這種場景下多線程的優勢體現不出來,而且也可以避免多線程在編程時需要考慮資源訪問互斥、同步等問題帶來的編程複雜度的提升,以及可能帶來的調試困難。(這裡的同步、互斥並非指線程間消息傳遞等操作)

3.nginx採用多進程的方式,既可以避免因某個線程故障導致整個服務不可用的問題,也可以實現配置熱載入,不停服升級版本。

 

多進程工作模式

1. nginx在啟動後,會有一個master進程和多個worker進程。master進程主要用來管理worker進程,包含:接收來自外界的信號(重新載入配置文件,重啟nginx命令等),向各worker進程發送信號,監控 worker進程的運行狀態,當worker進程異常情況下退出後,會自動重新啟動新的worker進程。而基本的網路事件,則是放在worker進程中來處理了 。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的 。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。 worker進程的個數是可以設置的,一般我們會設置與機器cpu核數一致,這裡面的原因與nginx的進程模型以及事件處理模型是分不開的 。

2.Master接收到信號以後怎樣進行處理(./nginx -s reload )?首先master進程在接到信號後,會先重新載入配置文件,然後再啟動新的進程,並向所有老的進程發送信號,告訴他們可以光榮退休了。新的進程在啟動後,就開始接收新的請求,而老的進程在收到來自 master的信號後,就不再接收新的請求,並且在當前進程中的所有未處理完的請求處理完成後,再退出

3. worker進程又是如何處理請求的呢?我們前面有提到,worker進程之間是平等的,每個進程,處理請求的機會也是一樣的。當我們提供80埠的http服務時,一個連接請求過來,每個進程都有可能處理這個連接,怎麼做到的呢?首先,每個worker進程都是從master 進程fork(分配)過來,在master進程裡面,先建立好需要listen的socket之後,然後再fork出多個worker進程,這樣每個worker進程都可以去accept這個socket(當然不是同一個socket,只是每個進程的這個socket會監控在同一個ip地址與埠,這個在網路協議裡面是允許的)。一般來說,當一個連接進來後,所有在accept在這個socket上面的進程,都會收到通知,而只有一個進程可以accept這個連接,其它的則accept失敗,這是所謂的驚群現象。當然,nginx也不會視而不見,所以nginx提供了一個accept_mutex這個東西,從名字上,我們可以看這是一個加在accept上的一把共用鎖。有了這把鎖之後,同一時刻,就只會有一個進程在accpet連接,這樣就不會有驚群問題了。accept_mutex是一個可控選項,我們可以顯示地關掉,預設是打開的。當一個worker進程在accept這個連接之後,就開始讀取請求,解析請求,處理請求,產生數據後,再返回給客戶端,最後才斷開連接,這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理

4.nginx採用這種進程模型有什麼好處呢?採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,master進程則很快重新啟動新的worker進程。當然,worker進程的異常退出,肯定是程式有bug了,異常退出,會導致當前worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

5.有人可能要問了,nginx採用多worker的方式來處理請求,每個worker裡面只有一個主線程,那能夠處理的併發數很有限啊,多少個worker就能處理多少個併發,何來高併發呢?非也,這就是nginx的高明之處,nginx採用了非同步非阻塞的方式來處理請求,也就是說,nginx是可以同時處理成千上萬個請求的 。對於IIS伺服器每個請求會獨占一個工作線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰,線程帶來的記憶體占用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不去了,而這些開銷完全是沒有意義的。我們之前說過,推薦設置worker的個數為cpu的核數,在這裡就很容易理解了,更多的worker數,只會導致進程來競爭cpu資源了,從而帶來不必要的上下文切換。而且,nginx為了更好的利用多核特性,提供了cpu親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因為進程的切換帶來cache的失效。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:憂郁巫師 https://dwz.cn/A1FOjLXk 1. sl 命令 你會看到一輛火車從屏幕右邊開往左邊…… 安裝 運行 命令有 -a l F e 幾個選項, 可以給別人來個惡作劇,他一敲ls,不知道的肯定很有效果 $alias ls=sl 2. fortune 命令 輸出一句話,有笑話 ...
  • 1、簡要說明 2018年十月 Redis 發佈了穩定版本的 5.0 版本,推出了各種新特性,其中一點是放棄 Ruby的集群方式,改為 使用 C語言編寫的 redis-cli的方式,是集群的構建方式複雜度大大降低。關於集群的更新可以在 Redis5 的版本說明中看到,如下: 可以查看Redis官網查看 ...
  • MySQL資料庫使用時註意事項 建表的角度上 在使用sql語句的時候 合理創建和時候用索引 ...
  • MySQL多表查詢 建表與數據準備 多表連接查詢 1 交叉連接:不適用任何匹配條件。生成笛卡爾積 2 內連接:只連接匹配的行 3 外鏈接之左連接:優先顯示左表全部記錄 4 外鏈接之右連接:優先顯示右表全部記錄 5 全外連接:顯示左右兩個表全部記錄 符合條件連接查詢 子查詢 2 帶比較運算符的子查詢 ...
  • read by other session簡介 官方關於read by other session的介紹如下: When information is requested from the database, Oracle will first read the data from disk int... ...
  • 函數調用:select 函數名(實參列表) 【from 表】; 函數分類: 1、單行函數 如 concat、length、ifnull等。 2、分組函數 功能:做統計使用,又稱為統計函數、聚合函數、組函數。 常見函數: 一、單行函數 字元函數: 數學函數: 日期函數: 其他函數: 控制函數: 一、字 ...
  • 今天遇到一個資料庫的問題: 系統資料庫用戶下創建了幾個視圖用於外部系統開發報表使用,當外部系統提取視圖數據時,需要通過一個只能訪問需要視圖許可權的用戶,於是想到給他創建一個新的用戶,並給這個用戶分配只能訪問這幾個視圖的許可權。 DBA_SYS_PRIVS描述授予用戶和角色的系統許可權。 查看用戶系統許可權: ...
  • 欄位名的別名用“”括起來,如:last_name as “姓名”。去除重覆:在投影的欄位名前加上 distinct 就可以了。比如:select distinct em.last_name "姓名" from employees em;日期格式的查詢語句:‘00-0月-00’ 分別對應的是日、月、年... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...