首頁  >  文章  >  php教程  >  初次接觸Nginx

初次接觸Nginx

高洛峰
高洛峰原創
2016-12-01 13:15:541320瀏覽

    前段時間,登上公司網站測試用的伺服器,無意中看到一個access.log.gz的文件包,好奇心驅使我將其從遠端伺服器下載到了本地,然後解壓,打開看,是一份訪問日誌,之前總是聽到他們維運的提到訪問日誌訪問日誌,腦子只對它有印象,但不知道具體是什麼,現在知道了,然後,然後不懂就要問呀,了解到了一個叫nginx的伺服器軟體。利用業餘時間簡單的了解後,就想能不能在自己的電腦上安裝一個nginx,平時開發調試時,也可以監控用的最多的幾個端口,雖然感覺並沒有什麼意義,但也可看作是一種學習,畢竟自己動手操作一遍比僅僅只看書或資料體會的會更加深刻。今天只講下配置,隨著學習的深入還會接觸到負載平衡、反向代理、優化等等,講得不正確的地方歡迎指正,相互學習,共同進步!

     Nginx相比Apaceh等,它的優點很多資料了上有,不在此過多強調,無非就是高並發連接、內存消耗少、成本低廉、配置文件簡單等等。

(一)安裝

    在ubuntu系統上安裝nginx,很簡單,一條指令就可以搞定。

sudo apt-get install nginx

   

順便提醒下:如果你在安裝時報錯,終端提示“無法解析或打開軟體包的列表或是狀態文件”,具體如下:

E: Encountered a section with no Package: header

E: Problem with MergeList /var/lib/apt/lists/cn.archive.ubuntu.com_ubuntu_dists_natty_main_i18n_Translation-en

E: 無法解析或開啟軟體包的清單或是狀態檔。

解決方法:

