前段時間,登上公司網站測試用的伺服器,無意中看到一個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 -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 ;
kill -訊號類型` cat /run/nginx.pid`
這個指令是指當一個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;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或8kproxy_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_hashdupstream 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過來的資料記錄到檔案中用來做debugclient_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;設定被代理伺服器的連接埠或套接字伺服器URLproxy_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
{
......
} ......}
Nginx的配置是一大特色。可以類比css檔案中樣式的定義,子元素會繼承父元素的樣式定義並且可以選擇是否覆蓋,nginx配置中同樣存在類似的繼承關係。
為理解nginx配置的繼承模型,需要知道nginx配置有好幾個區塊,一個區塊也被稱為一個上下文(context),例如在server上下文中定義的指令存放在server{}區塊中,http上下文中定義的指令存放在http{}區塊中。
在nginx中存在6種可能的上下文,順序由高到低依序是:
Global
Http
Server
默認的繼承模型方向是低層繼承高層,而不是橫向或逆向。一個常見的場景是,重寫請求從一個location內部跳到另一個location,那麼在第一個location區塊中定義的指令就會被忽略,而只有第二個location區塊中定義的指令在location context中有效,這裡只是簡單的提下。
其實Nginx配置不只是這些,還有其它的,畢竟Nginx有很多模組,每個模組可能又有些特殊的配置命令,這裡講得只是一些基本的配置信息,等學得,理解的更深刻後,再逐步補充吧,不正之處歡迎批評指涉!