Nginx的基礎應用
Nginx是一款輕量級的Web和反向代理伺服器,它的誕生主要是為了解決C10K的問題,它具有較多的特性;
Nginx的特性:
1、模組化設計,具有較好的擴充套件性
2、具有高可靠性
3、支援熱部署:可以在不影響使用者使用的情況下,升級老版本;可以不停機更新配置檔案、更換日誌檔案、更換伺服器程式版本
4、低消耗記憶體:10K個keepalive連線模式下的非活動連線僅消耗2.5M記憶體
5、是event-driven事件驅動模型:具有一個主程序,多個子程序,每個子程序響應多個請求
Nginx的基本功能:
1、靜態資源的web伺服器
2、可以作為http協議的正反向代理伺服器
正向代理:Nginx作為伺服器,可直接響應資源給客戶端
反向代理:Nginx作為代理器,客戶端不直接和伺服器交流,而是通過和代理伺服器的代理器來交流;通過代理器來讀取伺服器中的資源,從而響應給客戶端
3、支援pop3/imap4協議反向代理伺服器
4、支援FastCGI、UWSGI等
5、支援模組化:例如ssl、zip
Nginx的程式架構圖:
Master:Master為主程序,主要作用是載入配置檔案、管理worker程序、可進行平滑升級
Worker:worker為子程序,由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頁面
二、實現“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
Active connections:處於活動狀態的客戶端連線數量
Accepts:已經接受客戶端的總請求數量
Handled:已經處理客戶單的總請求數量
Request:客戶端發出的總請求數量
Reading:正在讀取客戶端請求報文首部的連線數量
Writing:正在向客戶端傳送響應報文的連線數量
Waiting:正在等待客戶端發出請求的空閒程序數
三、實現“ngx_http_ssl_module”https請求
1、在未修改配置檔案之前嘗試訪問“https://172.18.42.200”
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 timeout:ssl會話時長,指ssl session cache中快取條目時長
3、再次訪問web
四、實現“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:重寫完成後停止對當前uri在location中的後續其他操作,而後更改為對新的uri做出新一輪處理
Break:重寫完成後停止對當前uri在當前location中的後續其他操作,直接返回給客戶端
Redirect:重寫完成後,臨時返回給客戶端一個新的URL,隨後瀏覽器在根據新的URL請求新的資源;響應碼為302
Premanent:重寫完成後,永久返回給客戶端一個新的URL,隨後瀏覽器在根據新的URL請求信的資源;響應碼為301
2、訪問web服務
五、實現“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 regex:regex是匹配客戶端瀏覽器型別的模式,表示對所有匹配到的瀏覽器下不執行壓縮響應
Gzip_min_length length:觸發啟用先壓縮功能的響應報文的最小長度
Gzip_http_version:設定啟用壓縮響應功能時,協議的最小版本
Gzip_types:指定僅執行壓縮的資源內容型別;預設為text/html
gzip_types text/plain、text/css、text/xml、application/x-javascript、application/xml、application/json、application/java-script;
2、訪問web
六、實現“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*:*
Nginx和php結合的方式只有fpm;php-fpm的工作方式類似於httpd的prefork模組
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_index:fastcgi應用的主頁面名稱
Fastcgi_param:傳遞給fpm伺服器引數
3、訪問web
七、實現“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
九、實現“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