sudo rm /var/lib/apt/lists/* -vf    //如果無法刪除則可以用強制刪除,加個參數-r   

sudo apt-get update

如果你的電腦裡安裝有Apache,而且已經運作了,把Apache停了,因為Apache和Nginx的預設埠都是80。

安裝成功後,就會有一個可執行指令,開啟終端機輸入指令nginx -h,會出現一些指令參數資訊。


nginx -h        查看指令幫助

nginx -v        顯示版本資訊

nginx -V      顯示版本資訊

nginx -V    

nginx -T        測試設定檔並轉儲

nginx -q         在設定測試期間抑制非錯誤訊息

nginx -s signal  發送訊號到主程式,其中訊號有stop,停止nginx;quit,退出;reopen,         

nginx -p prefix  設定前綴路徑,預設為/usr/share/nginx/

nginx -c filename 設定設定文件,預設為/etc/nginx/nginx.conf

ngnix -g的全域指令

註:如果在使用這些指令時報錯,有可能是權限問題,切換到root下執行就可以。

(二)設定檔


主設定檔為nginx.conf,預設路勁在/etc/nginx/下

與PHP相關的是fastcgi_params,與Python相關的是uwsgi_params

如下:

user www www ;

Nginx使用者及群組。 window下不指定

worker_processes 8;

工作進程數目。根據硬體調整,通常等於CPU總核數或總核數的兩倍。

error_log  /var/logs/error.log crit;

錯誤日誌存放路徑以及級別,級別可以為[debug|info|notice|warn|error|crdit]

關於各個錯誤日誌級別,可參考博文http ://blog.csdn.net/solmyr_biti/article/details/50634533

pid /run/nginx.pid;

pid進程識別碼存放路徑。 pid文件為文字文件,內容只有一行, 記錄了該行程的ID。 pid檔案的作用是防止進程啟動多個副本。只有取得pid檔(固定路徑固定檔名)寫入權限(F_WRLCK)的程序才能正常啟動並把自身的PID寫入該檔。其它同一個程式的多餘進程則會自動退出。

利用nginx的pid檔對nginx進行停止、重啟、平滑重啟。

指令格式如下:

kill  -訊號類型` cat /run/nginx.pid`

其中訊號類型主要有:

TERM,INT   快速關閉;        平順關閉,重新載入設定檔

USER1       重新開啟日誌文件,在切割日誌時用途大

USER2       平滑升級執行檔

WINCH       平滑升級執行檔

WINCH   505050505005

指定進程可以開啟的最大描述符數目。

這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n 的值保持一致。

現在在Linux 2.6核心下開啟檔案開啟數為65535,worker_rlimit_nofile就對應應該填入65535。

這是因為nginx調度時分配請求到進程並不是那麼的均衡,所以假如填寫10240,總併發量達到3-4萬時就有進程可能超過10240了,這時會返回502錯誤。

events

{

use epoll;

使用epoll的網路I/O 模型。 linux建議epoll,FreeBSD建議採用kqueue,window下不指定。

關於什麼時epoll、select、kqueue可以查相關資料。

worker_connections 204800;

    每個工作進程的最大連線數量。根據硬體調整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進程允許的最多連線數,理論上每台nginx伺服器的最大連線數為worker_processes*worker_connections

keepalive_timeout 60;

keepalive逾時時間。

client_header_buffer_size 4k;

客戶端請求頭部的緩衝區大小。這個可以根據你的系統分頁大小來設置,一般一個請求頭的大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設置為分頁大小。

分頁大小可以用指令getconf PAGESIZE 取得。

但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為「系統分頁大小」的整倍數。

open_file_cache max=65535 inactive=60s;

這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。

open_file_cache_valid 80s;

這個是指多久檢查一次快取的有效資訊。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive參數時間內檔案的最少使用次數,如果超過這個數字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除。

}

 ##下面是設定http伺服器,利用它的反向代理功能提供負載平衡支援

http

{

include mime.types;

類型檔案定義

default_type application/octet-stream;


log_format main '$remote_addr - $remote_user [$time_local] "$request" '

).<<

🎝 http_user_agent" "$http_x_forwarded_for"';

log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

日誌格式設定。

$remote_addr與$http_x_forwarded_for用來記錄客戶端的ip位址;

$remote_user:用來記錄客戶端使用者名稱;

$time_local: 用來記錄存取時間與時區;的url與http協定;

$status: 用來記錄請求狀態;成功是200,

$body_bytes_sent :記錄傳送給客戶端檔案主體內容大小;

$http_referer:用來記錄從那個頁面連結存取過來的;

$http_user_agent:記錄客戶瀏覽器的相關資訊;

通常web伺服器放在反向代理的後面,這樣就不能取得到客戶的IP位址了,透過$remote_add拿到的IP位址是反向代理伺服器的iP位址。反向代理伺服器在轉送請求的http頭資訊中,可以增加x_forwarded_for訊息,用以記錄原有客戶端的IP位址和原來客戶端的請求的伺服器位址。

access_log  logs/host.access.log  main;

access_log  logs/host.access.404.log  log404;

用了log_format指令設定了日誌格式之後,指定了用日誌檔案來存放檔案的指令;

gzip on :

開啟gzip壓縮輸出,減少網路傳輸。

gzip_min_length 1k 

設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭得content-length中取得。預設值是20。建議設定成大於1k的位元組數,小於1k可能會越壓越大。

gzip_buffers 4 16k 

 設定係統取得幾個單位的快取用於儲存gzip的壓縮結果資料流。 4 16k代表以16k為單位,安裝原始資料大小以16k為單位的4倍申請記憶體。

gzip_http_version 1.0 

 用來識別http 協定的版本,早期的瀏覽器不支援Gzip 壓縮,使用者就會看到亂碼,所以為了支援前期版本加上了這個選項,如果你用了Nginx 的反向代理並期望也啟用Gzip 壓縮的話,由於末端通訊是http/1.0,故請設定為1.0。

gzip_comp_level 6 

 gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)

gzip_types 

匹配mime類型進行壓縮,無論是否指定,」text/html ”類型總是會被壓縮的。

gzip_proxied any 

 Nginx作為反向代理的時候啟用,決定開啟或關閉後端伺服器回傳的結果是否壓縮,符合的前提是後端伺服器必須傳回包含」Via」的 header頭。

gzip_vary on 

和http頭有關係,會在回應頭加個 Vary: Accept-Encoding ,可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用Squid快取經過Nginx壓縮的資料。 。

server_names_hash_bucket_size 128;

保存伺服器名稱的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數hash bucket size總是等於hash表的大小,並且是一路處理器快取大小的倍數。在減少了在記憶體中的訪問次數後,使在處理器中加速查找hash表鍵值成為可能。如果hash bucket size等於一路處理器快取的大小,那麼在查找鍵的時候,最壞的情況下在記憶體中查找的次數為2。第一次是確定儲存單元的位址,第二次是在儲存單元中尋找鍵 值。因此,如果Nginx給出需要增加hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小.

client_header_buffer_size 4k;

客戶端請求頭部的緩衝區大小。這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設置為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。

large_client_header_buffers 8 128k;

客戶請求頭緩衝大小。 nginx預設會用client_header_buffer_size這個buffer來讀取header值,如果

header過大,它會使用large_client_header_buffers來讀取。

open_file_cache max=102400 inactive=20s;

這個指令指定快取是否啟用。同時也指定了快取最大數目,以及快取的時間。我們可以設定一個相對高的最大時間,這樣我們可以在它們不活動超過20秒後清除掉

open_file_cache_errors on | off 

預設值:open_file_cache_errors off 使用欄位:http, server, location ,這個指令指定是否在搜尋一個檔案是記錄cache錯誤.

open_file_cache_min_uses

語法:open_file_cache_min_uses number 預設值:open_file_cache_min_uses 1 使用欄位:http, server, location 這個指令指定了一定的時間範圍內的最小指令值檔案數,如果使用更大的值,檔案描述子在cache總是開啟狀態.

open_file_cache_valid

語法:open_file_cache_valid time 預設值:open_file_cache_valid 60 使用欄位:http, server, location 這個指令指定了何時需要檢查open_file_cache中快取項目的有效資訊.

client_max_body_size 300m;

設定透過nginx上傳檔案的大小

sendfile on;

指令是否開啟高效率檔案傳輸模式,sendfilesendinx使用者空間到核心空間的上下文切換。對於普通應用程式設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。

tcp_nopush on;

此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用

proxy_connect_timeout 90; 

proxy_read_timeout 180;

連線成功後等候後端伺服器回應時間,其實已經進入後端的排隊之中等候處理(也可以說是後端伺服器處理請求的時間)

proxy_send_timeout 180;伺服器回傳時間,就是在規定時間之內後端伺服器必須傳完所有的資料

proxy_buffer_size 4k;

設定從被代理伺服器讀取的第一部分應答的緩衝區大小,通常情況下這部分應答中包含一個小的應答頭,預設這個值的大小為指令proxy_buffers中指定的一個緩衝區的大小,不過可以將其設定為更小

proxy_buffers 4 32k;

設定用於讀取應答(來自被讀取應答代理伺服器)的緩衝區數目和大小,預設情況也是分頁大小,根據作業系統的差異可能是4k或8k

proxy_busy_buffers_size 64k;

高負載下緩衝大小(proxy_buffers*2)

高負載下緩衝大小(proxy_buffers*2)

當快取被代理的伺服器回應到臨時檔案時,這個選項限制每次寫臨時檔案的大小。 proxy_temp_path(可以在編譯的時候)指定寫到哪那個目錄。

proxy_temp_path /data0/proxy_temp_dir;

proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區

proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#設定記憶體快取空間大小為200MB,1天沒有被快取的內容自動快取。

keepalive_timeout 120;

長連接超時時間,單位是秒,這個參數很敏感,涉及瀏覽器的種類、後端伺服器的超時設定、作業系統的設置,可以另外起一片文章了。長連線要求大量小檔案的時候,可以減少重建連線的開銷,但假如有大檔案上傳,65s內沒上傳完成會導致失敗。如果設定時間過長,用戶多,長時間保持連線會佔用大量資源。

send_timeout 120;

 用來指定回應客戶端的逾時時間。這個逾時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。

tcp_nodelay on;

告訴nginx不要緩存數據,而是一段一段的發送–當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。

client_body_buffer_size 512k;

如果把它設定為比較大的數值,例如256k,那麼,無論使用firefox還是IE瀏覽器,來提交任意小於256k的圖片,都很正常。如果註解該指令,使用預設的client_body_buffer_size設置,也就是作業系統頁面大小的兩倍,8k或16k,問題就出現了。

無論使用firefox4.0或IE8.0,提交一個比較大,200k左右的圖片,都回傳500 Internal Server Error錯誤

proxy_intercept_errors on;

表示使nginx阻止HTTPTPTP 。

upstream bakend {

server 127.0.0.1:8027;

server 127.0.0.1:8028;

server 127.0.0.1:8029;這個設計到負載平衡問題。

nginx的upstream目前支援以下種方式的分配

1、輪詢(預設)

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

2、weight

指定輪詢幾率,weight和存取比率成正比,用於後端伺服器效能不均的情況。

例如:

upstream bakend {

server 192.168.0.14 weight=10;

server 192.168.0.15ip weight=100;分配,這樣每個訪客固定存取一個後端伺服器,可以解決session的問題。

例如:

upstream bakend {

ip_hash;

server 192.168.0.14:88;

server🜎端伺服器的回應時間來分配請求,回應時間短的優先分配。

upstream backend {

server server1;

server server2;

fair;

}

5、url_hash(第三方)

}

5、url_hash(第三方)

}

5、url_hash(第三方)

}按訪問一個後端伺服器,後端伺服器為快取時比較有效。

例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash演算法

upstream backend {

server squid1:3128;

3

hash $request_uri;

hash_method crc32;

}

#定義負載平衡設備的Ip及設備狀態

upstream bakend{

ip_hashd

upstream bakend{

ip_hash; .0.1: 8080 weight=2;

server 127.0.0.1:6060;

server 127.0.0.1:7070 backup;

}

在需要使用負載平衡的server中增加每個設備的狀態設定為:

1.down表示單前的server暫時不參與負載

2.weight為weight越大,負載的權重越大。

3.max_fails:允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream模組定義的錯誤

4.fail_timeout:max_fails次失敗後,暫停的時間。

5.backup: 其它所有的非backup機器down或忙碌的時候,請求backup機器。所以這台機器壓力會最輕。

nginx支援同時設定多組的負載平衡,用來給不用的server來使用。

client_body_in_file_only設定為On 可以講client post過來的資料記錄到檔案中用來做debug

client_body_temp_path設定記錄檔的目錄可以設定最多3層目錄

location對URL進行比對.的代理負載平衡

##配置虛擬機

server

{

listen 80;

設定監聽埠 

server_name image.***.com;設定監聽埠 

server_name image.***.com; mp3|exe)$ {

正規表示式,以「mp3或exe」結尾的位址進行負載平衡

proxy_pass http://img_relay$request_uri;

設定被代理伺服器的連接埠或套接字伺服器URL

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以上三行,目的是將代理伺服器收到的使用者的資訊傳送到真實伺服器上


}


location/face { "

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

#這裡牽涉Nginx的Rewrite規則問題,由於篇幅有限,下節再講 http ://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_p

}

}

}

從上面也可以看出nginx.conf檔案的主要格式是:


......


events

{

......

}

http

{

  ......

     server

      server

     {

      ......

     }

   ......

}

 Nginx的配置是一大特色。可以類比css檔案中樣式的定義,子元素會繼承父元素的樣式定義並且可以選擇是否覆蓋,nginx配置中同樣存在類似的繼承關係。

為理解nginx配置的繼承模型,需要知道nginx配置有好幾個區塊,一個區塊也被稱為一個上下文(context),例如在server上下文中定義的指令存放在server{}區塊中,http上下文中定義的指令存放在http{}區塊中。

在nginx中存在6種可能的上下文,順序由高到低依序是:

Global

Http

Server

If

默認的繼承模型方向是低層繼承高層,而不是橫向或逆向。一個常見的場景是,重寫請求從一個location內部跳到另一個location,那麼在第一個location區塊中定義的指令就會被忽略,而只有第二個location區塊中定義的指令在location context中有效,這裡只是簡單的提下。

其實Nginx配置不只是這些,還有其它的,畢竟Nginx有很多模組,每個模組可能又有些特殊的配置命令,這裡講得只是一些基本的配置信息,等學得,理解的更深刻後,再逐步補充吧,不正之處歡迎批評指涉!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn