1. 程式人生 > 實用技巧 >Nginx的基礎應用

Nginx的基礎應用

Nginx是一款輕量級的Web和反向代理伺服器,它的誕生主要是為了解決C10K的問題,它具有較多的特性;

Nginx的特性:

1、模組化設計,具有較好的擴充套件性

2、具有高可靠性

3、支援熱部署:可以在不影響使用者使用的情況下,升級老版本;可以不停機更新配置檔案、更換日誌檔案、更換伺服器程式版本

4、低消耗記憶體:10Kkeepalive連線模式下的非活動連線僅消耗2.5M記憶體

5、是event-driven事件驅動模型:具有一個主程序,多個子程序,每個子程序響應多個請求

Nginx的基本功能:

1、靜態資源的web伺服器

2、可以作為http協議的正反向代理伺服器

正向代理:Nginx作為伺服器,可直接響應資源給客戶端

反向代理:Nginx作為代理器,客戶端不直接和伺服器交流,而是通過和代理伺服器的代理器來交流;通過代理器來讀取伺服器中的資源,從而響應給客戶端

3、支援pop3/imap4協議反向代理伺服器

4、支援FastCGIUWSGI

5、支援模組化:例如sslzip


Nginx的程式架構圖:

wKiom1dH_OnSXPyyAAGLmKXLVcw920.png

MasterMaster為主程序,主要作用是載入配置檔案、管理worker程序、可進行平滑升級

Workerworker為子程序,由master主程序生成,一個worker程序可以處理多個客戶端請求;主要作用是接受客戶端請求、http代理、FastCGI代理、Memcache代理、在磁碟內快取以及管理磁碟內的快取


準備環境:

虛擬機器1:nginx
IP:172.18.42.200
虛擬機器2:httpd(後端主機)
IP:172.18.42.201
虛擬機器3:httpd(後端主機)
IP:172.18.42.202



一、實現“ngx_http_auth_basic_module”認證機制

1、虛擬機器1安裝nginx服務

[[email protected]~]#yuminstallnginx

2、編輯nginx主配置檔案

[[email protected]~]#vim/etc/nginx/nginx.conf##nginx的主配置檔案
server{
listen80;##監聽的埠
server_namelocalhost;
root/www/lweim/;##指定讀取資源路徑
location/nginx{
auth_basic"ShowyourInformation";##指定提示頁
auth_basic_user_file/etc/nginx/.ngxpasswd;##指定密碼檔案路徑
}
}
[
[email protected]
nginx]#htpasswd-c-m/etc/nginx/.ngxpasswdlweim##建立虛擬使用者“lweim” -c:當.nginxpasswd這個檔案不存在時需使用 -m:使用md5演算法 [[email protected]~]#echo"172.18.42.200Nginx1">/www/lweim/nginx/index.html

3、訪問web頁面

wKioL1dH_sezWOZdAADzxaiTSMs538.png



二、實現“ngx_http_stub_status_module”基本狀態資訊

1、編輯配置檔案

[[email protected]~]#vim/etc/nginx/nginx.conf
server{
listen80;
server_namelocalhost;
root/www/lweim/;
location/status{##指明狀態頁面目錄
stub_statuson;##開啟狀態頁
}
}
[[email protected]~]#mkdir/www/lweim/status/##建立狀態頁目錄

2、訪問web

wKiom1dH_iGzH8e0AAAonb5AZUc538.png

Active connections:處於活動狀態的客戶端連線數量

Accepts:已經接受客戶端的總請求數量

Handled:已經處理客戶單的總請求數量

Request:客戶端發出的總請求數量

Reading:正在讀取客戶端請求報文首部的連線數量

Writing:正在向客戶端傳送響應報文的連線數量

Waiting:正在等待客戶端發出請求的空閒程序數



三、實現“ngx_http_ssl_modulehttps請求

1、在未修改配置檔案之前嘗試訪問“https://172.18.42.200

wKiom1dH_o7wcg1eAAC3kK4Elx0267.png

2、修改配置檔案

server{
listen80;
server_namelocalhost;
root/www/lweim/;
}

server{
listen443ssl;##https監聽在tcp的443埠
server_namelocalhost;

ssl_certificate/etc/nginx/ssl/ngx.crt;##指明ngx.crt的檔案路徑
ssl_certificate_key/etc/nginx/ssl/ngx.key;##指明ngx.key的檔案路徑

ssl_session_cacheshared:SSL:1m;
ssl_session_timeout5m;

ssl_ciphersHIGH:!aNULL:!MD5;
ssl_prefer_server_cipherson;

location/nginx{
}
}

