理解Nginx的server匹配規則

2019年6月27日 沒有評論

鸿运彩票app www.chqvd.icu Nginx在邏輯上將提供不同內容的配置劃分為塊,這些塊以層次結構的形式存在(http->server->location)??突Ф朔⒊鑾肭笫?,Nginx收到之后,會有一個確定應該使用哪些配置塊來處理請求的過程。本文主要介紹 server 塊背后的處理過程。

server塊是Nginx配置的子集,它定義用于處理已定義類型請求的虛擬服務器(虛擬機)。管理員通?;崤渲枚喔鰏erver塊,并根據請求的域名,端口和IP地址決定哪個塊應該處理哪個連接。

解析“listen”指令以找到可能的匹配

首先,Nginx查看請求的IP地址和端口,并與每個服務器的 listen 指令相匹配,構建可能解析請求的服務器塊列表。

listen指令通常定義 server 塊將響應的IP地址和端口。默認情況下,任何不包含listen指令的 server 塊默認 listen 在0.0.0.0:80(或者0.0.0.0:8080如果Nginx由普通的非root用戶運行),這樣的配置塊響應80端口上任何接口的請求,但是這個默認值在server選擇過程中沒有太大的權重。

listen指令可以設置為:

  • IP地址/端口組合。
  • 只有IP地址,它將監聽默認端口80。
  • 只有端口,它將監聽該端口上的每個接口。
  • Unix套接字的路徑。

最后的選項通常在不同的服務器之間傳遞請求時起到作用。

在嘗試確定向哪個服務器塊發送請求時,Nginx將首先嘗試listen使用以下規則根據指令的特異性來決定:

  • Nginx用默認的缺省值來替換所有不完整的lesten指令(完整:IP+port的組合)的缺省值,因此每一個server塊的listen指令都可以看作是IP地址和端口的組合。 這種轉換的例子有:
    • 沒有listen指令的塊使用該值0.0.0.0:80。
    • 設置為111.111.111.111沒有端口的IP地址的塊變為111.111.111.111:80
    • 設置為8888沒有IP地址的端口的塊變為0.0.0.0:8888
  • 接下來Nginx會嘗試去收集一個server塊的列表,這個列表是基于具體的IP和端口最佳匹配。也就是說如果匹配的server塊有具體的IP地址,它就不會匹配用0.0.0.0作為默認的IP地址的server塊。無論什么情況,在Nginx選擇server塊的過程中,端口必須準確匹配。
  • 如果只有一個最具體的匹配,那么該server塊將用于提供請求。如果有多個server 塊具有相同層次的具體匹配,那么Nginx需繼續評估server_name指令 。

需要特別注意的是,只有 listen 指令在同一層次上有多個匹配的 server 塊時,Nginx才會繼續評估server_name指令。舉個例子,如果域名example.com被解析到IP為192.168.1.10,端口為80的主機上,當客戶端請求example.com時,在本例中,第一個server??樽蓯腔崽峁┓?,盡管server_name指令在第二個server??櫓?。

1
2
3
4
server{
listen 192.168.1.10;
....
}
1
2
3
4
5
server{
listen 80;
server_name example.com;
....
}

多個server??樵誥嚀宓鈉ヅ渲寫τ諭患侗鸕那榭魷?,Nginx下一步才會檢查server_name指令。

解析server_name指令選擇一個匹配

接下來,為了進一步評估具有相同特定listen指令的請求,Nginx會檢查請求的“host”標頭,此值包含客戶端實際嘗試訪問的域或IP地址。

Nginx在候選的每一個server??櫓?,查看其server_name指令,嘗試去找到最佳的匹配。Nginx通過下面的公式來進行評估:

  • Nginx首先找到server_name與請求的Host頭信息精準匹配的server???,如果找到了這個server???它將會被用于服務客戶端的請求。若有多個特定的匹配項被找到,第一個會被用于提供服務。
  • 如果沒有找到精準的匹配項,Nginx接下來將嘗試去找server_name與前置通配符(在配置中名稱的開頭用*表示)匹配的server???。只要找到一個,這個server??榻揮糜諼突Ф頌峁┓?。如果找到了多個匹配,最長匹配結果的server??榻岜揮糜諤峁┓?。
  • 如果使用前置通配符沒有找到匹配時,Nginx接下來將嘗試去找server_name與后置通配符(在配置中名稱的結尾用*表示)匹配的server???。只要找到一個,這個server??榻揮糜諼突Ф頌峁┓?。如果找到了多個匹配,最長匹配結果的server??榻岜揮糜諤峁┓?。
  • 如果使用后置通配符沒有找到匹配時,Nginx接下來將會評估用正則表達式(在名稱前用~表示)定義server_name的server???。帶有與Host頭匹配的正則表達式的第一個server_name將被用于提供服務。
  • 如果沒有找到用正則表達式定義server_name的相匹配的server??槭?,Nginx接下來會使用默認IP和端口的server???。

