nginx服務企業應用

慘綠少年發表於2017-10-29

1.1 常用來提供靜態服務的軟體

  Apache :這是中小型Web服務的主流,Web伺服器中的老大哥,

  Nginx :大型網站Web服務的主流,曾經Web伺服器中的初生牛犢,現已長大。

  Nginx 的分支 Tengine ( http://tengine.taobao.org/)目前也在飛速發展•

Lighttpd :這是一個不溫不火的優秀 Web軟體,社群不活躍,靜態解析效率很高. Nginx 流行前,它是大併發靜態業務的首選,國內百度貼吧、豆瓣等眾多網站都有Lighttpd奮鬥的身彩"  

1.2 常用來提供動態服務的軟體

* PHP ( FastCGI ):大中小型網站都會使用,動態網頁語言PHP程式的解析容器。它可配合Apache解析動態程式,不過,這裡的PHP不是FastCGI守護程式橫式,而是mod_php5.so ( module)也可配合Nginx解析動態程式,此時的PHP常用FastCGI守護程式模式提供服務。
* Tomcat :中小企業動態Web服務主流,網際網路Java容器主流(如jsp、do )
* Resin :大型動態Web服務主流,網際網路Java容器主流(如jsp、do )
* IIS ( Internet information services ):微軟 windows 下的 Web 服務軟體(如 asp、aspx )

第2章 nginx 軟體

2.1 軟體介紹

如果你聽說或使用過 Apache軟體,那麼很快就會熟悉 Nginx軟體,與 Apache軟體類似, Nginx ( engme x")是一個開源的,支援高效能、高併發的 WWW伺服器和代理服務軟體。它是由俄羅斯人 Igor Sysoev開發的,最初被應用在勘羅斯的大型網站 www.rambler.ru ,後來作者將原始碼以類BSD許可證的形式開源出來供全球使用。

Nginx因具有高併發(特別是靜態資源)佔用系統資源少等特性,且功能豐富而逐漸流行起來。

在功能應用發麵,Nginx不但是一個優秀的Web服務軟體,還具有反向代理負載均衡功能和快取服務功能。在反向代理負載均衡功能方面,它類似於大名鼎鼎的LVS負載均衡及Haproxy等專業代理軟體,但是Nginx部署起來更為簡單、方便;在快取服務功能方面,它又類似於Squid等專業的快取服務軟體。

Nginx 可以執行在 UNIXLinuxBSDMac 0S XSolaris,以及 Microsoft Windows 等作業系統中。隨著Nginx在國內很多大型網站中的穩定高效執行,近兩年它也逐漸被越來越多的中小型網站所使用。當前流行的Nginx Web組合被稱為LNMPLEMP(Linux Nginx MySQL PHP),其中 LNMP 裡的 N 取自Nginx ( "engine x" )

Nginx 的官方介紹見 http://nginx.org/en

2.2 NGINX 軟體特性

2.2.1 HTTP伺服器的特色及優點

u  支援高併發:能支援幾萬併發連線(特別是靜態小檔案業務環境)

u  資源消耗少:在3萬併發連線下,開啟10Nginx執行緒消耗的記憶體不到200MB

u  可以做HTTP反向代理及加速快取、即負載均衡功能,內建對RS節點伺服器健康檢查功能,這相當於專業的Haproxy軟體或LVS的功能。

u  具備Squid等專業快取軟體等的快取功能。

u  支援非同步網路I/O事件橫型epoll(Linux2.6+)

2.2.2 nginx功能特性

Ø  web網站服務

Ø  反向代理負載均衡(nginx /lvs /haproxy)

Ø  nginx快取服務(memcache /redis /mongodb

2.3 nginx軟體的企業功能應用

業務型別

應用方案

靜態業務

若是高併發場景,儘量採用NginxLighttpd,二者首選Nginx

動態業務

理論上採用NginxApache均可,建議選擇Nginx,為了避免相同業務的服務軟體多樣化,增加額外維護成本。動態業務可以由Nginx兼做前端代理,再根據頁面元素的型別或目錄,轉發到後端相應的伺服器處理程式。

---首選tomcat

既有靜態業務又有動態業務

採用Nginx

利用nginx軟體是無法處理動態業務請求,要讓nginx結合php軟體處理動態業務請求,在加上mysql LNMP架構

2.4 nginx軟體的動態訪問瓶頸

2.4.1 與其他軟體的對比

先來看看Apache軟體的特點,如下

²  Apache2.2版本非常穩定強大,據官方說,Apache2.4版本效能更強。

²  Prefork模式取消了程式建立開銷,效能很高。

²  處理動態業務資料時,因關聯到後端的引擎和資料庫,瓶頸不在Apache上。

²  高併發時消耗系統資源相對多一些。

²  基於傳統的select模型,高併發能力有限。

²  支援擴充套件庫,可通過DSOapxs方法編譯安裝額外的外掛功能,不需要重新編譯Apache

²  功能多,更穩定,更安全,外掛也多。

²  市場份額在逐年遞減

再來看看Nginx軟體的特點,如下:

n  基於非同步網結I/O 型(epollk kqueue

n  具備支援高效能,高併發的特性,併發連線可達數萬。

n  對小檔案(小於1 MB的靜態檔案)高併發支援很好,效能很高

n  不支援類似 ApacheDSO模式、擴充套件庫必須編譯進主程式(缺點)

n  程式佔用系統資源比較低。

n  支援Web、反向ProxyCache三大重點功能,幷且都很優秀。

n  市場份額在逐年快速增加。

最後是Lighttpd的特點,如下:

²  基於非同步網路 I/ O模型,效能、併發都與 Nginx相近。

²  擴充套件庫是 SO模式,比Nginx靈活

²  目前國內的使用率比較低,安全性沒有 ApacheNginx好。

²  通過外掛(mod_secdownload)可實現檔案 URL地址加密(優點)

²  社群不活躍,市場份額較低,

2.4.2 最主要的區別select & epoll

NGINX 使用的是epoll 和Kqueue 非同步網路I/O模型,而apache使用的是傳統的select模型

比喻:

 第一個比喻:

 假設你在大學讀書,住的宿舍樓有很多房間,你的朋友要來找你。select版宿管大媽就會帶著你的朋友到各房間挨個去找,直到找到你為止。而epoll版宿管大媽會先記下每位入住同學的房間號,你的朋友來找你時,只需告訴你的朋友你住在哪個房間即可,不用親自帶著你的朋友滿宿舍樓找人了。如果同時來了100個人,都要找自己住這棟樓的同學,select版和epoll版宿管大媽,誰的效率更高,就很明顯了。

第二個比喻:

select的呼叫複雜度是線性的,即O(n)。舉個例子,一個保姆照看照看一群孩子,如果把孩子是否需要尿尿比作網路I/O事件,select的作用就好比這個保姆挨個詢問每個孩子"你要尿尿嗎?”如果孩子回答是,保姆則把孩子領出來放到另外一個地方。當所有孩子詢問完之後,保姆領著這些要尿尿的孩子去上廁所(處理網路I/O事件).在epoll機制下,保姆不再需要挨個詢問每個孩子是否需要尿尿。取而代之的是,如果孩子需要尿尿,他就自己主動站到事先約定好的地方,而保姆的職責就是檢視事先約定好的地方是否有孩子。如果有小孩,則領著孩子去上廁所(網路事件處理)。因此,epoll的這種機制,能夠高效地處理成千上萬的併發連線,並且效能不會隨著連線數増加而下降太多。

2.4.3 apache selectnginx epoll技術對比圖

指標

select

epoll

效能

隨著連線數的增加效能急劇下降。處理成千上萬的併發連線數,效能很差

隨著連線數的增加,效能基本上沒有下降。處理成千上萬連線時效能很好

連線數

連線數有限制,處理的最大連線數不超過1024,如果要處理的連線數超過1024個,則需要修改FD_SETSIZE巨集,並重新編譯

連線數無限制

內在處理機制

線性輪詢

回撥callback

開發複雜性

第3章 nginx的安裝與使用

3.1 nginx軟體的編譯安裝步驟

3.1.1 檢查軟體安裝的系統環境

[root@web01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@web01 ~]# uname -r
2.6.32-696.el6.x86_64

3.1.2 安裝nginx的依賴包(pcre-devel openssl-devel

yum install -y pcre-devel openssl-devel

pcre:相容perl語言正規表示式,perl compatible regular expressions

      rewirte模組 引數資訊(perl方式定義正規表示式)

opensslssh---openssh/openssl---https

總結:所有安裝依賴軟體,後面都要加上-devel

3.1.3 下載nginx軟體

wget http://nginx.org/download/nginx-1.10.2.tar.gz

說明:軟體很小,用心檢視一下

解壓軟體

tar xf nginx-1.10.2.tar.gz

3.1.4 建立管理使用者 www

useradd -M -s /sbin/nologin www

3.1.5  nginx軟體編譯安裝過程

3.1.5.1  注意

軟體編譯安裝步驟

a>軟體解壓配置(將軟體程式安裝到哪個目錄中 開啟nginx軟體的哪些功能)

b>軟體編譯過程

c>軟體編譯安裝過程

   注意順序,順序不對軟體安裝會出錯

3.1.5.2  編譯安裝軟體

1、配置軟體,在軟體的解壓目錄中

[root@web01 nginx-1.10.2]# ./configure --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

編譯引數說明:

 --prefix           表示指定軟體安裝到哪個目錄中,指定目錄不存在會自動建立

 --user/--group       nginx工作程式由哪個使用者執行管理

 --with-http_stub_status_module   啟動nginx狀態模組功能(使用者訪問nginx的網路資訊)

 --with-http_ssl_module           啟動https功能模組

通過軟體編譯過程中的返回值是否正確,確認配置是否正確

[root@web01 nginx-1.10.2]# echo $?
0

   2、編譯軟體

[root@web01 nginx-1.10.2]# make

   3、編譯安裝

[root@web01 nginx-1.10.2]# make install

3.1.6 建立軟連線

[root@web01 application]# ln -s /application/nginx-1.10.2/ /application/nginx

3.1.7 精簡化nginx.conf 主配置檔案內容

[root@web01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf

3.1.8 啟動程式

[root@web01 application]# /application/nginx/sbin/nginx
[root@web01 application]#

檢查是否啟動

[root@web01 application]# ps -ef |grep nginx
root      26548      1  0 20:13 ?        00:00:00 nginx: master process /application/nginx/sbin/nginx
www       26549  26548  0 20:13 ?        00:00:00 nginx: worker process       
root      26551  23431  3 20:13 pts/0    00:00:00 grep --color=auto nginx

檢查埠資訊

[root@web01 application]# netstat -lntup |grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      26548/nginx 

服務部署完成

至此軟體安裝完畢!

nginx命令簡化方法

echo 'export PATH=/application/nginx/sbin:$PATH'>>/etc/profile
source /etc/profile
which nginx

3.1 nginx 目錄結構

[root@web01 nginx]# ll
total 36
drwxr-xr-x 2 root root 4096 Oct 21 19:34 conf    #配置檔案儲存目錄
drwxr-xr-x 2 root root 4096 Oct 21 19:34 html    #站點目錄
drwxr-xr-x 2 root root 4096 Oct 21 20:26 logs    #nginx 服務相關日誌檔案儲存目錄(錯誤日誌訪問日誌)
drwxr-xr-x 2 root root 4096 Oct 21 19:34 sbin    # 服務命令目錄(只有一個nginx檔案)

3.2 nginx.conf 配置檔案說明

這樣的配置檔案是通過精簡化配置檔案得到!

[root@web01 conf]# cat nginx.conf
worker_processes  1;                        ← worker 程式數量
events {                                    ←事件區塊
    worker_connections  1024;               ←每個worker程式可以處理的連線數
}                                            ←事件區塊結束
http {                                      ← HTTP 區塊
    include       mime.types;               ←支援的媒體檔案
    default_type  application/octet-stream;←預設的媒體型別
    sendfile        on;                     ←高效傳輸模式
    keepalive_timeout  65;                  ←超時時間
    server {                                 ← server 區塊
        listen       80;                    ←埠
        server_name  localhost;             ←域名
        location / {                        ←第一個location區塊
            root   html;                     ←站點目錄
            index  index.html index.htm;     ←首頁檔案
        }                                    ←第一個location區塊結束
        error_page   500 502 503 504  /50x.html;  ← 錯誤資訊配置
        location = /50x.html {                  檔案位置
            root   html;                      在哪找:路徑
        }                                     
    }                                         ← server 區塊結束
}                                            ← HTTP 區塊結束

3.2.1 站點目錄與首頁檔案概 

3.2.2 配置檔案詳解 

3.3 【常見錯誤】nginx軟體的編譯安裝常見錯誤說明

3.3.1 nginx軟體安裝過程中遇到的問題

軟體依賴包未正確安裝問題---PCRE依賴包沒有安裝

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

解決方法:yum install pcre pcre-devel -y

軟體依賴包未正確安裝問題---OPENSSL依賴包沒有安裝

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

解決方法:yum install openssl openssl-devel -y

3.3.2 nginx軟體啟動過程中遇到的問題

nginx軟體重複啟動產生的錯誤資訊

[root@web01 nginx-1.10.2]# /application/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

解決方法:

nginx軟體已經啟動無需反覆啟動,如果需要重新啟動需要停止nginx程式或者用reload方式進行重啟

3.3.3 啟動 Nginx 時如下報錯"nginx:[emerg]getpwnam(nginx”〉failed"

解答這是因為沒有對應的Nginx服務使用者,執行useradd nginx-s/sbin/noogin-M建立 Nginx

使用者即可。為了讓讀者理解問題,重現上述錯誤過程,命令如下:

[root@web01 tools]# pkill nginx
[root@web01 tools]# userdel nginx
[root@web01 tools]# /application/nginx/sbin/nginx
nginx: [emerg] getpwnam(Mnginx") failed
[root@web01 tools]# useradd nginx -s /sbin/nologin -M
[root@web01 tools]# /application/nginx/sbin/nginx

3.3.4 編譯安裝pcre編譯軟體時,gcc不全導致報錯(本文使用yum安裝不存在此問題)

報錯資訊如下:

[root@gjlin2 pcre-8.30]# make && make install
make all-am
make[l] : Entering directory 7home/gjlin/tools/pcre-8.30'
CXX pcrecpp.lo
libtool : compile : unrecognized option '-DHAVE_CONFIG_H'
libtool : compile : Try 'libtool --help* for more information.
make[l】:*** [pcrecpp.lo】錯誤 1
make[l] : Leaving directory Vhome/gjlin/tools/pcre-8.30'
make : *** [all]錯誤 

解答:執行“yum -y install gcc-c++”命令安裝gcc-c++依賴包。

3.3.5 nginx軟體編譯安裝後,看不到程式目錄(/application

   說明:編譯安裝步驟不對(配置 編譯 編譯安裝生成/appliation

3.3.6 nginx軟體排查問題三部曲說明

       a 在客戶端上ping伺服器端IP,檢查鏈路是否通暢

      b 在客戶端上telnet伺服器端IP、埠,檢查鏈路訪問是否通暢

      c 在客戶端上wget檢測模擬頁面訪問是否正常

3.3.7 【注意】403狀態碼出現情況原因

    01. 服務阻止客戶端訪問

    02. 服務端站點目錄中,沒有指定首頁檔案資訊   

3.4 nginx軟體使用命令引數

3.4.1 nginx 啟動方法

[root@web01 application]# /application/nginx/sbin/nginx

3.4.2 nginx 停止方法

[root@web01 application]# /application/nginx/sbin/nginx -s stop

3.4.3 nginx 重啟方法 (平滑重啟)

[root@web01 application]# /application/nginx/sbin/nginx -s reload

3.4.4 檢查配置檔案語法是否正確

[root@web01 application]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

3.4.5 顯示配置引數  -V (大寫V

[root@web01 application]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

3.4.6 nginx軟體使用過程中深入說明

. nginx軟體語法檢查方法:

    nginx -t 

. nginx軟體訪問測試過程:

curl -v www.baidu.com

. nginx軟體編譯引數檢視:

    nginx -V                 <--- 檢視原有的編譯引數資訊

3.5 nginx軟體靜態頁面編寫過程

編寫配置檔案

[root@web02 www]# cat ../../conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name www.zinx.top;
        location / {
            root   html/www;
            index  clsn.html index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

編寫靜態訪問頁面檔案資訊

[root@web1 www]# cat clsn.html  
<html>
<meta charset="utf-8">
<head>
<title>TEST</title>
</head>
<body>
慘綠少年
<table border=1>
<tr> <td>01</td> <td> </td> </tr>
<tr> <td>02</td> <td> </td> </tr>
 <tr> <td>03</td> <td> </td> </tr>
 </table>
<a href="http://blog.znix.top">
<img src="znix.png" />
</a>
</body>
</html>

第4章 nginx進階 --虛擬主機配置

4.1 企業要求】需要按照以前nginx服務編譯安裝過程安裝

1、參看已安裝服務的配置引數資訊

[root@web01 sbin]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

   -V 引數能顯示軟體的詳細詳細,安裝配置引數

2、按照配置引數進行部署

4.1.1 語法檢查】檢查配置檔案

[root@web01 nginx]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

4.2 首頁檔案不存在--利用nginx服務搭建檔案共享伺服器

通過配置  autoindex on; 引數

使用 autoindex引數,nginx能識別的直接顯示,不識別的直接下載

配置完 autoindex on; 引數以後 會顯示站點下的檔案資訊

對於nginx可以解析的資源會解析相應的內容

對於nginx不可以解析的資源會直接下載

4.2.1 進行curl時,報403錯誤,因為沒有首頁檔案資訊

 [root@web02 ~]# echo 'web01 www' > /application/nginx/html/www/index.html

        <- 在虛擬主機指定的站點目錄中建立首頁檔案         

[root@web02 ~]# curl www.nmtui.com
<- 利用curl命令本地檢測nginx配置是否成功;已經存在首頁檔案,測試成功

4.2.2 autoindex on引數實踐

1)修改配置檔案

[root@web01 www]# cat ../../conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       10.0.0.8:80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            autoindex on;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2)重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
[root@web01 conf]# /application/nginx/sbin/nginx -s reload

3)訪問測試 

4.3 【概念】虛擬主機的概念和型別

虛擬主機使用的是特殊的軟硬體技術,它把一臺執行在因特網上的伺服器主機分成一臺臺“虛擬”的主機,每臺虛擬主機都可以是一個獨立的網站,可以具有獨立的域名,具有完整的Intemet伺服器功能(WWWFTPEmail等),同一臺主機上的虛擬主機之間是完全獨立的。從網站訪問者來看,每一臺虛擬主機和一臺獨立的主機完全一樣。

利用虛擬主機,不用為每個要執行的網站提供一臺單獨的Nginx伺服器或單獨執行一組Nginx程式。虛擬主機提供了在同一臺伺服器、同一組Nginx程式上執行多個網站的功能。

 

4.3.1 虛擬主機概念

所謂虛擬主機,在Web服務裡就是一個獨立的網站站點,這個站點對應獨立的域名(也可能是ip或埠.具有獨立的程式及資源目錄,可以獨立地對外提供服務供使用者訪問。

這個獨立的站點在配置裡是由一定格式的標籤段標記的,對於Apache軟體來說,一個虛擬主機的標籤段通常被包含在以的此<VirtualHost></VirtualHost>,而Nginx軟體則使用一個server{}標籤來標示一個虛擬主機。一個Web服務裡可以有多個虛擬主機標籤對,即可以同時支援多個虛擬主機站點。

4.3.2 虛擬主機型別

常見的虛擬主機型別有如下幾種

1)基於域名的虛擬主機

所謂基於域名的虛擬主機,意思就是通過不同的域名區分不同的虛擬主機,基於域名的虛擬主機是企業應用最廣的虛擬主機型別,幾乎所有對外提供服務的網站使用的都是基於域名的虛擬主機,例如: www.znix.top

2)基於埠的虛擬主機 

同理,所謂基於埠的虛擬主機,意思就是通過不同的埠來區分不同的虛擬主機,此類虛擬主機對應的企業應用主要為公司內部網站,例如:一些不希望直接對外提供使用者訪問的網站後臺等,訪問基於埠的虛擬主機,地址裡要帶有埠,例如:http://blog.znix.top:80

    3)基於IP的虛擬主機

 所謂基於IP的虛擬主機,意思是通過不同的IP區分不同的虛擬主機,

4.3.3 Nginx配置虛擬主機的步驟如下(適合各類虛擬主機型別)

1)增加一個完整的server標籤段到結尾處。注意,要放在http的結束大括號前,也就是將server標籤段放入http標籤。

2)更改server_name及對應網頁的root根目錄,如果需要其他引數,可以增加或修改。

3)建立Seever_name域名對應網頁的根目錄,並且建立測試檔案,如果沒有index首頁,訪問會出現403錯誤。

     如果是apache軟體,沒有首頁檔案,預設會把站點目錄下面的資訊顯示出來

     nginx出403錯誤解決方式:http://clsn.blog.51cto.com/2561410/1633952

     autoindex on;#<==當找不到首頁檔案時,會展示目錄結構,這個功能一般不要用除非有需求。

 

    PS:顯示的目錄結構中,有些資訊點選就是下載,有的點選就是顯示,因為副檔名稱不一樣

         根本在於nginx軟體是否能夠進行解析

         nginx是否解析:

         1.htmljpg認識顯示出內容

         2.不認識不解析便直接下載

4)檢査Nginx配置檔案語法,平滑重啟Nginx服務,快速檢査啟動結果。

5)在客戶端對server_name處配置的域名做host解析或DNS配置,並檢査(ping域名看返回的IP是否正確)。

6)Win32瀏覽器中輸入地址訪問,或者在Linux客戶端做hosts解析,用wgetcurl接地址訪問。

7)在服務重啟或關閉之前先進行一次配置檔案檢查 /application/ngnix/sbin/nginx -t

Nginx虛擬主機的官方幫助網址為:http://Nginx.org/en/docs/http/requestj3rocessing.html

4.4 【實踐】虛擬主機配置

4.4.1 基於域名的虛擬主機

修改配置檔案

[root@web01 ~]# cat  /application/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  bbs.nmtui.com;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  blog.nmtui.com;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

檢查配置資訊是否正確

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -s reload

注意:服務沒有啟動的時候不能使用平滑重啟

建立站點目錄

[root@web01 conf]# for name in www blog bbs ;do  mkdir ../html/$name -p ;done

建立主頁檔案

[root@web01 conf]# for name in www blog bbs ;do echo "web01 $name" >../html/$name/index.html  ;done

檢查主頁內容資訊

[root@web01 conf]# for name in www blog bbs ;do  cat ../html/$name/index.html ;done
web01 www
web01 blog
web01 bbs

修改主機hosts檔案

[root@web01 ~]# vim /etc/hosts
172.16.1.8    web01 www.nmtui.com blog.nmtui.com bbs.nmtui.com

測試

[root@web01 ~]# curl  www.nmtui.com
web01 www
[root@web01 ~]# curl  blog.nmtui.com
web01 blog
[root@web01 ~]# curl  bbs.nmtui.com
web01 bbs

4.4.2 基於埠的虛擬主機

修改配置檔案內容

[root@web01 conf]# vim nginx.conf
    server {
        listen       81;
        server_name  bbs.nmtui.com;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
"nginx.conf" 46L, 1098C written  

重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
[root@web01 conf]# /application/nginx/sbin/nginx -s reload

檢查埠資訊

[root@web01 conf]# netstat -lntup |grep ng
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      40110/nginx        
tcp        0      0 0.0.0.0:81                  0.0.0.0:*                   LISTEN      40110/nginx  

測試訪問

[root@web01 ~]# curl  bbs.nmtui.com:81
web01 bbs

4.4.3 基於IP的虛擬主機

注意:  

採用基於IP的虛擬主機,配置檔案修改後要重啟(-s stop

配置和IP地址配置相關的都要採用(-s stop)重啟,不能夠使用軟重啟的方式

修改配置檔案

[root@web01 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       10.0.0.8:80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

檢查配置檔案格式

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

重啟服務,注意使用的是直接重啟的方式 

只要nginx配置檔案中涉及到IP地址的更改只能正真的重啟才生效

[root@web01 conf]# /application/nginx/sbin/nginx -s stop
[root@web01 conf]# /application/nginx/sbin/nginx
[root@web01 conf]# netstat -lntup |grep ng
tcp        0      0 10.0.0.8:80                 0.0.0.0:*                   LISTEN      40592/nginx   

訪問測試

 

4.5 【規範化配置】nginx配置檔案企業規範化

4.5.1 第一個里程碑:  建立虛擬主機配置檔案儲存目錄

[root@web01 conf]# pwd
/application/nginx/conf
[root@web01 conf]# mkdir extra

4.5.2 第二個里程碑: 生產虛擬主機配置檔案

[root@web01 conf]# sed -n '10,21p' nginx.conf > extra/www.conf
[root@web01 conf]# sed -n '22,33p' nginx.conf > extra/bbs.conf
[root@web01 conf]# sed -n '34,45p' nginx.conf > extra/blog.conf

4.5.3 第三個里程碑: 修改nginx配置檔案使之載入識別虛擬主機配置檔案

[root@web01 conf]# cat  nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/*;
}

4.5.4 重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

4.5.5 檢查監聽埠

[root@web01 conf]# netstat -lntup |grep ng
tcp        0      0 0.0.0.0:80           0.0.0.0:*       LISTEN      40714/nginx       

4.5.6 檢視配置檔案的載入順序

[root@web01 logs]# /application/nginx/sbin/nginx -T

引數說明:

-T   : test configuration, dump it and exit

   測試配置檔案,並且載入一遍,並顯示載入的順序

4.5.7 【優化】調整 inculde的載入順序,指定第一個載入為conf

[root@web01 conf]# vim nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;
}

4.5.8 重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
[root@web01 conf]# /application/nginx/sbin/nginx -s reload

4.5.9 說明;

這樣的配置能夠讓使用者通過IP訪問的時候,訪問到的網站是www的網站。

4.6 別名的配置

在配置檔案中新增別名

[root@web01 conf]# vim extra/www.conf
    server {
        listen       80;
        server_name  www.nmtui.com nmtui.cn;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -s reload

修改hosts 進行訪問測試

[root@web01 www]# curl  nmtui.cn
web01 www

4.7 status 狀態模組

4.7.1 狀態模組的配置

修改配置檔案,新增三status模組

[root@web01 conf]# vim nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
          server{
          listen  80;
          server_name  status.nmtui.com;
          location / {
            stub_status on;
            access_log   off;
          }
        }
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;
}

檢查配置檔案是否正確

[root@web01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

重啟服務

[root@web01 conf]# /application/nginx/sbin/nginx -s reload

訪問測試 

說明:

 

以上頁面內容資訊主要會被zabbix監控服務調取,形成影象資訊
根據圖形資訊,從而判斷nginx網站服務使用者訪問量情況

 

4.7.2 狀態模組說明

引數

引數說明

Active connections

當前的活動客戶端連線數量

accepts          

接受客戶端連線的總數

handled          

處理的連線總數

requests         

客戶端請求的總數

Reading          

nginx正在讀請求頭的當前連線數。

Writing          

nginx正在將響應寫回客戶端的當前連線數。

Waiting          

當前空閒客戶端連線數等待一個請求。

4.8 nginx的日誌功能

nginx的兩種日誌種類

錯誤日誌:記錄nginx執行錯誤情況資訊

訪問日誌:記錄使用者訪問日誌資訊

官方說明: http://nginx.org/en/docs/ngx_core_module.html#error_log

4.8.1 定義錯誤日誌資訊

系統預設配置

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

配置錯誤日誌,修改主配置檔案

[root@web01 logs]# vim ../conf/nginx.conf
worker_processes  1;
error_log  logs/error.log  error;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
          server{
          listen  80;
          server_name  status.nmtui.com;
          location / {
            stub_status on;
            access_log   off;
          }
        }
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;
}

重啟服務

[root@web01 logs]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
[root@web01 logs]# /application/nginx/sbin/nginx -s reload

檢視錯誤日誌資訊

[root@web01 logs]# tail  error.log
2017/10/25 11:41:55 [error] 40842#0: *7 open() "/application/nginx-1.10.2/html/www/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: www.nmtui.com, request: "GET /favicon.ico HTTP/1.1", host: "www.nmtui.com", referrer: "http://www.nmtui.com/"

4.8.2 訪問日誌配置

系統預設配置

#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;

修改訪問日誌配置--修改主配置檔案

[root@web01 www]# cat ../../conf/nginx.conf
worker_processes  1;
error_log  logs/error.log  error;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
 
          server{
          listen  80;
          server_name  status.nmtui.com;
          location / {
            stub_status on;
            access_log   off;
          }
        }
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;
}

修改訪問日誌配置--修改虛擬主機配置檔案

[root@web01 www]# cat /application/nginx/conf/extra/www.conf
    server {
        listen       80;
        server_name  www.nmtui.com nmtui.cn;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
     access_log  logs/access_www.log  main;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

4.8.3 【重要】訪問日誌資訊說明

日誌內容

10.0.0.1 - - [22/Oct/2017:16:04:54 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" "-"

配置檔案

'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

日誌資訊說明

引數

日誌內容

含義

$remote_addr

10.0.0.1

客戶端ip地址

-

-

 

$remote_user

-

顯示遠端訪問者使用者資訊

[$time_local]

[22/Oct/2017:16:04:54 +0800]

顯示訪問時間

$request

GET / HTTP/1.1"

請求行資訊

$status

304

狀態碼

$body_bytes_sent

0

響應報文主體內容大小

$http_referer

-

 

$http_user_agent

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36

客戶端瀏覽網頁工具資訊

$http_x_forwarded_for

-

反向代理轉發

詳細日誌詳細說明

Nginx日誌變數

說明

$remote_addr

記錄訪問網站的客戶端地址;即源IP地址

$http_x_forwarded_for

當前端有代理伺服器時,設定web節點記錄客戶端地址的配置,此引數生效的

前提是代理伺服器上也進行了相關的x_forwarded_for設定

可以記錄使用者真實的IP地址資訊

$remote_user

遠端客戶端使用者名稱稱

$time_local

記錄訪問時間與時區

$request

使用者的http請求起始行資訊

$status

http狀態碼,記錄請求返回的狀態,例如:200 , 404 , 301

$body_bytes_sents

伺服器傳送給客戶端的響應body位元組數

$http_referer

記錄此次請求是從哪個連結訪問過來的,可以根據referer進行防盜鏈設定

即表示是哪個網站介紹過來的

$http_user_agent

記錄客戶端訪問資訊,例如:瀏覽器、手機客戶端等

在沒有特殊要求的情況下,採用預設的配置即可,更多可以設定的記錄日誌資訊的變數見:http://nginx.org/en/docs/http/ngx_httpJog_module.html1

4.8.4 日誌的切割

切割日誌方式

01:利用指令碼實現日誌切割

簡單指令碼

[root@web01 logs]# cat /server/scripts/log_cut.sh
#!/bin/bash
 
mv /application/nginx/logs/access_www.log  /application/nginx/logs/access_www_`date +%F`.log
/application/nginx/sbin/nginx -s reload

包含判斷的指令碼

[root@web01 logs]# cat /server/script/cut_nginx_log.sh
# ! /bin/sh
Dateformat='date +%Y%m%d'
Basedir= "/application/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_www"
[-d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[-f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload

02.利用系統自帶切割軟體進行切割

cat /etc/logrotate.conf

4.9 企業需求解決(location應用)

   1、搭建好一臺nginxweb伺服器,配置好內網網路卡地址與外網網路卡地址

   2web伺服器的網站域名為www.nmtui.com 站點目錄為 html/www

   3、要求內網可以訪問 www.nmtui.com/AV 資源

   4、要求外網不可以訪問 www.nmtui.com/AV 資源

4.9.1 需求處理 --location的應用

1、定位需要控制的資源

     location == if

修改配置檔案

[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.nmtui.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        location /AV  {
            root  html/www;
            index index.html index.htm;
            allow 172.16.1.0/24;
            deny  all;
        }
    }

4.9.2 location 語法

location 指令的作用是根據使用者請求的URI來執行不同的應用。

locationn使用的語法為

location [=|~|~*|^~] uri {
  ....
}

location 語法說明表

location

[=|~|~*|^~]

uri

{....}

指令

匹配標識

匹配的網站地址

匹配URI後要執行的配置段

 

~ ~* 的區別

u  匹配內容區分大小寫

u  ~* 匹配內容不區分的小寫

u  !~ 取反

u  ^~ 但多個匹配同時存在,優先匹配 ^~匹配的內容;不做正規表示式的檢查 (優先處理)

4.9.3 官方配置示例

location = / {
    [ configuration A ]
}
 
location / {
    [ configuration B ]
}
 
location /documents/ {
    [ configuration C ]
}
 
location ^~ /images/ {
    [ configuration D ]
}
 
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

說明:

"/"請求將匹配配置A

"/index.html"請求將匹配配置B

"/documents/document.html"請求將匹配配置C

"/images/1.gif"請求將匹配配置D

"/documents/1.jpg"請求將匹配配置E.

 

不同uri及特殊字元組合匹配的順序說明

順序

不用URI及特殊字元組合匹配

匹配說明

1

location = / {}

精確匹配 /

2

location ^~ /image/{

匹配常規字串,不做正規表示式匹配檢查

3

location ~* \.(gif|jpg|jpeg)$ {

正則匹配

4

location /documents/ {

匹配常規字串,如果有正則,則優先匹配正則

5

location / {

所有location 都不能匹配後的預設匹配

4.9.4 【測試】測試location的訪問

4.9.4.1  修改配置檔案

定義不同的location返回不同的數值

[root@web01 extra]# vim www.conf
server {
    listen       80;
    server_name  www.nmtui.com nmtui.com;
    root   html/www;
    location / {
       return 401;
    }
    location = / {
        return 402;
    }
    location /documents/ {
        return 403;
    }
    location ^~ /images/ {
        return 404;
    }
    location ~* \.(gif|jpg|jpeg)$ {
    return 500;
    }
    access_log logs/access_www.log main;
}

4.9.4.2  訪問測試

根據請求不同uri的返回值驗證 location的配置。

[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com/documents
401
[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com
402
[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com/documents/ss.jpg
500
[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com/documents
401
[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com/documents/
403
[root@nfs01 ~]# curl -I -w "%{http_code}\n" -o /dev/null -s  www.nmtui.com/images/1.jpg
404

4.10 rewrite 模組的使用--地址重寫

4.10.1 rewrite 重寫模組

  將地址資訊進行重寫

rewrite 語法格式

rewrite regex replacement [flag]

rewrite應用標籤:serverlocationif

4.10.2 rewrite模組兩個功能

1. 實現網站地址資訊跳轉

2. 實現偽靜態

4.10.3 方法一 使用if判斷

[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.nmtui.com nmtui.cn;
if ($host ~* "^nmtui.com$") {
rewrite ^/(.*) http://www.nmtui.com/$1 permanent;
}
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

測試

[root@web01 www]# curl  nmtui.com -L
web01 www

4.10.4 方法二  再新增上一個區塊

server {   
        server_name nmtui.com;
        rewrite ^/(.*) http://www.nmtui.com/$1 permanent;
}  

4.10.5 nginx rwite重寫企業應用場景

  可以調整使用者瀏覽的URL,使其看起來更規範,合乎開發及產品人員的需求。

 為了讓搜尋引擎收錄網站內容,並讓使用者體驗更好,企業會將動態URL地址偽裝成靜態地址提供服務。

  網站換新域名後,讓舊域名的訪問跳轉到新的域名上,例如:讓京東的360buy換成了jd.com

根據特殊變數、目錄、客戶端的資訊進行URL跳轉等。

說明:開源軟體類似wordpress的,官方都會對偽靜態配置進行說明

4.11 nginx 的訪問認證

4.11.1 修改nginx的相關配置檔案

vim extra/www.conf
location / {
        root   html/www;
        index  index.html index.htm;
        auth_basic           "clsn training";
        auth_basic_user_file   /application/nginx/conf/htpasswd;
 }

4.11.2 建立密碼檔案

注: 這裡使用的htpasswd命令預設是沒有的,需要通過yum install httpd-tools -y 安裝

[root@web01 extra]# htpasswd -c /application/nginx/conf/htpasswd clsn
New password:
Re-type new password:
Adding password for user clsn

引數說明:

-c  Create a new file.

    建立一個新的密碼文

-b  Use the password from the command line rather than prompting for it.

採用免互動的方式輸入使用者的密碼資訊

htpasswd引數說明

引數

引數說明

-c

建立一個新檔案。

-n

不更新檔案; 顯示結果。

-m

強制MD5密碼加密。

-d

強制CRYPT加密密碼(預設)。

-p

不加密密碼(明文)。

-s

強制SHA加密密碼。

-b

使用命令列中的密碼,而不是提示。(免互動)

-D

刪除指定的使用者。

 

4.11.3 更改密碼檔案許可權

[root@web01 extra]#  chmod 400 /application/nginx/conf/htpasswd    
[root@web01 extra]#  chown -R www.www /application/nginx/conf/htpasswd
[root@web01 extra]# cat /application/nginx/conf/htpasswd
clsn:e3OfMiJThE0Qg

4.11.4 重啟服務: 配置修改後要重啟服務

[root@web01 extra]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
[root@web01 extra]# /application/nginx/sbin/nginx -s reload

4.11.5 訪問測試

# 使用互動式輸入密碼
[root@web01 www]# curl www.nmtui.com -uclsn
Enter host password for user 'clsn':123456
web01 www
# 使用免互動輸入密碼
[root@web01 www]# curl www.nmtui.com -uclsn:123456
web01 www

401錯誤說明 需要認證,但是沒有認證

 

相關文章