Ssl on | off:是否啟用當前虛擬主機的ssl功能

Ssl_ certificate file:當前虛擬主機使用的PEM格式的證書檔案

Ssl_certificate_key file:當前虛擬機器使用的證書檔案中的公鑰配對的私鑰檔案路徑,依然是PEM格式

Ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]:表示ssl協議的版本;摩恩為後3

Ssl_session_cache off | none | [ builtin [ : size ] ] [ shard : name : size ]:指明ssl會話快取的機制

builtin:使用openssl內建的快取機制,對此機制為各worker獨有

shared:在各個worker程序共享的快取

name:快取空間的名稱

size:快取空間的大小以位元組為單位,每1MB記憶體可快取4000個會話

Ssl_session_time timeoutssl會話時長,指ssl session cache中快取條目時長


3、再次訪問web

wKioL1dIAB7S6zliAAAfF42CMOE643.png



四、實現“ngx_http_rewrite_module”重寫url

1、修改配置檔案

location/{
rewrite(.*)\.html$$1.txtlast;
rewrite(.*)\.txt$$1.jpgbreak;
}
##當用戶第一次請求uri中以html結尾時,會把uri重寫為以txt結尾並重新開始迴圈;
隨後匹配到第二條rewrite,把uri中的txt更改為以jpg結尾的檔案並響應給客戶端

rewrite regex replacement [flag]

regex:基於正則表示式,用於匹配使用者請求的url

replacement:為重寫的結果

Flag

Last:重寫完成後停止對當前urilocation中的後續其他操作,而後更改為對新的uri做出新一輪處理

Break:重寫完成後停止對當前uri在當前location中的後續其他操作,直接返回給客戶端

Redirect:重寫完成後,臨時返回給客戶端一個新的URL,隨後瀏覽器在根據新的URL請求新的資源;響應碼為302

Premanent:重寫完成後,永久返回給客戶端一個新的URL,隨後瀏覽器在根據新的URL請求信的資源;響應碼為301


2、訪問web服務

wKiom1dH_7GRzahFAAD6QumM73M971.png



五、實現“ngx_http_gizp_module”壓縮功能:只能用在http上下文

1、修改nginx配置檔案

http{
gzipon;
gzip_comp_level6;
gzip_disablemsie6;
gzip_http_version1.0;
gzip_typestext/plain;
}

Gzip on | off:啟用或禁用gzip壓縮響應報文

Gzip_comp_level level:指定壓縮比,1-9;預設為1

Gzip_disable regexregex是匹配客戶端瀏覽器型別的模式,表示對所有匹配到的瀏覽器下不執行壓縮響應

Gzip_min_length length:觸發啟用先壓縮功能的響應報文的最小長度

Gzip_http_version:設定啟用壓縮響應功能時,協議的最小版本

Gzip_types:指定僅執行壓縮的資源內容型別;預設為text/html

gzip_types text/plaintext/csstext/xmlapplication/x-javascriptapplication/xmlapplication/jsonapplication/java-script;


2、訪問web

wKioL1dIAQbwcihXAAAcyTy4QF0311.png



六、實現“ngx_http_fastcgi_module

1、虛擬機器2安裝php-fpm服務

[[email protected]~]#yuminstallphp-fpm-y##安裝php-fpm服務
[[email protected]~]#vim/etc/php-fpm.d/www.conf##修改php-fpm的配置檔案
listen=172.18.42.201:9000##監聽本地能與外部通訊的IP地址
listen.allowed_clients=172.18.42.200##監聽具有httpd服務的IP
[[email protected]~]#ss-tnl
StateRecv-QSend-QLocalAddress:PortPeerAddress:Port
LISTEN0128172.18.42.201:9000*:*

Nginxphp結合的方式只有fpmphp-fpm的工作方式類似於httpdprefork模組

Listen = :指明本地能與外部通訊的地址

Listen.allow_clients = :指明具有httpd服務的IP

Pm = dynamic | static

Pm.start_servers:啟動fpm程序時啟動的工作程序數量

Pm.min_spare_servers:最少空閒程序數

Pm.max_spare_servers:最大空閒程序數

Pm.max_children:最大工作程序數


2、修改nginx的配置檔案

location~\.php${
fastcgi_pass172.18.42.201:9000;##指明fpm-php服務的IP
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/web/lweim/$fastcgi_script_name;
includefastcgi_params;
}

Fastcgi_pass:用來指明代理那個伺服器(裝了php-fpm的伺服器能與外部監聽的地址)

