這篇文章主要介紹了關於Nginx的深度學習內容,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
一、動靜分離
通過中介軟體將動態請求和靜態請求進行分離。
原因:分離資源,減少不必要的請求消耗,減少請求延時。
動態和靜態請求圖例:
upstream php_api{ server 127.0.0.1:8080;}server { root filePath; location ~ \.php$ { proxy_pass http://php_api; index index.html index.htm; } location ~ \.(jpg|png|gif) { expires 1h; gzip on; }}
二、Rewrite規則
1、情境:
2、配置文法
rewrite
樣本: rewrite ^(.*)$ /pages/main.html break;
regex(正則)
Linux中
pcregrep命令可以用來測試Regex。
| 元字元 |含義 |
. |
匹配除分行符號以外的任一字元 |
? |
重複0次或1次 |
+ |
重複1次或更多次 |
d |
匹配數字 |
* |
貪婪模式,有多少匹配多少 |
^ |
匹配開頭 |
$ |
匹配結尾 |
{n} |
重複n次 |
{n,} |
重複n次或更多次 |
[c] |
匹配單個字元c |
[a-z] |
匹配a-z小寫字母的任意一個 |
\ |
轉移字元 |
( ) |
用於匹配()之間的內容,通過$1 、$2 調用 |
flag
flag |
含義 |
last |
停止rewrite檢測 |
break |
停止rewrite檢測 |
redirect |
返回302臨時重新導向,地址欄會顯示跳轉後的地址 |
permanent |
返回301永久重新導向,地址欄會顯示跳轉後的地址 |
301永久重新導向:除非使用者清理緩衝,否則下次請求還是會請求到重新導向
302臨時重新導向:使用者下次請求還會經過服務端重新導向
last 和 break的區別:last會建立一個串連,往下繼續進行匹配。break會直接停留在那一級。
redirect:關閉nginx後,重新導向會失效。
permanent:關閉nginx,也會重新導向到新的地址。
執行個體:
location / { # 檔案不存在,直接存取4399 if (!-f $request_filename) { rewrite ^/(.*)$ http://www.4399.com; }}
優先順序
執行server塊的rewrite指令
執行location匹配
執行選中的location中的rewrite
三、Nginx的進階模組
1. secure_link_module模組
(1)制定並允許檢查請求的連結的真實性以及保護資源免遭未經授權的訪問
(2)限制連結生效周期
圖例:
配置文法
配置文法:secure_link_md5 expression;
預設:無
Context:http,server,location
配置文法:secure_link expression;
預設:無
Context:http,server,location
secure_link
secure_link_md5
簡單配置執行個體:
root /opt/app/code;location / { secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri 自訂字串"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; }}
產生url的指令碼:
#!/bin/bashservername="你的servername"download_file="/download/test.img"time_num=$(date -d "2018-10-18 00:00:00" +%s)secure_num="自訂字串"res=$(echo -n "${time_num}${download_file} ${secure_num}"|openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =)echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}"
注意:1、產生指令碼中自訂字串和配置中的自訂字串要保持一致。2、驗證規則保持一致。3、如果沒有openssl,可以yum安裝。
2. geoip_module模組
基於IP地址匹配
MaxMine GeoIP二進位檔案,讀取IP所在地區資訊。
預設安裝的Nginx是沒有安裝geoip這個模組的,安裝命令:
yum install nginx-module-geoip
使用情境:
區別國內外做HTTP訪問規則
區別國內城市地區做HTTP訪問規則
使用步驟:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";
安裝geoip:yum install nginx-module-geoip
,安裝完成查看/etc/nginx/module目錄下,如果有對應的so檔案,則說明安裝成功
在/etc/nginx/nginx.conf設定檔開頭加入
下載地區分區檔案:
使用gunzip
命令解壓下載下來的檔案
配置樣本
geoip_country /etc/nginx/geoip/GeoIP.dat;geoip_city /etc/nginx/geoip/GeoLiteCity.dat;server{ location /myip { default_type text/plain; return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city"; }}
四、基於Nginx的HTTPS服務
1、為什麼需要HTTPS
原因:HTTP不安全
傳輸資料被中間人盜用、資訊泄露
資料內容劫持、篡改
2、HTTPS協議的實現
對傳輸內容進行加密以及身分識別驗證
通訊原理圖:
3、認證簽名產生
準備步驟:
確認openssl有無安裝,openssl version
nginx有無編譯http-ssl-module,nginx -V
產生自簽認證步驟:
產生key密鑰
產生認證簽章要求檔案(csr檔案)
打包上面兩個步驟產生的檔案發送給簽名機構即可完成認證簽名
產生認證簽名檔案(CA檔案)
配置文法:
簡單樣本:
server { listen 443; server_name locahost; ssl on; ssl_certificate /etc/nginx/ssl_key/ronaldo.crt; ssl_certificate_key /etc/nginx/ssl_key/ronaldo.key; index index.html index.htm; location / { root /opt/app/code; }}
配置完成後:
停止Nginx:nginx -s stop -c /etc/nginx/nginx.conf
,會要求你輸入ronaldo.key的密碼。
啟動Nginx:nginx -c /etc/nginx/nginx.conf
,也會要求你輸入密碼。
查看是否啟用了443連接埠:netstat -luntp | grep 443
4、配置蘋果要求的認證
伺服器所有的串連使用TLS1.2以上的版本(openssl 1.0.2)
#!/bin/bashcd /opt/downloadwget https://www.openssl.org/source/openssl-1.0.2k.tar.gztar zxf openssl-1.0.2k.tar.gzcd openssl-1.0.2k./config --prefix=/usr/local/opensslmake && make installmv /usr/bin/openssl /usr/bin/openssl.OFFmv /usr/include/openssl /usr/include/openssl.OFFln -s /usr/local/openssl/bin/openssl /usr/bin/opensslln -s /usr/local/openssl/include/openssl /usr/include/opensslecho "/usr/local/openssl/lib" >> /etc/ld.so.confldconfig -vopenssl version -a
HTTPS認證必須使用SHA256以上雜湊演算法簽名
HTTPS認證必須使用RSA 2048位或ECC 256位以上公開金鑰演算法
使用向前加密技術
通過自簽方式、符合蘋果要求、通過key檔案直接產生crt檔案:
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout ronaldo.key -out ronaldo_apple.crt
-keyout
參數會同時再產生一個key檔案(沒有保護碼),reload Nginx就不用再次輸入密碼。
產生crt檔案後,只需要修改設定檔即可
直接產生沒有保護碼的key:openssl rsa -in ./ronaldoold.key -out ./ronaldonew.key
5、HTTPS服務最佳化
啟用keepalive長連結
設定ssl session緩衝
五、Nginx與Lua的開發
Nginx+Lua優勢:
充分的結合Nginx的並發處理epoll優勢和Lua的輕量實現簡單的功能且高並發的情境。
1、Lua
是一個簡潔、輕量、可擴充的指令碼語言
安裝:yum install lua
運行:
#!/usr/bin/luaprint("Hello world")
注釋
變數
a = 'alon123"'
a = "alon123""
a = '97lo1004923"'
a = [[alo
123"]]
上述是同一個意思,第三點用的是ASCII表
注意:
Lua數實值型別只有double類型
Lua布爾類型只有nil和false是false,數字0、Null 字元串都是true
Lua中的變數如果沒有特殊說明,全是全域變數;如果希望是局部變數,簽名加個local
Lua沒有++或是+=這樣的操作
~=:不等於
..:字串拼接
io庫的分別從stdin和stdout讀寫的read和write函數
while迴圈語句
sum = 0num = 1while num <= 100 do sum = sum + num num = num + 1endprint("sum =", sum)
for迴圈語句
sum = 0for i = 1,100 do sum = sum + iend
if-else判斷語句
if age == 40 and sex == "Male" then print("大於40歲的男人")elseif age>60 and sex ~= "Female" then print("非女人而且大於60")else local age = io.read() print("Your age is"..age)end
2、Nginx + Lua環境
所需下載以及安裝:
LuaJIT
ngx_devel_kit和lua-nginx-module
重新編譯Nginx
詳細的下載和安裝步驟參見:
3、Nginx調用lua模組指令
Nginx的可插拔模組化載入執行,共11個處理階段
指令 |
含義 |
set_by_lua,set_by_lua_file |
設定nginx變數,可以實現複雜的賦值邏輯 |
access_by_lua,access_by_lua_file |
請求訪問階段處理,用於存取控制 |
content_by_lua,content_by_lua_file |
內容處理器,接收請求處理並輸出響應 |
4、Nginx Lua API
API |
含義 |
ngx.var |
nginx變數 |
ngx.req.get_headers |
擷取要求標頭 |
ngx.req.get_uri_args |
擷取url請求參數 |
ngx.redirect |
重新導向 |
ngx.print |
輸出響應內容體 |
ngx.say |
同nginx.print,但是會斷行符號 |
ngx.header |
輸出回應標頭 |
... |
|
5、灰階發布
按照一定的關係區別,分不分的代碼進行上線,使代碼的發布能平滑過渡上線。
根據使用者的資訊cookie等資訊區別
根據使用者的ip地址
實現灰階發布:
相關推薦:
Nginx的情境實踐
關於Nginx的基礎內容