Nginx服務應用javascript
Nginx的優勢和做用css
Nginx是一款高性能的HTTP和反向代理的服務器軟件,仍是一個IMAP/POP3/SMTP(郵件)代理服務器!html
Nginx在功能實現上都採用模塊化結構設計,都支持通用的語言接口,如PHP,Perl,python等,同時還支持正向和反向代理,虛擬主機,URL重寫,壓縮傳輸,SSL加密傳輸等。前端
Nginx和Apache的區別:最大的差異是Apache的處理速度很慢,並且佔用不少內存資源,而Nginx正好相反。在功能實現上,Apache的全部模塊都支持動,靜態編譯的,而Nginx都是靜態編譯的,Nginx對Fcgi的支持很是好;在處理鏈接方式上,Nginx支持epoll,Nginx的安裝包很是小,只有幾百KM。java
Nginx採用分階段資源分配技術,使得CPU和內存的佔用率很是低,Nginx保持10000個沒有活動的鏈接,只佔用2.5MB內存,所一,相似DOS這樣的攻擊對Nginx沒有任何做用。node
Nginx採用內核poll模型,能夠支持更多的併發鏈接,最大能夠支持50000個併發鏈接數的響應,並且只佔用很低的內存資源!python
在高可用方面,Nginx支持熱部署,啓動速度特別迅速,所以能夠不間斷服務的狀況下,對軟件版本或配置進行升級,即便運行數月也無需從新啓動,幾乎能夠作到7X24小時不間斷的運行。linux
Nginx的工做模塊和原理nginx
Nginx由內核和模塊組成,其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用於URL匹配),而這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。正則表達式
Nginx的模塊從結構上分爲核心模塊,基礎模塊和第三方模塊,
核心模塊:HTTP模塊,ECENT模塊和MAIL模塊等。
基礎模塊:HTTP Access模塊,HTTP FastCGI模塊,HTTP Proxy模塊和HTTP Rewrite模塊。
第三方模塊:HTTP Upstream Request Hash模塊,Notice模塊和HTTP Access模塊,用戶根據本身的須要開發的模塊都屬於第三方模塊。
Nginx的模塊從功能上分爲三類
Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。handres處理器模塊通常只能有一個。
Filters(過濾器模塊)。此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後又Nginx輸出。
Proxies(代理類模塊)。此類模塊式Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。
Nginx的工做原理
HTTP發出請求---Nginx內核-----選擇一個Handlers處理器模塊-----handlers(處理器模塊)---生成內容---Filters(過濾器模塊1)---處理內容---Filters(過濾器模塊2)---Filters(過濾器模塊N)---HTTP響應請求
工做方式:單工做進程和多工程進程兩種模式。在單工做進程模式下,處主進程外,還有一個工做進程,工做進程是單線程的;在多工做進程模式下,每一個工做進程包含多個線程。Nginx默認爲單工做進程模式。
Nginx的模塊是直接編譯進去Nginx,所以屬於靜態編譯方式。啓動Nginx後,模塊被自動加載!在解析配置文件時,Nginx的每一個模塊都有可能去處理某個請求,可是同一個處理請求只能由一個模塊來完成。
Nginx的安裝
Nginx只能經過源碼包編譯安裝,在安裝Nginx之間,咱們須要安裝Nginx依賴的軟件:gcc,openssl-devel,pcre,zlib-devel。
在默認狀況下,經過編譯安裝的Nginx包含大部分可用模塊,Nginx支持哪些模塊,咱們能夠經過./configure –help查看nginx支持的全部模塊
[root@localhost nginx-1.2.1]# ./configure --help
--prefix=PATH set installation prefix #指定nginx的安裝路徑
--user=USER set non-privileged user for #指定用來運行nginx的用戶
worker processes
--group=GROUP set non-privileged group for #指定運行nginx的組
worker processes
在安裝時候,咱們推薦開啓NginxStatus和HTTPGzip模塊,在編譯安裝的時候加上--with-http_stub_status_module和--with-http_gzip_static_module。
Nginx配置文件結構
Nginx的配置文件是一個純文本文件,它通常位於Nginx安裝目錄的conf目錄下,整個配置文件是以block的形式組織的。每一個block以「{}」來表示。block能夠分爲幾回層次,整個配置文件中Main位於最高層,在Main下面有Events(項目),HTTP等層級,而在HTTP層中又包括Server層,即server block,server block又能夠分爲location(位置)層,而且一個server block中能夠包含多個location block。
一個完整的Nginx服務的配置文件結構如圖:
Nginx配置文件詳解
nginx配置文件主要分紅四個部分:main(全局配置),server(主機配置),upstream(負載均衡服務器設置)和location(URL匹配特定位置的設置)。main部分設置的命令將影響到其餘全部設置;server部分的命令主要用於指定主機和端口;upstream命令主要用於負載均衡,設置一系列的後端服務器;location部分用於匹配網頁位置。這四者之間的關係是:server繼承main,location繼承server,upstream既不會繼承也不會被繼承。
在這四個部分中,每一個部分都包含若干命令,這些命令主要包含Nginx的主模塊命令,事件模塊命令,HTTP核心模塊命令,同時每一個部分還可使用其餘HTTP模塊命令,例於:Http SSL模塊,HttpGzip Static模塊和Http Addition模塊等。
user nobody nobody;
worker_processes 4;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65535;
}
解釋:
user是個主模塊指令,指定Nginx worker進程運行用戶以及用戶組,默認的用戶和用戶組都是nobody運行。
worker_processes是個主模塊指令,指定Nginx要開啓的進程數,每一個Nginx進程平均耗費10M-12M內存,根據經驗,通常指定一個進程足夠了,若是是多核CPU,建議指定和CPU的數量同樣多的進程數便可。
error_log是個主模塊指令,用來定義全局錯誤日誌文件。日誌輸出級別有debug,info,notice,warn,error,crit可供選擇,其中debug輸出日誌最爲詳細,而crit輸出日誌最少。
pid:用來指定進程id的存儲文件位置。
worker_rlimit_nofile:用於綁定worker進程和CPU,linux內核2.4以上可用。
events:設定Nginx的工做模式及鏈接數上限。其中參數「use」用來指定nginx的工做模式,nginx支持的工做模式有select,poll(選舉),kqueue(隊列),epoll,rtsig和/dev/poll。其中select和poll都是標準的工做模式,kqueue和epoll是高效的工做模式,對於Linux系統,epoll工做模式是首選。而參數」worker_connections」用於定義每一個進程的最大鏈接數,默認是1024。因此,一個nginx服務的的最大客戶端的鏈接數爲:worker_processes*worker_connections.進程的最大鏈接數受linux系統進程的最大打開文件數限制,在執行操做系統命令「ulimit –n 65535」更改能夠打開的最大文件的數量(臨時有效,因此咱們須要將命令加入到啓動nginx用戶的啓動腳本中),worker_connections纔會生效。
#對於root用戶而言,咱們直接修改ulimit=65535是沒有一點問題的,可是普通用戶就會報錯Socket/File: Can’t open so many files,普通用戶無權限修改這個值:因此咱們應該最正確的修改方法是:
# vim /etc/security/limits.conf
#<domain> <type> <item> <value>
* soft nofile 32768
* hard nofile 65536
在配置文件中將文件句柄限制修改成軟:32768,硬:65536,配置在前面的domain,*號是表明全部,固然你也能夠對單個用戶進行設置。在這個當中,硬限制纔是實際的顯示,而軟限制,只是warnning限制,只會作出警告,ulimit命令自己也有軟硬之分,加-H就是硬,-S就是軟。
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
釋:
include:主模塊命令,實現對配置文件所包含文件的設定,能夠減小主配置文件的複雜度,相似於Apache中的include方法。
default_type:屬於HTTP核心模塊命令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例於,在沒配置PHP環境時,Nginx是不會解析的,用瀏覽器訪問PHP文件時會出現下載窗口。
log_format:用於指定nginx日誌的輸出格式。main爲此日誌輸出格式的名稱,能夠在下面的access_log命令中引用。
client_max_body_size:用來設置容許客戶端請求的最大的單個文件字節數。
client_header_buffer_size:用於指定來自客戶端請求頭的headerbuffer大小。對於大多數請求,1KB的緩衝區大小已經夠了,若是自定義了消息頭或有更大的cookie,能夠增長緩衝區大小。這裏設置爲32KB。
large_client_header_buffer:用來指定客戶端請求中較大的消息頭的緩存最大數量和大小,「4」爲個數,「128K」爲大小,最大緩存量爲4個128KB。
sendfile:用於開啓高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個命令設置爲「on」用於防止網絡阻塞。
keepalive_timeout:設置客戶端鏈接保持活動的超時時間。在超過這個時間以後,服務器會關閉該鏈接。
client_header_tomeout:設置客戶端請求頭讀取超時時間。若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Request time out(408)」錯誤。
client_body_timeout:設置客戶端請求主體讀取超時時間。若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Request time out(408)」錯誤,默認值是60。
send_timeout:設定響應客戶端的超時時間。這個超時僅限於兩個連接活動之間的時間,若是超過這個時間,客戶端沒有任何活動,Nginx將會關閉鏈接。
httpgzip模塊相關屬性設置:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
釋:
gzip:用於設置開啓或者關閉gzip模塊。開啓gzip壓縮,實時壓縮輸出的數據流。
gzip_min_length:設置容許壓縮的頁面最小字節數,頁面字節數從header(數據頭)頭的Content-length(內容長度)中獲取。默認值是0,無論頁面多大都進行壓縮。建議設置成大於1KB的字節數,小於1KB可能會越壓越大。
gzip_buffers:表示申請4個單位爲16kb的內存做爲壓縮結果流緩存。默認是申請與原始數據大小相同的內存空間來存儲GZIP壓縮結果。
gzip_http_version:用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可。
gzip_comp_level:用於指定gzip壓縮比,1表示壓縮比最小,處理速度最快;9表示壓縮比最大,傳輸速度快,但處理速度最慢,也比較消耗CPU資源。
gzip_types:用來指定壓縮的類型,不管是否指定,「text/html」類型老是會被壓縮。
gzip_vary:讓前端的緩存服務器緩存通過gzip壓縮的頁面,例於用Squid(代理和緩存服務器)緩存通過Nginx壓縮的數據。
虛擬主機的配置:
server {
listen 80;
server_name www.gxl.com;
index index.html index.htm index.jsp;
root html;
charset gb2312;
access_log logs/host.access.log main;
釋:
建議將對虛擬主機進行配置的內容寫進另一個文件,而後經過include(包含)命令包含進來,這樣更利於維護和管理。配置虛擬主機代碼中每一個參數的含義。
server:定義虛擬主機開始的關鍵字。
listen:用於指定虛擬主機的服務端口。
server_name:用來指定ip地址和域名,多個域名之間用空格分開。
index:用於設定訪問的默認首頁地址。
root:用於指定虛擬主機的網頁根目錄,這個目錄能夠是相對路徑,也能夠是絕對路徑。
charset:用於設置網頁的默認編碼格式。
assess_log:用來指定此虛擬主機的訪問日誌存放路徑,最後的man用於指定訪問日誌的輸出格式。
URL地址匹配設置:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #.*\.gif 就是匹配當前目錄下全部*.gif文件。 . 當前目錄 * 通配符 \. 轉義符,使後面這個點沒有特需含義
root html;
expires 30d;
}
釋(文件):
URL地址匹配是nginx配置中最靈活的部分。經過location關鍵字定義了地址匹配的開始。location支持正則表達式,也支持條件判斷匹配。用戶能夠經過location命令實現nginx對動態,靜態網頁進行過濾處理。
在上面這段location代碼中,全部以擴展名以.gif,.jpg…..等等結尾的靜態文件都交給Nginx處理,而expires用來指定靜態文件的過時時間,這裏是30天。
location ~ ^/(upload|html) {
root html;
expires 30d;
}
釋(目錄):
這段代碼是將upload和html目錄下的全部文件都交給nginx處理,而這兩個目錄實在html目錄下的。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://locahost:8080;
}
釋:
這段代碼中,經過location關鍵字將全部以.jsp關鍵字爲後綴的文件都交給本機的8080端口處理。這樣就能夠實現nginx的動靜態分離,而爲何是8080端口勒?由於通常咱們都須要搭建tomcat服務,而8080端口就是tomcat服務的端口。
Nginx運行狀態,StubStatus模塊可以獲取nginx自上次啓動以來的工做狀態:
location /NginxStatus {
stub_status on;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file ../htpsswd;
}
釋:
stub_status:是否啓用StubStatus的工做狀態統計功能
access_log:用來指定StubStatus模塊的訪問日誌功能
auth_basic:是nginx的一種認證機制
auth_basic_user_file:用來指定認證的密碼文件
因爲nginx的auth_basic認證採用的是與Apache兼容的密碼文件,所以須要用htpasswd命令來生成密碼文件:
htpasswd -c /usr/local/nginx/conf/htpasswd admin
設置user成功之後,咱們重啓一下服務,而後在瀏覽器中http://IP/NginxStatus訪問
Active connections:表示當前活躍鏈接數
第三行的上那個數字分別表示:當前總共處理鏈接的次數;成功建立握手次數;處理請求次數
reading:表示nginx讀取到客戶端header(信息頭)信息數 writing:表示nginx返回給客戶端header信息數 waiting:表示nginx已處理完,正在等候下一次請求命令時的駐留鏈接數。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
釋:
經過page命令能夠定製各類錯誤信息的返回頁面。在默認狀況下,nginx會在主目錄html目錄中查找指定的返回頁面。須要特別注意的是,這些錯誤信息的返回頁面信息的大小必定要超過512KB,不然會被IE替換成本身默認的。