Fastcgi_indexfastcgi應用的主頁面名稱

Fastcgi_param:傳遞給fpm伺服器引數


3、訪問web

wKioL1dIAafhlWXtAAAi5W_q7xI922.png




七、實現“fastcgi_cache_path”快取:只能用在http上下文

1、修改nginx的配置檔案

[[email protected]~]#vim/etc/nginx/nginx.conf
http{
fastcgi_cache_path/var/cache/nginx/fastcgilevels=1:2keys_zone=ngxcache:10m;##定義快取
}

location~\.php${
fastcgi_pass172.18.42.201:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/web/lweim/$fastcgi_script_name;
includefastcgi_params;
fastcgi_cachengxcache;##指明快取名稱
fastcgi_cache_key$request_uri;##定義快取鍵
fastcgi_cache_valid20030210m;##狀態碼200、302快取10分鐘
fastcgi_cache_valid3011h;##狀態碼301快取1個小時
fastcgi_cache_valid4042h;##狀態碼404快取2個小時
}

Fastcgi_cache_path path:指明快取檔案的路徑

Fastcgi_cache zone | off:是否啟用快取,如果啟用,需要指明快取與那個cache檔案中

Fastcgi_cache_key string:定義要使用的快取鍵

Fastcgi_cache_methods GET | HEAD | POST:快取那些型別的請求的相關資料

Fastcgi_cache_vaild [code..] time:對不同響應碼設定其可快取時間


2、檢視快取目錄

[[email protected]~]#tree/var/cache/nginx/fastcgi/
/var/cache/nginx/fastcgi/
├──1
│└──af
│└──e251273eb74a8ee3f661a7af00915af1
├──b
│└──fe
│└──c86156f7dcfecf44876ca30d1bac7feb
└──e
└──39
└──f46b8508aa08a6f8670fb088b8a9739e



、實現“ngx_http_proxy_module”

1、修改nginx配置檔案

[[email protected]]#vimnginx.conf
location~.*\.txt${##txt結尾的檔案由虛擬機器2來響應
proxy_pass
}

location~.*\.jpg${
proxy_pass##jpg結尾的檔案由虛擬機器3來響應
}

1)當proxy_pass後面的路徑不帶uri時,會將其location中的uri傳遞給後端主機

location/bbs{
proxy_passhttp://172.18.42.200;
}
##最終請求的路徑為http://172.18.42.200/bbs


2)當proxy_pass後面路徑是一個uri時,它會將location中的uri替換為proxy_pass的後端主機

location/bbs{
proxy_passhttp://172.18.42.200/;
}
##最終請求的路徑為http://172.18.42.200;把“/bbs/”當做成“/”


(3)如果location定義其uri時使用了正則表示式模式匹配機制,則proxy_pass後的路徑一定不能帶uri

location~*\.php${
proxy_pass
}


2、配置虛擬機器2

[[email protected]~]#yuminstallhttpd-y
[[email protected]~]#echo"172.18.42.201txt">/var/www/html/wtc.txt
[[email protected]~]#systemctlstarthttpd.service


3、配置虛擬級3

[[email protected]~]#yuminstallhttpd-y
[[email protected]~]#mv/root/wawa.jpg/var/www/html/wtc.jpg
[[email protected]~]#systemctlstarthttpd.service

4、訪問web

wKioL1dIBOmyfMrLAAAhAr3uHvQ678.png

wKioL1dIBQrR8n_-AAD0BeQznqM819.png



九、實現“proxy_set_header”,讓後端主機記錄源IP

1、在未修改配置檔案之前檢視後端主機的記錄日誌

[[email protected]~]#tail/var/log/httpd/access_log
172.18.42.200--[25/May/2016:19:20:34+0800]"GET/wtc.txtHTTP/1.0"20018"-""Mozilla/5.0(WindowsNT6.1;WOW64;rv:46.0)Gecko/20100101Firefox/46.0"
172.18.42.200--[25/May/2016:19:20:34+0800]"GET/wtc.txtHTTP/1.0"20018"-""Mozilla/5.0(WindowsNT6.1;WOW64;rv:46.0)Gecko/20100101Firefox/46.0"
##後端主機記錄的訪問IP都是nginx自身的的IP



2、修改nginx的配置檔案

[[email protected]nginx]#vimnginx.conf
location~.*\.txt${
proxy_passhttp://172.18.42.201;
proxy_set_headerX-Real_IP$remote_addr;
}