每一個IP地址/端口組合都有一個默認的server???,當用上面的方法不能確定一個操作的過程時將使用默認的server???。對于IP地址/端口的組合來說,這將是配置中的第一個??榛蛘呤前?code>default_server選項作為listen指令的一部分的server??椋ㄕ飩蔥磃irst-found算法)。每一個IP地址/端口組合只能有一個default_server聲明。

實例

如果已定義的server_name與Host頭的值精準匹配時,這個server??榻謊≡窶創砬肭?。

在這個例子中,如果請求的Host頭的值被設置為 host1.example.com,第二個server??榻謊≈校?/p>

1
2
3
4
5
server{
listen 80;
server_name *.example.com;
...
}
1
2
3
4
5
server{
listen 80;
server_name host1.example.com;
...
}

如果精準的匹配沒有被找到時,Nginx將會檢查是否有一個具有適合前置通配符的server_name。以通配符開始的最長的server_name的server??榻岜謊≡窶賜瓿上煊?。

在這個例子中,如果請求的Host頭是 www.example.org,第二個server??榻謊≈校?/p>

1
2
3
4
5
server{
listen 80;
server_name www.example.*;
...
}
1
2
3
4
5
server{
listen 80;
server_name *.example.org;
...
}
1
2
3
4
server{
listen 80;
server_name *.org;
}

server_name以通配符開始的??槊揮姓業?Nginx將查看在表達式后面有通配符的匹配項是否存在。此時,以通配符結尾的最長的匹配項將被用于服務客戶端的請求。

在這個例子中,如果請求的Host頭被設置為 www.example.com,第三個??榻謊≈校?/p>

1
2
3
4
5
server{
listen 80;
server_name host1.example.com;
...
}
1
2
3
4
server{
listen 80;
server_name example.com;
}
1
2
3
4
server{
listen 80;
server_name www.example.*;
}

如果通配符匹配項沒有找到,Nginx將會去匹配用了正則表達式的server_name。第一個匹配上的server??榻岜謊≈欣聰煊η肭?。

在這個例子中,如果請求的Host頭設置為 www.example.com,那么第二個server??榻謊≈欣賜瓿上煊?。

1
2
3
4
5
server{
listen 80;
server_name example.com;
...
}
1
2
3
4
5
server{
listen 80;
server_name ~^(www|host1).*\.example\.com$;
...
}
1
2
3
4
5
server{
listen 80;
server_name ~^(subdomain|set|www|host1).*\.example\.com$;
...
}

如果上述步驟都不能滿足請求,則該請求將被傳遞到默認的server??橐曰袢∑ヅ淶腎P地址和端口。

分類: 未分類 標簽:

如何使用nginx配置負載均衡

2019年6月14日 1 條評論

負載均衡是擴展應用程序并提高其性能和冗余的絕佳方法。Nginx是一種流行的Web服務器軟件,可以配置為簡單但功能強大的負載均衡器,以提高服務器資源的可用性和效率。在負載平衡配置中,nginx充當在多個單獨服務器上工作的分布式Web應用程序的單個入口點。

在Web場上進行負載平衡

本文介紹如何使用nginx為云服務器配置負載均衡。作為先決條件,您需要至少安裝兩臺主機并安裝Web服務器軟件,以便了解負載均衡器的優勢。

安裝nginx

目前,最新版本的CentOS,Debian和Ubuntu都提供nginx軟件包,可以使用命令快速安裝nginx。

安裝完成后,進入nginx主配置文件夾。

根據您的操作系統不同,Web服務器配置文件將位于兩個位置之一。

Ubuntu和Debian遵循在 /etc/nginx/sites-available/, 中存儲虛擬主機文件的規則,這些規則 通過符號鏈接啟用到 /etc/nginx/sites-enabled/。您可以使用以下命令啟用任何新的虛擬主機文件。

CentOS用戶可以在/etc/nginx/conf.d/下找到其主機配置文件,加載了任何.conf類型的虛擬主機文件。

檢查您是否可以找到至少默認配置,然后重新啟動nginx。

通過在Web瀏覽器中打開負載均衡器服務器的IP地址來測試服務器是否回復HTTP請求。當您看到nginx的默認歡迎頁面時,安裝成功。

Nginx默認歡迎頁面。

