連接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ
提取碼:migq
複製這段內容後打開百度網盤手機App,操做更方便哦php
做爲HTTP服務軟件的後起之秀,Nginx與它的老大哥Apache相比有不少改進之處,好比,在性能上,Nginx佔用的系統資源更少,能支持更多的併發鏈接(特別是靜態小文件場景下),達到更高的訪問效率;在功能上,Nginx不可是一個優秀的Web服務軟件,還能夠做爲反向代理負載均衡及緩存服務使用;在安裝配置上,Nginx更爲方便,簡單,靈活,能夠說,Nginx是一個極具發展潛力的Web服務軟件。html
- nginx是一個開源的,支持高性能,高併發的www服務和代理服務軟件。
- nginx因具備高併發(特別是靜態資源),佔用系統資源少等特性,且功能豐富而逐漸流行起來。
- nginx不可是一個優秀Web服務軟件,還具備反向代理負載均衡功能和緩存服務功能,與lvs負載均衡及Haproxy等專業代理軟件相比,Nginx部署起來更爲簡單,方便;在緩存功能方面,它又相似於Squid等專業的緩存服務軟件。
- 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)
- 資源消耗少:在3萬併發鏈接下,開啓10哥Nginx線程消耗的內存不到200MB
- 能夠作HTTP反向代理及加速緩存,即負載均衡功能,內置對RS節點服務器健康檢查功能,這至關於專業的Haproxy軟件或LVS的功能
- 具有Squid等專業緩存軟件等的緩存功能。
- 支持異步網絡I/O事件模型epoll(linux2.6+)
Nginx是一個支持高性能,高併發的Web服務軟件,它具備不少優秀的特性,做爲Web服務器,與Apache相比,Nginx可以支持更多的併發鏈接訪問,但佔用的資源更少,效率更高,在功能上也強大了不少,幾乎不遜色於Apache。前端
在反向代理或負載均衡服務方面,Nginx能夠做爲Web服務,PHP等動態服務及Memcached緩存的代理服務器,它具備相似專業反向代理軟件(如Haproxy)的功能,同時也是一個優秀的郵件代理服務軟件,可是Nginx的代理功能仍是相對簡單了些,特別是不支持TCP的代理(Nginx1.9.0版本已經開始支持TCP代理了)java
在Web緩存服務方面,Nginx可經過自身的proxy_cache模塊實現類Squid等專業緩存軟件的功能。linux
從下圖中能夠看出處理靜態小文件(小於1MB時),Nginx和Lighttpd比Apache更有優點,Nginx處理小文件的優點明顯,Lighttpd綜合最強。nginx
下圖是各種Web服務器在動態數據性能上的對比,從圖中能夠看出,在處理動態數據時,三者的差距不大,Apache更有優點一點。這是由於處理動態數據的能力取決於PHP(java)和後端數據庫的服務能力,也就是說瓶頸不在Web服務器上。通常狀況下普通PHP引擎支持的併發鏈接參考值爲300~1000,Java引擎和數據庫的併發鏈接參考值爲300~1500.業務場景及網站架構不一樣,併發鏈接數也會有上下浮動。c++
爲何Nginx整體性能比Apache高?web
- Nginx使用最新的epoll(Linux2.6內核)和kqueue(freebsd)異步網絡I/O模型,而Apache使用的是傳統的select模型。目前Linux下可以承受高併發訪問的Squid,Memcached軟件採用的都是epoll模型。
- 處理大量鏈接的讀寫時,Apache所採用的select網絡I/O模型比較低效
指標 | select(同步網絡I/O模型) | epoll(異步網絡I/O模型) |
---|---|---|
性能 | 隨着鏈接數的增長性能急劇降低。處理成千上萬併發鏈接數時,性能不好 | 隨着鏈接數的增長,性能基本上沒有降低。處理成千上萬併發鏈接時,性能很好 |
鏈接數 | 鏈接數有限制,處理的最大鏈接數不超過1024。若是要處理的鏈接數超過1024個,則須要修改FD SETSIZE宏,並從新編譯 | 鏈接數無限制 |
內在處理機制 | 線性輪詢 | 回調callback |
開發複雜性 | 低 | 中 |
[root@Nginx /]# yum install -y pcre-devel openssl-devel gcc gcc-c++ make curl [root@Nginx /]# rpm -qa pcre-devel openssl-devel gcc gcc-c++ make curl openssl-devel-1.0.1e-15.el6.x86_64 gcc-4.4.7-4.el6.x86_64 gcc-c++-4.4.7-4.el6.x86_64 pcre-devel-7.8-6.el6.x86_64 make-3.81-20.el6.x86_64 curl-7.19.7-37.el6_4.x86_64
[root@Nginx /]# useradd -s /sbin/nologin -M www [root@Nginx /]# id www uid=500(www) gid=500(www) groups=500(www)
[root@Nginx yang]# ls nginx-1.10.2.tar.gz [root@Nginx yang]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
[root@Nginx yang]# cd /usr/src/nginx-1.10.2/ [root@Nginx nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 如下省略。。。
[root@Nginx nginx-1.10.2]# make && make install 如下省略。。。
[root@Nginx nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@Nginx nginx-1.10.2]# /usr/local/nginx/sbin/nginx
特別提示:正則表達式
/usr/local/nginx/sbin/nginx
nginx啓動/usr/local/nginx/sbin/nginx -s reload
nginx平滑重啓命令/usr/local/nginx/sbin/nginx -s stop
nginx中止服務命令
第一步,在客戶端上ping服務器端IP,命令以下:
ping 10.0.0.8
排除物理線路問題影響
第二步,在客戶端上telnet服務器端IP,端口,命令以下:
telnet 10.0.0.8 80
排除防火牆等得影響
第三步,在客戶端使用wget命令檢測,以下:
wget 10.0.0.8(curl -I 10.0.0.8)
模擬用戶訪問,排除http服務自身問題,根據輸出在排錯數據庫
[root@yangwenbo conf]# pwd /usr/local/nginx/conf [root@yangwenbo conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf [root@yangwenbo conf]# cat nginx.conf worker_processes 1; #worker進程的數量(服務器有幾核就寫幾,不能超過核說的二倍) events { #事件區塊開始 worker_connections 20480; #每一個worker進程支持的最大鏈接數的線程 } #事件區塊結束 http { #http區塊開始 include mime.types; #Nginx支持的媒體類型庫文件包含(是把mime.types文件裏的內容導入到當前位置,與把mime.types裏的文件內容直接寫入當前效果是同樣的) default_type application/octet-stream; #默認的媒體類型 sendfile on; #開啓文件的高效傳輸功能 keepalive_timeout 65; #默認連接保持65秒 server { #網站配置區域(一個server就表明一個虛擬網站) listen 80; #提供服務的端口,默認80 server_name localhost; #提供服務的「域名」(網頁名) location / { root html; #網頁的根目錄路徑 index index.html index.htm; #首頁 #首頁文件 } } }
修改系統最大打開文件數
[root@yangwenbo ~]# ulimit -n #查看系統最大同時能夠打開幾個文件 1024 [root@yangwenbo ~]# ulimit -n 20480 20480 #臨時修改系統最大同時打開文件的上限 [root@yangwenbo ~]# ulimit -n #即時生效 20480
所謂虛擬主機,在Web服務裏就是一個獨立的網站站點(www.baidu.org),這個站點對應獨立的域名(也多是IP或端口),具備獨立的程序及資源目錄,能夠獨立地對外提供服務供用戶訪問。
這個獨立的站點在配置裏是由必定格式的標籤段標記,對於Apache軟件來講,一個虛擬主機的標籤段一般被包含在內,而Nginx軟件則使用一個server{}標籤來標示一個虛擬主機,一個Web服務裏能夠有多個虛擬主機標籤對,即同時能夠支持多個虛擬主機站點。
基於域名的虛擬主機:
- 所謂基於域名的虛擬主機,意思就是經過不一樣的域名區分不一樣的虛擬主機,基於域名的虛擬主機是企業應用最廣的虛擬主機類型,幾乎全部對外提供服務的網站都是使用基於域名的虛擬主機,例如:www.etiantian.org
基於端口的虛擬主機
- 同理,所謂基於端口的虛擬主機,意思就是經過不一樣的端口來區分不一樣的虛擬主機,此類虛擬主機對應的企業應用主要爲公司內部的網站,例如:一些不但願直接對外提供用戶訪問的網站後臺等,訪問基於端口的虛擬主機地址裏要帶有端口,例如:http://www.baidu.com:80
基於IP的虛擬主機
- 同理,所謂基於IP的虛擬主機,意思就是經過不一樣的IP區分不一樣的虛擬主機,此類虛擬主機對應的企業應用很是少見,通常不一樣業務須要使用多IP的場景都會在負載均衡器上進行VIP綁定,而不是在Web上經過綁定IP區分不一樣的虛擬機。
- 三種虛擬主機類型都可獨立使用,也能夠互相混合一塊兒使用,同窗們應把基於域名的虛擬主機類型看成重點來學習掌握,其餘的兩個類型瞭解便可。
[root@yangwenbo conf]# pwd /usr/local/nginx/conf [root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; #修改域名 location / { root html; index index.html index.htm; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload #平滑重啓Nginx [root@yangwenbo conf]# service iptables stop #關閉防火牆 iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ]
[root@yangwenbo html]# pwd /usr/local/nginx/html [root@yangwenbo html]# ls 50x.html index.html [root@yangwenbo html]# rm -rf * [root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" > index.html [root@yangwenbo html]# cat index.html 192.168.0.105 www.yangwenbo.com [root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" >> /etc/hosts #追加到映射文件裏 [root@yangwenbo html]# cat /etc/hosts | tail -1 192.168.0.105 www.yangwenbo.com
[root@yangwenbo conf]# curl www.yangwenbo.com 192.168.0.105 www.yangwenbo.com
[root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 81; #修改其端口爲81 server_name www.yangwenbo.com; location / { root html; index index.html index.htm; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo html]# curl www.yangwenbo.com curl: (7) couldn't connect to host #已沒法正常登陸
[root@yangwenbo html]# curl www.yangwenbo.com:81 #指定端口爲81(Nginx默認端口爲80) 192.168.0.105 www.yangwenbo.com
[root@yangwenbo conf]# pwd /usr/local/nginx/conf [root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; location / { root html/yang; #修改根目錄路徑爲yang index index.html index.htm; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo html]# pwd /usr/local/nginx/html [root@yangwenbo html]# ls index.html [root@yangwenbo html]# rm -rf * [root@yangwenbo html]# mkdir yang [root@yangwenbo html]# echo "`hostname -I` www.yangwenbo.com" > yang/index.html [root@yangwenbo html]# cat yang/index.html 192.168.0.105 www.yangwenbo.com
[root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name logs.yangwenbo.com; location / { root html/bo; index index.html index.htm; } } server { listen 80; server_name 123.yangwenbo.com; location / { root html/wen; index index.html index.htm; } } server { listen 80; server_name www.yangwenbo.com; location / { root html/yang; index index.html index.htm; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo html]# pwd /usr/local/nginx/html [root@yangwenbo html]# ls yang [root@yangwenbo html]# mkdir bo [root@yangwenbo html]# echo "`hostname -I` logs.yangwenbo.com" > bo/index.html [root@yangwenbo html]# cat bo/index.html 192.168.0.105 logs.yangwenbo.com [root@yangwenbo html]# echo "`hostname -I` logs.yangwenbo.com" >> /etc/hosts #追加到映射文件裏 [root@yangwenbo html]# cat /etc/hosts | tail -1 192.168.0.105 logs.yangwenbo.com [root@yangwenbo html]# mkdir wen [root@yangwenbo html]# echo "`hostname -I` 123.yangwenbo.com" > wen/index.html [root@yangwenbo html]# cat wen/index.html 192.168.0.105 123.yangwenbo.com [root@yangwenbo html]# echo "`hostname -I` 123.yangwenbo.com" >> /etc/hosts #追加到映射文件裏 [root@yangwenbo html]# cat /etc/hosts | tail -1 192.168.0.105 123.yangwenbo.com
[root@yangwenbo html]# curl logs.yangwenbo.com 192.168.0.105 logs.yangwenbo.com [root@yangwenbo html]# curl 123.yangwenbo.com 192.168.0.105 123.yangwenbo.com [root@yangwenbo html]# curl www.yangwenbo.com 192.168.0.105 www.yangwenbo.com
[root@yangwenbo html]# curl 192.168.0.105 #只指定IP,默認訪問第一個域名 192.168.0.105 logs.yangwenbo.com
[root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; location / { root html/bo; index index.html index.htm; } } server { listen 80; server_name 123.yangwenbo.com; location / { root html/wen; index index.html index.htm; } } server { #防黑域名 listen 80 default_server; #IP用戶訪問默認進入此頁面 server_name logs.yangwenbo.com; location / { return 403; #錯誤代碼 } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo html]# curl www.yangwenbo.com 192.168.0.105 www.yangwenbo.com [root@yangwenbo html]# curl 123.yangwenbo.com 192.168.0.105 123.yangwenbo.com [root@yangwenbo html]# curl 192.168.0.105 #只要是IP訪問都是此頁面 <html> <head><title>403 Forbidden</title></head> <body bgcolor="white"> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.10.2</center> </body> </html>
[root@yangwenbo conf]# pwd /usr/local/nginx/conf [root@yangwenbo conf]# mkdir extar [root@yangwenbo conf]# cat extar/www.conf server { listen 80; server_name www.yangwenbo.com; location / { root html/bo; index index.html index.htm; } } [root@yangwenbo conf]# cat extar/123.conf server { listen 80; server_name 123.yangwenbo.com; location / { root html/wen; index index.html index.htm; } }
[root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include extar/www.conf; #文件導入 include extar/123.conf; #文件導入 server { listen 80 default_server; server_name logs.yangwenbo.com; location / { return 403; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo conf]# curl www.yangwenbo.com 192.168.0.105 www.yangwenbo.com [root@yangwenbo conf]# curl 123.yangwenbo.com 192.168.0.105 123.yangwenbo.com
[root@yangwenbo conf]# cat extar/status.conf server { listen 80; server_name status.yangwenbo.com; location / { stub_status on; #開啓狀態信息功能 access_log off; #不記錄訪問日誌 allow 192.168.0.105; #只容許某IP地址訪問 deny all; #禁止其餘IP訪問 } }
[root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include extar/www.conf; include extar/123.conf; include extar/status.conf; #文件導入 server { listen 80 default_server; server_name logs.yangwenbo.com; location / { return 403; } } }
[root@yangwenbo conf]# echo "`hostname -I` status.yangwenbo.com" >> /etc/hosts [root@yangwenbo conf]# cat /etc/hosts | tail -1 192.168.0.105 status.yangwenbo.com
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
[root@yangwenbo conf]# curl status.yangwenbo.com Active connections: 1 #處於活動中的鏈接爲1個(最低一個) server accepts handled requests 92 92 60 Reading: 0 Writing: 1 Waiting: 0
以上所示詳解
- 第一個server表示Nginx啓動到如今1共處理了92個鏈接
- 第二個accepts表示Nginx啓動到如今共成功建立了92次握手
- 請求丟失數=(握手數-鏈接數),能夠看出,本次狀態顯示沒有丟失請求。
- 第三個handled requests,表示總共處理了60次請求。
- Reading爲Nginx讀取到客戶端的Header信息數
- Writing爲Nginx返回給客戶端的Header信息數
- Waiting爲Nginx已經處理完正在等候下一次請求指令的駐留鏈接。在開啓keep-alive的狀況下,這個值等於active - (reading+writing)
[root@yangwenbo extar]# pwd /usr/local/nginx/conf/extar [root@yangwenbo extar]# cat y.conf server { listen 80; server_name www.yunjisuan.com; location / { #默認匹配 return 401; } location = /images/ { #精確匹配 return 402; } location /documents/ { #模糊匹配(字符串前綴匹配,必須從根開始) return 404; } location ^~ /images/ { #特殊正則匹配 return 501; } location ~* \.(gif|jpg|jpeg)$ { #普通正則匹配 return 500; } }
[root@yangwenbo conf]# pwd /usr/local/nginx/conf [root@yangwenbo conf]# cat nginx.conf worker_processes 1; events { worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; include extar/y.conf; #文件導入 server { listen 80 default_server; server_name logs.yangwenbo.com; location / { return 403; } } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
由此證實:特殊正則優先級高於普通正則
由此證實:普通正則優先級高於模糊匹配(字符串前綴匹配)
**由此證實:精確匹配優先級高於特殊正則
順序 | 匹配標識的location | 匹配說明 |
---|---|---|
1 | " location = / { " | 精確匹配 |
2 | " location ^~ /images/ { " | 先進行字符串的前綴匹配,若是匹配到就不作正則匹配檢查 |
3 | " loction ~* .(gif jpg jpeg )$ { " |
正則匹配,*爲不區分大小寫 |
4 | " location /documents/ { " | 匹配常規字符串,模糊匹配,若是有正則檢查,正則優先 |
5 | " location / { " | 全部location都不能匹配後的默認匹配原則 |
字符 | 描述 |
---|---|
/ | 將後面接着的字符標記爲一個特殊字符或一個原義字符或一個向後引用。例如,「\n」匹配一-個換行符,序列「 」和「$」則匹配「$」 |
^ | 匹配輸人字符串的起始位置,若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「r以後的位置 |
$ |
匹配輸入字符串的結束位置,若是設置了RegExp對象的Multiline屬性,$ 也匹配「\n」 或「\r」$ 以前的位置 |
* | 匹配前面的字符零次或屢次,例如,01能匹配「0」及「0111",等價於{0,} |
+ | 匹配前面的字符一次或屢次,例如,「01+」 能匹配「01」及「011", 但不能匹配「0」, .+等價於{1,} |
? | (1)匹配前面的字符零次或一次,例如,「do(es)?」能夠匹配「do」或「does」中的「do",.?等價於{0,1}。 |
? | (2)當該字符緊跟在任何一個其餘限制符( *.+?. {n},{n}, {n,m})的後面時,匹配模式是非貪婪模式的,非貪婪模式會盡量少地匹配所搜索的字符串,而默認的貪婪模式則會盡量多地匹配所搜索的字符串,例如,對於字符串「0000」 ,「o+?」將匹配單個「o」. 而「o+」 將匹配全部「o」 |
. | 匹配除「\n」以外的任何單個字符,要匹配包括「\n」在內的任何字符,請使用像「[\m]」這樣的模式 |
( pattern ) | 匹配括號內的pattern,並能夠在後面獲取對應的匹配,經常使用$0..$9 屬性獲取小括號中的匹配內容。要匹配圓括號字符,請使用「(」或「)」 |
flag標記符號 | 說明 |
---|---|
last | 本條規則匹配完成後,繼續向下匹配新的location URI規則 |
break | 本條規則匹配完成即終止,再也不匹配後面的任何規則 |
redirect | 返回302臨時重定向,瀏覽器地址欄不會顯示跳轉後的URL地址 |
permanent | 返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址 |
- 在以上的flag標記中,last和break用來實現URL重寫,瀏覽器地址欄的URL地址不變,但在服務器端訪問的程序及路徑發生了變化。redirect和permanent用來實現URL跳轉,瀏覽器地址欄會顯示跳轉後的URL地址。
- last和break標記的實現功能相似,但兩者之間有細微的差異,使用alias指令時必須用last標記,使用proxy_pass指令時要使用break標記。last標記在本條rewrite規則執行完畢後,會對其所在的server{...}標籤從新發起請求,而break標記則會在本條規則匹配完成後,終止匹配,再也不匹配後面的規則。
- 能夠調整用戶瀏覽的URL,使其看起來更規範,合乎開發及產品人員的需求。
- 爲了讓搜索引擎收錄網站內容,並讓用戶體驗更好,企業會將動態URL地址假裝成靜態地址提供服務
- 網站換新域名後,讓舊域名的訪問跳轉到新的域名上,例如:讓京東的360buy換成了jd.com
- 根據特殊變量,目錄,客戶端的信息進行URL跳轉等。
[root@yangwenbo /]# yum -y install httpd [root@yangwenbo /]# which htpasswd /usr/bin/htpasswd
[root@yangwenbo /]# htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 123123 #htpasswd是文件的名字 Adding password for user yunjisuan [root@yangwenbo /]# cat /usr/local/nginx/conf/htpasswd yunjisuan:msULyJwjSSlEY #帳號密碼是加密的
[root@yangwenbo extar]# pwd /usr/local/nginx/conf/extar [root@yangwenbo extar]# cat status.conf server { listen 80; server_name status.yangwenbo.com; location / { stub_status on; access_log off; auth_basic "welcome to yangwenbo"; auth_basic #驗證的基本信息選項(後邊跟着的雙引號裏就是驗證窗口的名字) auth_basic_user_file /usr/local/nginx/conf/htpasswd; #auth_basic_user_file #驗證的用戶文件(後邊根帳號密碼文件的絕對路徑) } }
[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload
Tengine是淘寶開源Nginx的分支,官方站點爲http://tengine.taobao.org/
Nginx配置文件裏沒有配置默認首頁參數,或者首頁文件在站點目錄下沒有以下內容:
index index.php index.html index.htm;
- 系統默認403特殊報錯,若是在配置文件里加上
autoindex on;
在瀏覽器上就能夠訪問根下全部目錄文件,甚至下載,極度危險!!!
- 站點目錄或內部的程序文件沒有Nginx用戶訪問權限
- Nginx配置文件中設置了allow,deny等權限控制,致使客戶端沒有訪問權限。