nginx文件系统大小_详解Nginx系列
1.Nginx特點
Nginx是一個事件驅動架構,而非傳統過程驅動架構。具有內存占用低,當并發連接大時,能夠預測內存使用率。Nginx改變了傳統的web服務器體系架構,提高了響應速度,起初Nginx開發的目標是實現10倍以上的性能,并能夠模塊化,事件驅動,異步,單線程web服務器和web服務器代理。
(1)Nginx作為web服務器
Nginx使用更少的資源,支持更多連接,更快響應,能夠支持高達50000個并發連接的響應,并選用了epoll and kqueue模型。
(2) Nginx作為負載均衡服務器
不僅可以支持Rails和PHP,也可作為HTTP代理服務器。Nginx是使用C語言開發,這使得CPU占有率和系統資源開銷比Perbal出色很多。
(3)Nginx作為郵件代理服務器
Nginx最早是作為一個郵件代理服務器,所以它本身就是一個很好的代理服務器。并且安裝和配置簡單,,升級簡單(熱升級),bugs非常少。啟動簡單,幾乎可以做到7*24不間斷運行,運行數個月也不需要重新啟動。
2.Nginx架構
Nginx采用了操作系統中高級事件機制的不斷發展的啟發,開發了一個模塊化,事件驅動,異步,單線程的非阻塞架構。并使用復用和事件通知,用于分離進程的特定任務。在每個worker進程中,nginx可以處理每秒數千個并發連接和請求。這些架構思想,解決了傳統web服務器在內存和CPU消耗方面,低效的特點。
(1)代碼結構
nginx包括核心和功能模塊,核心是維護某些循環的執行,并在請求處理時,執行模塊代碼適當部分。模塊包括了大部分演示和應用層功能。模塊的讀取和寫入網、存儲,轉換內容,執行出站過濾,應用服務器端包含操作,并在代理啟動時將請求傳遞給上游服務器。
nginx允許擴展web服務器功能,不用修改nginx其它源碼,但不支持動態加載模塊。即在構建階段將模塊與其核心一起編譯。nginx使用一些事件通知機制和磁盤IO性能增強,如kqueue,epoll和事件端口,并優化了復用和高級I/O操作的不同使用方法。主要目的是使得操作系統的提示能夠及時,并且能夠快速獲得入站和出站流量,磁盤操作,讀取和寫入套接字等。
(2)工作模式
worker進程接受自共享"listen"套接字的新請求,并高效執行循環,處理數千個連接。注意這個過程是沒有仲裁或分配與nginx工作的聯系,這個worker是由操作系統內核機制完成。啟動后,首先創建一組初始偵聽套接字,然后worker不斷處理HTTP請求,不斷接收,讀取和寫入套接字。
這個直線循環是很復雜部分,包括內部調用,并在很大程度上依賴異步任務處理,異步操作通過模塊化,事件通知,廣泛使用回調函數和微調定時器來實現。開發的關鍵原則是盡可能不要阻塞,但是當磁盤空間不夠時,應該要阻塞。
nginx由于謹慎使用內存(不會連接一個線程或線程),同時也節省CPU使用周期(沒有持續創建和銷毀),當初始化新連接,并將其添加到運行循環中,并異步處理指導完成,此時連接被重新分配并從運行循環中刪除。為什么CPU使用率低?一般就是結合優化系統調用流程和支持接口(如pool,slab內存分配器),使得在極端工作負載下實現很低的CPU負載。
如何根據磁盤使用和 CPU 負載模式去配置nginx 工作(worker)的數量?
如果負載大多是大量處理TCP/IP,執行SSL或壓縮,則worker的數量與CPU核的數量相匹配。如果負載大多是磁盤 I/O 綁定,存儲或重代理服務,worker的數量可能是核心數量的一到兩倍。
關于worker模式與嵌入式腳本有限支持有關,一個使用標準的 nginx 分發,只支持嵌入 Perl 腳本。由于腳本有意外退出的可能,就可能導致worker掛起,同時影響數千個連接。所以腳本應該更穩定才行。
(3)Nginx進程
主要由主進程和多個worker進程。所有進程都是單線程,進程間通信主要采用共享內存進行通信。主進程作為root用戶運行,worker進程,緩存加載器和管理器(nginx特殊用途)則以無權限用戶執行。
主進程工作:
1.讀取,驗證配置
2.創建,綁定和關閉套接字
3.啟動,終止和維護配置的worker進程
4.重新配置,無需中斷服務
5.重新打開日志文件
6.編譯嵌入式perl腳本
worker進程工作:
(1)處理客戶端連接
(2)提供反向代理和過濾功能
緩存加載器工作:
(1)檢查磁盤緩存項目,使用nginx實例來處理已經存儲在磁盤的特定分配的目錄結構中的文件,遍歷目錄,檢查緩存內容元數據,更新共享內存的相關條目,然后在退出時再清理。
緩存管理器工作:
(1)主要清理緩存,正常的nginx操作保持在內存中,并且在失敗的情況下由主進程重新啟動。
3.Nginx緩存
nginx中的緩存是以文件系統的分層數據存儲實現。緩存密鑰(可配置)和緩存元數據存儲在共享存儲器段中,通過高速緩存加載器,緩存管理器和worker進程訪問。每個緩存的響應都放在文件系統上的不同文件中,并通過不同nginx配置命令進行控制。當響應寫入緩存目錄結構時,文件的路徑和名稱將從代理URL的MD5哈希導出。
將數據放在緩存的過程如下:
(1) nginx從上游服務器讀取響應,首先寫入緩存目錄結構之外的臨時文件
(2)nginx完成處理請求,將臨時文件移動到緩存目錄。如果臨時文件位于另外一個文件系統,則文件將被復制,因此建議將臨時文件目錄和緩存目錄保存在同一文件系統。
(3)如果要顯式刪除緩存目錄結構,從文件中刪除文件也是很安全。
4.安裝Nginx
nginx只是實現了http這一層,pcre是負責正則表達式的,正則表達式,只是用在location.conf文件里面。openssl應用與加密。Zlib應用于壓縮。服務器返回客戶端的數據,需要壓縮的方式。
解壓nginx
解壓openssl
解壓pcre
解壓zlib
配置命令:
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/home/qaa/share/nginx/pcre-8.41 --with-zlib=/home/qaa/share/nginx/zlib-1.2.11 --with-openssl=/home/qaa/share/nginx/openssl-1.1.0g
出現如下,配置成功:
再make
出現如下,編譯成功。
make install 出現如下編譯成功:
最終安裝在這個目錄下
這個就是可以運行的nginx
啟動nginx
./sbin/nginx -c conf/nginx.conf
出現如下,表示啟動成功。
到瀏覽器,輸入這個地址,就表示nginx能夠啟動成功。
http://172.16.204.129/
(1)nginx -s signal
信號(signal)的值可能是以下之一:
stop 快速關閉服務
quit - 正常關閉服務
reload - 重新加載配置文件
reopen - 重新打開日志文件
ps -ax | grep nginx
要獲取所有運行的 nginx 進程的列表,可以使用 ps 命令,例如,以下列方式:
5.配置nginx做代理
先寫個簡單的服務器配置文件:
逐個解釋下,下面配置文件的意思。
work_process:表示的是work進程的數量
events:表示的是事件
worker_connections 1024:表示服務端與客戶端連接的數量
http:表示響應的具體協議
server:表示服務,具體的服務。可以配置多個server
listen:表示自定義監聽的端口號,端口建議大于1024
server_name:表示服務的名字,名字可以隨便取
client_max_body_size:表示客戶端請求數據的大小
location:表示請求的根目錄
然后,停止當前正在運行的nginx服務,并重新開啟
./sbin/nginx -s stop
./sbin/nginx -c vip_conf/demo.conf
把圖片放到/usr/local/nginx下面
6.Nginx 壓縮和解壓
(1)壓縮和解壓縮
壓縮響應通常會顯著減少傳輸數據的大小。然而,由于壓縮在運行時發生,它還可以增加相當大的處理開銷,這會對性能產生負面影響 在向客戶端發送響應之前,NGINX 會執行壓縮,但不會“壓縮”已壓縮的響應(例如,由代理的服務器)。
(2) 啟用壓縮
gzip on
默認情況下,NGINX 僅使用 MIME 類型 text/html 壓縮響應。要使用其他 MIME 類型壓縮響應,請包含 gzip_types 指令并列出其他類型。
gzip_types text/plain application/xml
要指定要壓縮的響應的最小長度,默認值為 20 字節(可將此處調整為 1000)。
gzip_min_length 1000
gzip_proxied 指令具有指示 NGINX 在響應中檢查 Cache-Control 頭字段的參數,如果值為 no-cache, no-store 或 private,則壓縮響應。另外,您必須包括 Expires 參數以用來檢查 Expires 頭域的值。這些參數在以下示例中與 auth 參數一起設置,該參數檢查 Authorization 頭字段的存在(授權響應特定于最終用戶,并且通常不被緩存):
gzip_proxied no-cache no-store private expired auth;
與大多數其他指令一樣,配置壓縮的指令可以包含在http 上下文中,也可以包含在 server或 location 配置塊中。
gzip 壓縮的整體配置可能如下所示。
server {
gzip on;
gzip_types text/plain application/xml;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
...
}
(3)啟用解壓縮
由于客戶端可能不支持gzip編碼的響應,為了服務不接收壓縮數據的客戶端,Nginx可以執行及時壓縮。
要啟用運行時解壓縮,請使用gunzip指令。
location /storage/
{
gunzip on;
.........
}
gunzip 指令與gzip指令相同上下文的環境中運行。
server {
gzip on;
gzip_min_length 1000;
gunzip on;
。。。
}
該指令最好在單獨模塊中定義,默認情況可能不包含在NGINX中。
(4) 發送壓縮文件
將壓縮文件發送大客戶端,需要把gzip_static指令設置為on。
location / {
gzip_static on;
}
Nginx會去查找并發送壓縮文件,如果客戶端不支持gzip,則發送未壓縮版本的文件。
需要注意的是,gzip_static指令不啟用及時壓縮,而是使用壓縮工具預先壓縮的文件。如果需要及時壓縮內容(而不是靜態內容),請使用gzip指令。同上,這個模塊需要單獨定義。
7.Nginx內容緩存
(1)啟用響應緩存
要啟用緩存,使用proxy_cache_path指令,第一個參數是緩存本地內容的路徑,強制keys_zone參數用于存儲有關緩存項目的元數據的共享內存區域的名稱和大小。
http{
....
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
然后在要緩存服務器響應的上下文中包含proxy_cache指令,將keys_zone參數定義的區域名稱指定為proxy_cache_path 指令。
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server
{
proxy_cache one;
location / {
proxy_pass http://localhost:8000;
}
}
}
注意:keys_zone 參數定義的大小不會限制緩存的響應數據的總量。如果要限制緩存的響應數據量,請將max_size參數包含到proxy_cache_path指令中。
(2)涉及緩存的 NGINX 進程
有兩個額外的Nginx進程涉及到緩存,緩存管理器會周期性檢查緩存狀態,如果緩存大小超過max_cize_path指令設置的max_size參數,它將刪除最近訪問的數據,注意,高速緩存管理器激活之間的緩存數據量可以臨時超過限制。
當Nginx啟動后,緩存加載程序只運行一次。將有關以前緩存的數據加載到共享內存區域。注意,一次加載整個緩存可能在開始幾分鐘會消耗很多資源,導致減慢Nginx性能。為了避免這種情況,可以使用proxy_cache_path 偽指令來配置緩存的迭代加載。
loader_threshold:迭代持續時間,以毫秒為單位(默認200)
loader_files:在一次迭代期間加載的最大項目數(默認為100)
loader_sleeps:迭代之間延遲,以毫秒為單位(默認為50)
在以下示例中,迭代持續 300 毫秒或直到加載了 200 個項目:
proxy_cache_path /data/nginx/cache keys_zone=one:10m
loader_threshold=300
loader_files=200;
(3)指定要緩存的請求
如果請求具有與緩存響應相同的密鑰,則Nginx將緩存的響應發送給客戶端。可以用http,server或location上下文中包含各種指令,以控制哪些響應被緩存。
要定義緩存響應之前需要進行相同密鑰的請求的最小次數,需要使用proxy_cache_min_uses指令。
如proxy_cache_min_uses 5;
要使用除 GET 和 HEAD 之外的方法來緩存對請求的響應,請將它們與 GET 和 HEAD 一起列為參數。
proxy_cache_methods GET HEAD POST;
(4) 限制或繞過緩存
默認情況下,響應將無限期地保留在緩存中。只有緩存超過最大配置大小,然后按照最后
一次請求的時間長度,它們才被刪除。可以在http,server或location上下文中去設置有效時間長度。
限制緩存響應與特定狀態代碼被認為有效的時間,使用proxy_cache_valid指令,200或302的響應有效時間為10分鐘,且404的響應有效1分鐘。
定義具有所有狀態代碼的響應有效時間,指定any作為第一個參數。
proxy_cache_valid any 5m;
如果針對客戶端,不設置緩存響應的條件,包括proxy_cache_bypass指令。每個參數定義一個條件并由多個變量組成。則Nginx不會在緩存中查找響應,而是將請求立即轉發到后端服務器。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
要定義 NGINX 根 本 不 緩 存 響 應 的 條 件 , 請 包 括 proxy_no_cache 指 令 , 以 與
proxy_cache_bypass 偽指令相同的方式定義參數。
proxy_no_cache $http_pragma $http_authorization;
8.緩存中清除內容
(1)使用“PURGE”的標志配置http方法的請求并刪除匹配的URL。
http{
...
map $request_method $purge_method{
PURGE 1;
default 0;
}
}
配置高速緩存,包括指定緩存清除請求的條件proxy_cache_purge指令。
server
{
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
(3) 發送清除命令
配置proxy_cache_purge 指令后,清除緩存,如curl命令。
curl -X PURGE -D - " http://www.example.com"
HTTP/1.1 204 No Content
Server: nginx/1.5.7
.....
在該例子中,具有公共URL部分的資源將被刪除,但是,這些高速緩存條目將不會從緩存中完全刪除。因為這些保留在磁盤上,直到他們被刪除為非活動狀態。
(4) 限制訪問清除命令
限制有限數量的IP,發送緩存請求。
geo $purge_allowed
{
default 0;#拒絕所有ip
10.0.0.1 1;#拒絕本地
192.168.0.0/24 1; #允許10.0.0.0/24
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
上例中,設置$purge_allowed:"1",允許清除,"0"表示拒絕清除。
(5)在緩存中完全刪除文件
將purge參數添加到proxy_cache_path指令中,完全刪除與星號相匹配的緩存文件。
proxy_cache_path /data/nginx/cache
levels=1:2
keys_zone=mycache:10m purge=on
(6) 緩存清除配置
http
{
proxy_cache_path /data/nginx/cache
levels=1:2
keys_zone=mycache:10m purger=on;
map $request_method $purge_method
{
PURGE 1;
default 0;
}
server
{
listen 80;
server_name www.example.com;
location /{
proxy_pass http://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
geo $purge_allowed{
default 0;
10.0.0.1 1;
192.168.0.0/24 1;
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
}
(7) 字節緩存
當針對大文件時,使用Nginx進行切片,每個范圍請求選擇擇將覆蓋所請求范圍的特定切片,如果此范圍還沒有放入緩存,就將其放入緩存中。使用 slice 指令指定切片的大小。
location /{
slice 1m;
}
切片設計要合理,太小可能會導致內存使用量過大,會大量打開文件描述符。切片太大可能會導致延遲。
將$slice_range 變量包含到緩存鍵中:
proxy_cache_key$uri$is_args$args$slice_range;
啟用206狀態碼緩存響應:
proxy_cache_valid 200 206 1h;
通過在 Range 頭字段中傳遞$slice_range 變量來將傳遞范圍請求設置為代理服務器:
proxy_set_header Range $slice_range;
字節范圍緩存示例:
location / {
slice 1m;
proxy_cache cache;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 200 206 1h;
proxy_pass http://localhost:8000;
}
值得注意,如果切片緩存打開,則不應更改初始文件。
(8)組合配置
以下配置,組合了上述某些緩存選項
http{
...
proxy_cache_path /data/nginx/cache
keys_zone=one:10m
loader_threshold=300
loader_files=200 max_size=200m;
server {
listen 8080;
proxy_cache one;
location / {
proxy_pass http://backend1;
}
location /some/path {
proxy_pass http://backend2;
proxy_cache_valid any 1m;
proxy_cache_min_uses 3;
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
}
}
}
由于 backend1 服務器的響應很少更改,因此不包括緩存控制指令。首次請求響應緩存,
并無限期保持有效。相比之下,對 backend2 服務的請求的響應頻繁變化,因此它們被認為只有 1 分鐘有效,并且在相同請求 3 次之前不被緩存。此外,如果請求符合 proxy_cache_bypass 指令定
義的條件,則 NGINX 會立即將請求傳遞給 backend2,而不在緩存中查找。
9.Nginx應用場景
Nginx主要應用場景如下:
(1) 反向代理
(2) 負載均衡
(3) HTTP服務器(動靜分離)
(4)正向代理
(1)反向代理
反向代理,代理的是服務器,代理服務器和目標服務器在同一個局域網,也有可能是在同一臺機器上。此時代理服務器對外就表現為一個反向代理服務器。由于目標服務器不能被外部網絡方位,所以就需要一臺代理服務器。
下面是一個簡單的實現反向代理的代碼:
server{
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host:$server_port;
}
}
保存配置文件,啟動Nginx,當訪問localhost,就相當于訪問localhost:8080。
(2)負載均衡
負載均衡就是要把任務分攤到各個不同的目標服務器上去執行,如web服務器,FTP服務器等。根據規則隨機的將請求分發到指定服務器上處理,負載均衡是在反向代理的基礎上進行,通過反向代理跳轉到負載均衡。Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略。
PR(默認)
每個請求按時間順序逐一分配到不同的后端服務器,若后端服務器down掉,能自動取消。
upstream test{
server localhost:8080;
server localhost:8081;
}
server{
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
負載均衡的核心代碼
upstream test {
server localhost:8080;
server localhost:8081;
}
設置了兩臺不同的服務器,這里只是端口號不一樣,訪問http://localhost,會默認跳到http://localhost:8080,Nginx會自動判斷服務器狀態,如果服務器出于不能訪問,服務掛了,就不會跳轉。由于使用的的是PR策略,所以不需要其他更多設置。
權重
指定輪詢概率,即設置權重。如:
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
那么 10 次一般只會有 1 次會訪問到 8081,而有 9 次會訪問到 8080。
ip_hash
上述2種方式存在一個問題,就是下一個請求來的時候,可能會分發到另外一個服務器,當程序是無狀態的時候,這個時候就有很大的問題,如把登陸信息保存到了session中,那跳轉到另外一臺服務器的時候需要重新登錄,這個時候需要一個客戶訪問指定的服務器,就需要iphash了。iphash的每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
fair(第三方)
按照目標服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
url_hash(第三方)
按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個后端服務器,后端服務器為緩存時比較有效。在 upstream 中加入 hash 語句,server 語句中不能寫入 weight 等其他的參數,hash_method 是使用的 hash 算法。
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
以上 5 種負載均衡各自適用不同情況下使用,所以可以根據實際情況選擇使用哪種策略模式,不過 fair 和 url_hash 需要安裝第三方模塊才能使用。
(3) HTTP 服務器
Nginx實現動靜分離,用Nginx做靜態資源服務器。
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root /usr/local/nginx/html/www;
index index.html;
}
}
動靜分離
動靜分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來。動靜資源做好了拆分以后,我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路。
upstream test
{
server localhost:8080;
server localhost:8081;
}
server{
listen 80;
server_name localhost;
location /{
root root /usr/local/nginx/html/www;
index index.html;
}
}
# 所有靜態請求都由 nginx 處理,存放目錄為 html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js) ${
root /var/www;
}
# 所有動態請求都轉發給 tomcat 處理
location ~ .(jsp|do) ${
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www;
}
}
這樣就把靜態圖片,css,js放到html/www,而tomact只負責處理jsp請求,當我們后綴為 gif 的時候,Nginx 默認會從 html/www 獲取到當前請求的動態圖文件返回,當然這里的靜態文件跟 Nginx 是同一臺服務器,我們也可以在另外一臺服務器,然后通過反向代理和負載均衡配置過去就好了。
正向代理
代理客戶端,客戶端是可以感知代理服務器存在,發出的請求,由代理服務器去轉發給目標服務器。
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log /var/www/access.log;
error_log /var/www/error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
resolver 是配置正向代理的 DNS 服務器,listen 是正向代理的端口,配置好了就可以在 ie 上面或者其他代理插件上面使用服務器 ip+端口號進行代理了。
Nginx是支持熱啟動,當修改配置文件后,不用關閉Nginx,就可以實現讓配置生效。Nginx從新讀取配置的命令:
nginx -s reload
nginx.exe -s reload
總結
以上是生活随笔為你收集整理的nginx文件系统大小_详解Nginx系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android代码设置角标,Androi
- 下一篇: xss img onerror java