Nginx基礎詳細講解

Nginx基礎詳細講解

連接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ
提取碼:migq
複製這段內容後打開百度網盤手機App,操做更方便哦php

1.nginx的特色

做爲HTTP服務軟件的後起之秀,Nginx與它的老大哥Apache相比有不少改進之處,好比,在性能上,Nginx佔用的系統資源更少,能支持更多的併發鏈接(特別是靜態小文件場景下),達到更高的訪問效率;在功能上,Nginx不可是一個優秀的Web服務軟件,還能夠做爲反向代理負載均衡及緩存服務使用;在安裝配置上,Nginx更爲方便,簡單,靈活,能夠說,Nginx是一個極具發展潛力的Web服務軟件。html

2.Nginx是什麼?

  • nginx是一個開源的,支持高性能,高併發的www服務和代理服務軟件。
  • nginx因具備高併發(特別是靜態資源),佔用系統資源少等特性,且功能豐富而逐漸流行起來。
  • nginx不可是一個優秀Web服務軟件,還具備反向代理負載均衡功能和緩存服務功能,與lvs負載均衡及Haproxy等專業代理軟件相比,Nginx部署起來更爲簡單,方便;在緩存功能方面,它又相似於Squid等專業的緩存服務軟件。

3.Nginx的重要特性

  • 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)
  • 資源消耗少:在3萬併發鏈接下,開啓10哥Nginx線程消耗的內存不到200MB
  • 能夠作HTTP反向代理及加速緩存,即負載均衡功能,內置對RS節點服務器健康檢查功能,這至關於專業的Haproxy軟件或LVS的功能
  • 具有Squid等專業緩存軟件等的緩存功能。
  • 支持異步網絡I/O事件模型epoll(linux2.6+)

4.Nginx軟件的主要企業功能應用

4.1做爲Web服務軟件

Nginx是一個支持高性能,高併發的Web服務軟件,它具備不少優秀的特性,做爲Web服務器,與Apache相比,Nginx可以支持更多的併發鏈接訪問,但佔用的資源更少,效率更高,在功能上也強大了不少,幾乎不遜色於Apache。前端

4.2反向代理或負載均衡服務

在反向代理或負載均衡服務方面,Nginx能夠做爲Web服務,PHP等動態服務及Memcached緩存的代理服務器,它具備相似專業反向代理軟件(如Haproxy)的功能,同時也是一個優秀的郵件代理服務軟件,可是Nginx的代理功能仍是相對簡單了些,特別是不支持TCP的代理(Nginx1.9.0版本已經開始支持TCP代理了)java

4.3前端業務數據緩存服務

在Web緩存服務方面,Nginx可經過自身的proxy_cache模塊實現類Squid等專業緩存軟件的功能。linux

5.Web 服務產品性能對比測試

從下圖中能夠看出處理靜態小文件(小於1MB時),Nginx和Lighttpd比Apache更有優點,Nginx處理小文件的優點明顯,Lighttpd綜合最強。nginx

image_1cldcg3ena14c0snoi6b61pvr9.png-750.4kB

下圖是各種Web服務器在動態數據性能上的對比,從圖中能夠看出,在處理動態數據時,三者的差距不大,Apache更有優點一點。這是由於處理動態數據的能力取決於PHP(java)和後端數據庫的服務能力,也就是說瓶頸不在Web服務器上。通常狀況下普通PHP引擎支持的併發鏈接參考值爲300~1000,Java引擎和數據庫的併發鏈接參考值爲300~1500.業務場景及網站架構不一樣,併發鏈接數也會有上下浮動。c++

image_1cldchadp195n1qe815td8lnm1m.png-721.9kB

爲何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
開發複雜性

6.nginx的編譯安裝部署

6.1用本地yum倉庫安裝依賴包