如果您在加載頁面時遇到問題,請檢查防火墻是否阻止了您的連接。例如,在CentOS 7上,默認防火墻規則不允許HTTP流量,請使用以下命令啟用它。

然后嘗試重新加載瀏覽器。

將nginx配置為負載均衡器

安裝并測試nginx后,您可以開始配置它以實現負載平衡。從本質上講,您需要做的就是設置nginx,其中包含要監聽的連接類型以及重定向位置的說明。要實現此目的,請使用您喜歡的任何文本編輯器創建新的配置文件,例如使用vi

load-balancer.conf中,您需要定義以下兩個段:上游服務器,請參閱下面的示例。

然后保存文件并退出編輯器。

接下來,您需要禁用先前在安裝后測試的默認服務器配置。同樣取決于您的操作系統,這部分略有不同。

在Debian和Ubuntu系統上,您需要從啟用站點的文件夾中刪除默認符號鏈接。

CentOS的主機不使用相同的鏈接,而是簡單地將重命名default.confconf.d /目錄下的東西,不是結束的.conf,例如:

然后使用以下命令重新啟動nginx。

檢查nginx是否成功啟動。如果重新啟動失敗,請查看剛剛創建的  /etc/nginx/conf.d/load-balancer.conf,以確保沒有錯誤類型或缺少分號。

在Web瀏覽器中輸入負載均衡器的公共IP地址時,您現在應該被傳遞到其中一個后端服務器。

負載均衡方法

如果沒有定義其他方法,默認情況下使用nginx進行負載均衡會使用循環算法,如上面的第一個示例所示。使用循環方案,將根據您在load-balancer.conf  文件中設置的順序輪流選擇每個服務器。這平衡了短期操作的請求數量。

基于最少連接的負載平衡是另一種簡單的方法。顧名思義,此方法將請求定向到當時具有最少活動連接的服務器。對于請求有時可能需要更長時間才能完成的應用程序,它比循環法更有效。

要啟用最少連接平衡方法,請將參數least_conn添加到上游  部分,如下例所示。

雖然循環和最少連接平衡方案是公平的并且有其用途,但是它們不能提供會話持久性。如果您的Web應用程序要求用戶隨后被定向到與之前連接相同的后端服務器,則應使用IP哈希方法。IP哈希使用訪問者IP地址作為密鑰來確定應選擇哪個主機來為請求提供服務。這允許訪問者每次被定向到同一服務器,被授予服務器可用且訪問者的IP地址未被更改。

要使用此方法,請將ip_hash 添加到上游  段,如下面的示例所示。

在不同主機之間的可用資源不相等的服務器設置中,可能希望某些服務器優先于其他服務器。定義服務器權重允許您使用nginx進一步微調負載平衡。負載均衡器中權重最高的服務器最常選擇。

例如,在上面顯示的配置中,第一個服務器的選擇頻率是第二個服務器的兩倍,與第三個服務器相比,它再次獲得兩倍的請求。

啟用HTTPS的負載均衡

為您的網站啟用HTTPS是?;し夢收嘸捌涫蕕暮梅椒?。如果您尚未在網絡主機上實施加密,我們強烈建議您查看我們的指南,了解如何在nginx上安裝Let's Encrypt。

在負載均衡器中使用加密比您想象的要容易。您需要做的就是在負載均衡器配置文件中添加另一個服務器部分,該文件使用SSL偵聽端口443上的HTTPS流量,并為上游段設置proxy_pass,就像上一個示例中的HTTP一樣。

再次打開配置文件進行編輯。

然后將以下服務器段添加到文件末尾。

然后保存文件,退出編輯器并再次重新啟動nginx。

健康檢查

為了知道哪些服務器可用,nginx的反向代理實現包括被動服務器健康檢查。如果服務器無法響應請求或回復錯誤,nginx將注意服務器已失敗,并將嘗試避免一段時間轉發到該服務器的連接。

通過將參數max_fails設置為服務器行,可以在負載均衡器配置文件中定義特定時間段內連續不成功的連接嘗試次數。默認情況下,如果未指定max_fails,則將此值設置為1.(可?。┙?em>max_fails設置為0將禁用對該服務器的運行狀況檢查。

如果將max_fails設置為大于1的值,則后續失敗必須在特定時間范圍內發生,以便無法計數。此時間范圍由參數fail_timeout指定,該參數還定義服務器應被視為失敗的時間。默認情況下,fail_timeout設置為10秒。

在服務器標記失敗并且fail_timeout設置的時間已過后,nginx將開始使用客戶端請求正常探測服務器。如果探測返回成功,則服務器再次標記為實時并且正常包含在負載平衡中。

使用運行狀況檢查可以根據需要通過啟動或關閉主機來使服務器后端適應當前需求。在高流量期間啟動其他服務器可以在新資源自動供負載均衡器使用時輕松提高應用程序性能。

結論

如果您希望提高Web應用程序的性能和可用性,那么設置負載均衡器絕對值得考慮。使用nginx進行負載均衡功能強大且設置相對簡單,并且與簡單的加密解決方案(例如Let's Encrypt客戶端)一起使用,它為您的Web場提供了一個很好的前端。

雖然使用多個主機可以?;つ腤eb服務具有冗余,但負載均衡器本身仍然可以留下單點故障。您可以通過在多個負載平衡器之間設置浮動IP來進一步提高高可用性。

分類: 未分類 標簽:

推薦一個微信公眾號

2019年6月8日 沒有評論

程序員翻身

作者簡介:程序員翻身,一個彪悍的程序員。曾在某大廠做過碼農,后轉型做產品。選擇有時比努力重要,永遠保持學習的熱情,與你共成長?;隊蠹矣胛夜創?,解答你的職業晉升困惑,記錄你我的故事。

分類: 未分類 標簽:

Markdown快速人門

2019年6月5日 沒有評論

標題:使用#后面加題目標識標題:

#標題
##主要標題
###小標題
####第4級副標題

重點:

粗體:__string__或者**string**,斜體:_string_或者*string*,刪除線:~~string~~

縮進引用:使用大于號(>)然后使用空格,然后鍵入文本。

無序列表: 使用橫線(-)然后使用空格,然后鍵入文本。

編號列表: 使用數字(1. )然后使用空格,然后鍵入文本。

表格:

| Heading | Heading |
| ----| ----|
| text| text |
| text| text |

圖片:![Alt text](url/filename.gif "Title text")

水平線:使用三個星號:***

外部鏈接:[link text](//url)

分類: 未分類 標簽:

如何讓別人發現自己的才能

2019年5月18日 1 條評論

再小的個體也有品牌,尤其是在網紅經濟下的今天,高曝光意味著高收入,在那些躺著掙錢的大V帶動下,很多搞技術的人也開始希望自己能被更多人認知認可,提高知名度的同時能交一些朋友,互相學習提高技術水平,朋友多了路好走。

可選擇的路子很多,比如常見的:

  • 寫博客,現在堅持的人不多,搜索引擎被csdn、jianshu等網站霸屏
  • 寫公眾號,新注冊的號沒有留言功能,少了溝通手段
  • 寫微博...

選擇哪一條路或者同時都選,記錄感受、寫些總結的東西是我們自然而然的選擇。我覺得比較最簡單的路子是專注于某一個技術,寫出一些列的文章,從基礎功能、高級功能、進階優化形成一個體系比較好,比東一下西一下會更容易堅持下去,而且容易吸引到鐵粉支持,還能為自己的履歷增加一個亮點。

如果不知道寫什么好呢?可以借助百度搜索指數或者微信指數來輔助選出自己擅長同時又比較熱門的方向,搜索指數高意味著關注的人多,容易找到人互相交流。

百度上更多人redis相關的主題
微信上關注spring主題的更多

我有兩個主題在寫,如果有感興趣的可以一起寫。

  • nginx主題:鸿运彩票app www.chqvd.icu
  • redis主題:www.redis.com.cn

無論選擇什么主題,最好提前寫好提綱或者更新頻率計劃,這樣才能長久的堅持下來。寫任何主題都有江郎才盡的時候,從微信公眾號就可以看出來,大V們動不動就讓大家投票、分享,讓你花錢入群講故事,最后拿著你的故事去吸引新人入群,這種套路就如同淘金路上賣水的,你想著入群去找金子,其實人家是把水賣給了你,可發財的總是賣水。

最后,如果你不能合理規劃時間,本著滿足自己興趣和理想的信念,大把時間投在這上面,我還是勸你先去賺錢,把工作做好,有了錢才能更好的談興趣。畢竟那些微博、微信大號明星是少數,多少懷揣著明星夢的人,最后只是為別人做嫁衣。

ps:品牌很重要,如果你沒想好自己的品牌(合適的網名)前,建議不要開始寫。不要像我一樣沒有品牌?;隊蠹夜刈⑽業墓諍牛撼絳蛟狽?,大家可以發消息給我交流,我有時間都會回復。

分類: 未分類 標簽:

linux安裝boost庫

2019年4月23日 沒有評論

安裝前準備

yum -y install gcc gcc-c++ python python-devel libicu libicu-devel zlib zlib-devel bzip2 bzip2-devel

編譯boost

wget https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.tar.gz
tar zxvf boost_1_64_0.tar.gz
cd boost_1_64_0.tar.gz
./bootstrap.sh --with-libraries=all --with-toolset=gcc
##--with-libraries指定編譯哪些boost庫,all的話就是全部編譯,只想編譯部分庫的話就把庫的名稱寫上,之間用 , 號分隔即可,可指定的庫下面介紹。--with-toolset指定編譯時使用哪種編譯器,Linux下使用gcc即可,如果系統中安裝了多個版本的gcc,在這里可以指定gcc的版本,比如--with-toolset=gcc-4.4
./b2

安裝boost

./b2 install 

設置環境變量

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
分類: 未分類 標簽:

批處理獲取昨天日期

2019年2月22日 2 條評論

系統的數據按日期寫成文件,每天需要處理前一天的文件。ps已經有獲取昨天日期的功能,但是bat腳本沒有這個功能,網上想要實現這個功能,需要調用腳本獲取數據之類的方法。

通過分析我們可以使用變通的方法使用純批處理程序獲取到昨天的日期對應的文件?;袢∽钚碌奈募創砬耙惶斕奈募?。

分類: 未分類 標簽:

mac下nginx開啟80端口

2019年2月9日 沒有評論

mac系統不允許用戶進程使用1024以下端口,配置文件寫了80端口也不會生效。

把這個/usr/local/opt/nginx/homebrew.mxcl.nginx.plist文件復制到?/Library/LaunchDaemons?下, 接著執行launchctl load -w,如下:

sudo cp /usr/local/opt/nginx/*.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

重啟系統后nginx可以使用80端口了。

分類: 未分類 標簽:

mac自帶的php-fpm頁面空白以及錯誤日至輸出

2019年2月8日 沒有評論

配置好nginx、php-fpm之后,訪問html頁面正常,訪問php后臺顯示空白頁面。

起初懷疑php-fpm問題,關閉php-fpm后在訪問報gateway錯誤,說明php-fpm是正常的。

重新檢查nginx的配置,發現少了一句。fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

server {
        listen 8081;
        server_name localhost;
        root /Users/chenhe/Project/cx/;

        error_log  logs/error.log;

        index index.php index.html;


        location ~ \.php$ {
            include        fastcgi.conf;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        error_page 404 /404.html;
}

添加后重啟nginx恢復正常。

運行之后發現php-fpm不輸出php錯誤日志。

1. 修改 php-fpm.conf 文件,添加(或修改)如下配置:

catch_workers_output = yes

2. 修改 php.ini 文件,添加(或修改)如下配置:

  log_errors = On
  error_log = /usr/local/etc/php/5.4/php_errors.log
  error_reporting=E_ALL&~E_NOTICE

3. 重啟 php-fpm

還是不輸出日志,期間嘗試很多辦法,最后發現可能是權限問題。把啟動php-fpm的方式修改為普通用戶權限就解決問題了。

sudo php-fpm -D 改為 php-fpm -D

默認時區提示

PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0

在php.ini 中修改

data.timezone = Asia/Shanghai

分類: 未分類 標簽:

mac安裝docker

2019年2月7日 沒有評論

mac系統不能像Linux系統安裝docker那樣一條命令完成,需要安裝docker公司開發的軟件,提供了一個虛擬化的環境來運行docker,安裝完成之后1個多G。

1.首先確認系統版本,docker要求2010年以后的系統,10.12的操作系統可以安裝Docker Desktop for Mac。老版的系統可以安裝docker-Toolbox。

2.不能安裝4.3.30以前版本的virtualbox,會有沖突,之后較新版本可以安裝

3.注冊docker hub賬戶,下載Docker.dmg需要先登錄。

docker mac版下載地址https://download.docker.com/mac/stable/Docker.dmg

下載完成后雙擊安裝包,拖動小鯨魚到appications文件夾完成安裝。

啟動docker:launchPad->Docker (單擊小鯨魚圖標)

首次打開會提示驗證安裝,點擊打開


如果系統不符合要求,會有對應的最低操作系統版本要求提示,可以安裝docker-Toolbox。

分類: 未分類 標簽:
大小单双倍投公式 重庆山东时时吗 功夫时时彩计划软件下载 江西新时时论坛 欢乐娱乐棋牌下载 双色球选6红中6全部技巧 易游eu8com网页登录下载 pk10赛车开奖记录照片 球探足球比分手机版 网赌黑客修改余额 重庆时时彩现场开奖 大乐透篮球最大的数字 pk10技巧走势图技巧 pt平台官网 一分快3稳赚方法 玩时时彩死了多少人