3、修改虛擬機器2httpd的配置檔案

[[email protected]~]#vim/etc/httpd/conf/httpd.conf
#LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined
LogFormat"%{X-Real_IP}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined


4、訪問web之後檢視後端主機的記錄日誌

[[email protected]~]#tail/var/log/httpd/access_log
172.18.250.14--[25/May/2016:19:27:41+0800]"GET/wtc.txtHTTP/1.0"304-"-""Mozilla/5.0(Wi
172.18.250.14--[25/May/2016:19:27:41+0800]"GET/wtc.txtHTTP/1.0"304-"-""Mozilla/5.0(Wi
172.18.250.14--[25/May/2016:19:27:41+0800]"GET/wtc.txtHTTP/1.0"304-"-""Mozilla/5.0(Wi
##記錄的訪問IP“172.18.250.14”為物理機的IP,做日誌分析才有意義



十、實現實現“proxy_cache”快取

1、修改nginx配置檔案

http{
proxy_cache_path/var/cache/nginx/proxylevels=1:2keys_zone=ngxcache:10m;
}
location~.*\.txt${
proxy_passhttp://172.18.42.201;
proxy_set_headerX-Real_IP$remote_addr;
proxy_cachengxcache;
proxy_cache_key$request_uri;
proxy_cache_valid2003024041h;
}


2、訪問web之後檢視快取目錄

[email protected]~]#tree/var/cache/nginx/proxy/
/var/cache/nginx/proxy/
└──5
└──fd
└──19cbf2faabf255f790ebd83de4a42fd5



十一、實現“ngx_http_upstream_module”負載均衡

1、修改nginx配置檔案

http{
upstreamweb{##定義一個伺服器組
server172.18.42.201weight=1;
server172.18.42.202weight=2;
}
}
location/{
proxy_pass##引用伺服器組
}
}
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.202WebServer2.
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.202WebServer2.
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
##實現了負載均衡

Upstream name {……}

定義後端伺服器組,可直接使用字串

Server address {parameters}:指明伺服器的地址和相關引數

address:

IP[ : PORT ]:給定IP地址

HOSTNAME[ : PORT ]:當後端有多個虛擬主機時,應該使用hostname定義

Unix/path/to/some_sock_file

parameters:

Weight=number:後端伺服器權重

Max_fails=number:設定最大失敗重試次數

Fail_timeout time:設定伺服器不可用的超時時長

Backup:備用主機;定義後端主機是否為一個sorry_server

Down:手動標記後自動下面,不在處理任何請求

2、實現源地址雜湊排程演算法

http{
upstreamweb{
server172.18.42.201weight=1;
server172.18.42.202weight=2;
ip_hash;##源地址雜湊演算法;將來自同一使用者的請求始終發往同一主機上
}
}
location/{
proxy_passhttp://web;
}
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
[[email protected]~]#curlhttp://172.18.42.200
<h1>
172.18.42.201WebServer1
</h1>
##響應請求的始終是一臺後端主機

Ip_hash:源地址雜湊演算法,只能用在upstream上下文;指定排程演算法

Least_conn:最少連線排程方法,只能用在upstream上下文

Keepalive:指明嘗試連線後端主機次數,只能用在upstream上下文中


3、“Health_check”對後端主機做健康檢測:只能用在location上下文

Interval=number:檢測的頻度,預設為5s

Fails=number:判定為失敗的檢測次數

Passes=number:判定為檢測成功的次數

Uri=uri:執行健康狀態監測時請求的uri

Match=name:基於哪個match做檢測結果為“成功”或者“失敗”的判斷

Port=port:向伺服器的那個埠發起健康狀態檢測請求


4、“match name”對後端主機做健康狀態監測時,定義其結果判斷標準的標準指令:只能用於http上下文

Status:期望的響應碼

Status CODE

Status CODE

Status CODE~CODE

Header:基於響應首部進行判斷

Header HEADER=VALUE

Header HEADER=VALUE

Header [!]HEADER

Header Header ~ VALUE

Body:期望的響應碼報文的主體部分應該有的內容

Body ~ CONTENT

Body ~ CONNTENT


5、“hash key”:定義排程方法,可自定義基於何種資訊(key)進行繫結:只能用在upstream上下文

Hash $remote_addr:根據後端主機的IP地址進行繫結

Hash $request_uri:繫結第一次訪問的伺服器,以後每次的訪問都指定元的的那臺伺服器

Hasg $cookie_username:根據客戶端的cookie


轉載於:https://blog.51cto.com/wangtianci/1783868