[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

6.2建立程序用戶

[root@Nginx /]# useradd -s /sbin/nologin -M www
[root@Nginx /]# id www
uid=500(www) gid=500(www) groups=500(www)

6.3#解壓縮

[root@Nginx yang]# ls
nginx-1.10.2.tar.gz
[root@Nginx yang]# tar xf nginx-1.10.2.tar.gz -C /usr/src/

6.4預配置

[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
如下省略。。。

6.5編譯和安裝

[root@Nginx nginx-1.10.2]# make && make install
如下省略。。。

6.6給命令作軟鏈接,以便PATH能找到

[root@Nginx nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

6.7啓動nginx

[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中止服務命令

7.web排錯三部曲下面介紹客戶端排查的思路

第一步,在客戶端上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服務自身問題,根據輸出在排錯數據庫

8.Nginx主配置文件nginx.conf(修改配置文件)

[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

9.虛擬主機概念和類型介紹

9.1虛擬主機概念

所謂虛擬主機,在Web服務裏就是一個獨立的網站站點(www.baidu.org),這個站點對應獨立的域名(也多是IP或端口),具備獨立的程序及資源目錄,能夠獨立地對外提供服務供用戶訪問。
這個獨立的站點在配置裏是由必定格式的標籤段標記,對於Apache軟件來講,一個虛擬主機的標籤段一般被包含在內,而Nginx軟件則使用一個server{}標籤來標示一個虛擬主機,一個Web服務裏能夠有多個虛擬主機標籤對,即同時能夠支持多個虛擬主機站點。

9.2虛擬主機類型

基於域名的虛擬主機:

  • 所謂基於域名的虛擬主機,意思就是經過不一樣的域名區分不一樣的虛擬主機,基於域名的虛擬主機是企業應用最廣的虛擬主機類型,幾乎全部對外提供服務的網站都是使用基於域名的虛擬主機,例如:www.etiantian.org

基於端口的虛擬主機

  • 同理,所謂基於端口的虛擬主機,意思就是經過不一樣的端口來區分不一樣的虛擬主機,此類虛擬主機對應的企業應用主要爲公司內部的網站,例如:一些不但願直接對外提供用戶訪問的網站後臺等,訪問基於端口的虛擬主機地址裏要帶有端口,例如:http://www.baidu.com:80

基於IP的虛擬主機

  • 同理,所謂基於IP的虛擬主機,意思就是經過不一樣的IP區分不一樣的虛擬主機,此類虛擬主機對應的企業應用很是少見,通常不一樣業務須要使用多IP的場景都會在負載均衡器上進行VIP綁定,而不是在Web上經過綁定IP區分不一樣的虛擬機。
  • 三種虛擬主機類型都可獨立使用,也能夠互相混合一塊兒使用,同窗們應把基於域名的虛擬主機類型看成重點來學習掌握,其餘的兩個類型瞭解便可。

10.項目實戰

10.1項目實戰(1)

10.1.1已知Nginx配置文件

[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;
        }
    }
}

10.1.2平滑重啓Nginx並檢查關閉防火牆

[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  ]

10.1.3修改首頁文件內容

[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

10.1.4Linux 實驗

[root@yangwenbo conf]# curl www.yangwenbo.com
192.168.0.105  www.yangwenbo.com

10.1.5修改windos的映射文件

image_1cldirv39k41gfp11937su1rk41g.png-28.6kB

image_1cldivum2124p1eo71co3dpc1rh71t.png-6.6kB

10.1.6在windos上查看實驗結果

image_1cldj9qbshs2nbn39scbvhm2a.png-23.9kB

10.2項目實戰(2)

10.2.1已知Nginx配置文件

[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;
        }
    }
}

10.2.2平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.2.3普通登陸

[root@yangwenbo html]# curl www.yangwenbo.com
curl: (7) couldn't connect to host    #已沒法正常登陸

10.2.4指定端口登陸

[root@yangwenbo html]# curl www.yangwenbo.com:81 #指定端口爲81(Nginx默認端口爲80)
192.168.0.105  www.yangwenbo.com

10.2.5windos普通登陸

image_1cldqtip8va1k0t18fmmr310oo41.png-40kB

10.2.6windos指定端口登陸

image_1cldr16sd1oni95b1gfam5115nk71.png-20.6kB

10.3項目實戰(3)

10.3.1已知Nginx配置文件

[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;
        }
    }
}

10.3.2平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.3.3在windos上實驗結果

image_1cldoivh01rfc46p1l5jmsc1m5b2n.png-41.2kB

10.3.4修改首頁文件內容

[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

10.3.5再次在windos上實驗結果

image_1cldomi29h5j1hd31lqtt631e8934.png-18.9kB

10.4項目實戰(4)

10.4.1已知Nginx配置文件

[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;
        }
    }
}

10.4.2平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.4.3修改首頁文件內容(如今共計3個域名)

[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

10.4.4Linux 實驗結果(域名)

[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

10.4.5Linux 實驗結果(IP)

[root@yangwenbo html]# curl 192.168.0.105   #只指定IP,默認訪問第一個域名
192.168.0.105  logs.yangwenbo.com

10.5項目實戰(5)

10.5.1已知Nginx配置文件

[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;   #錯誤代碼  
        }
    }
}

10.5.2平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.5.3Linux 實驗結果

[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>

10.6項目實戰(6)

10.6.1建立Nginx副配置文件

[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;
        }
    }

10.6.2已知Nginx主配置文件

[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;
        }
    }
}

10.6.3平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.6.4Linux 實驗結果

[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

10.7項目實戰(7)

10.7.1建立Nginx副配置文件

[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訪問
        }
    }

10.7.2已知Nginx主配置文件

[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;
        }
    }
}

10.7.3加入本機映射文件

[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

10.7.4平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

10.7.5Linux 實驗結果

[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)

11. Nginx location

11.1建立Nginx副配置文件

[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;
    }
  }

11.2已知Nginx主配置文件

[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;
        }
    }
}

11.3平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

11.4實驗以下

11.4.1默認匹配(默認優先級最低)

image_1clivu9v8cir187q15a5t2s15o796.png-15.7kB

11.4.2特殊正則與普通正則

image_1clj2t8q318ic3c1g0lils1n6mbq.png-13.9kB

由此證實:特殊正則優先級高於普通正則

11.4.3普通正則與模糊匹配(字符串前綴匹配)

image_1clj1ldololg1bd573q1i1h1eaga0.png-19.5kB

由此證實:普通正則優先級高於模糊匹配(字符串前綴匹配)

11.4.4精確匹配與特殊正則

image_1clj2qdoan2fp271o2l1fgr15dubd.png-22.9kB

**由此證實:精確匹配優先級高於特殊正則

11.4.5由此能夠得出

image_1clj34nsv1uo7ie3i6p1vfm1fhbcn.png-191.2kB

順序 匹配標識的location 匹配說明
1 " location = / { " 精確匹配
2 " location ^~ /images/ { " 先進行字符串的前綴匹配,若是匹配到就不作正則匹配檢查
3 " loction ~* .(gif jpg jpeg)$ { " 正則匹配,*爲不區分大小寫
4 " location /documents/ { " 匹配常規字符串,模糊匹配,若是有正則檢查,正則優先
5 " location / { " 全部location都不能匹配後的默認匹配原則

12.Nginx rewrite 語法

12.1regex經常使用正則表達式說明

字符 描述
/ 將後面接着的字符標記爲一個特殊字符或一個原義字符或一個向後引用。例如,「\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屬性獲取小括號中的匹配內容。要匹配圓括號字符,請使用「(」或「)」

12.2rewrite指令的最後一項參數flag標記的說明

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標記則會在本條規則匹配完成後,終止匹配,再也不匹配後面的規則。

12.3Nginx rewrite 的企業應用場景

  • 能夠調整用戶瀏覽的URL,使其看起來更規範,合乎開發及產品人員的需求。
  • 爲了讓搜索引擎收錄網站內容,並讓用戶體驗更好,企業會將動態URL地址假裝成靜態地址提供服務
  • 網站換新域名後,讓舊域名的訪問跳轉到新的域名上,例如:讓京東的360buy換成了jd.com
  • 根據特殊變量,目錄,客戶端的信息進行URL跳轉等。

13.Nginx訪問認證

13.1安裝依賴軟件包

[root@yangwenbo /]# yum -y install httpd
[root@yangwenbo /]# which htpasswd
/usr/bin/htpasswd

13.2使用apache的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       #帳號密碼是加密的

13.3在虛擬主機配置文件里加入兩條配置信息

[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    #驗證的用戶文件(後邊根帳號密碼文件的絕對路徑)
        }
    }

13.4平滑重啓Nginx

[root@yangwenbo conf]# /usr/local/nginx/sbin/nginx -s reload

13.5實際演練

image_1cljd2m3lm061ttu1hi8rc61qh09.png-38.5kB

13.6演練結果

image_1cljd4gpg1l93hkc69pvv79hi16.png-14.8kB

14.Nginx相關問題解答

14.1Tengine和Nginx是什麼關係?

Tengine是淘寶開源Nginx的分支,官方站點爲http://tengine.taobao.org/

14.2訪問Nginx時出現狀態碼「403 forbidden」的緣由

Nginx配置文件裏沒有配置默認首頁參數,或者首頁文件在站點目錄下沒有以下內容:index index.php index.html index.htm;

  • 系統默認403特殊報錯,若是在配置文件里加上autoindex on;在瀏覽器上就能夠訪問根下全部目錄文件,甚至下載,極度危險!!!

  • 站點目錄或內部的程序文件沒有Nginx用戶訪問權限
  • Nginx配置文件中設置了allow,deny等權限控制,致使客戶端沒有訪問權限。
相關文章
相關標籤/搜索