nginx的rewrite,gzip,反向代理學習筆記

来源:http://www.cnblogs.com/linuxboke/archive/2016/04/21/5416088.html
-Advertisement-
Play Games

rewrite模塊名:ngx_http_rewrite_module預設自動被編譯 指令:rewrite regex replacement [flag] regex :正則表達式,用於匹配用戶請求的uri replacement:重寫後的結果 flag: last:重寫完成之後停止對當前uri的進 ...


rewrite模塊名:ngx_http_rewrite_module預設自動被編譯

指令:rewrite regex replacement [flag]

regex :正則表達式,用於匹配用戶請求的uri

replacement:重寫後的結果

flag 可以有四個值分別為last,break,redirect,permanent

  last:重寫完成之後停止對當前uri的進一步處理,改為對新uri的新一輪處理,在nginx內部完成,客戶端不會察覺

 

  break:重寫完成後,停止對當前uri的處理,轉向其後面的其他處理

 

  補充:last 重寫之後還會在nginx內部重新自上而下檢查rewrite匹配規則,break則不會重新檢查rewrite匹配規則

 

  redirect:重寫完成之後會返回給客戶端一個臨時重定向,客戶端瀏覽器自動對新的uri發起請求(302)

 

  permanent:重寫完成後會返回給客戶端一個永久重定向,客戶端瀏覽器自動對新的uri發起請求(301)

應用上下文:http,server,location,if

 

實例:

.*表示任意內容,\.表示對.進行轉義  $1對前面的第一個()中的內容$2引用第二個()中的內容以此類推

http://www.b.com/download/a/media/12.php--->/tmp/download/a/mp3/12.html

 

如果flag沒有指定,則預設為last

PCRE正則表達式元字元

      字元匹配 . [] [^]

      次數匹配 * + ? {m} {m,} {m,n}

      位置定位 ^,$

      或者 |

      分組 () 後向引用 $1 $2…

 

rewrite_log on|off  是否將重寫日誌記入error log中,預設為關閉

www.c.com/bbs/index.html---> /tmp/vhost2/forum/index.html

 

上面的if語句的作用:www.c.com/download ---> www.c.com/index.html   return表示把新的uri發送給客戶端,由客戶端重新

請求

 

http://www.c.com/hello/ ---> https://www.baidu.com

 

模塊ngx_http_gzip_static_module是nginx會讀取預先gzip壓縮好的文件,靜態壓縮只需壓縮一次,不需要每次請求都壓縮,此模

塊編譯時需要使用--with-http_gzip_static_module參數才會被編譯,模塊ngx_http_gzip_module不需指定預設會被編譯

 

gzip on 開啟動態壓縮功能  gzip_min_length 觸發壓縮功能的響應報文的最小長度 單位為位元組  gzip_http_version 觸發壓縮功能

的http協議最小版本  gzip_disable msie6 對IE6的瀏覽器發送響應報文時不進行壓縮   gzip_types 對哪些類型的資源做壓縮

 

反向代理模塊ngx_http_proxy_module 預設會被編譯

proxy_pass URL

應用上下文:location,location內部的if中,limit_except

反代www.d.com--->http://192.168.238.150  註意如果location中使用了模式匹配如 ~*,~等proxy_pass最後的斜線不能加

否者會報錯

這裡還得說下location 後面匹配的優先順序

 =:URI的精確匹配;

~:做正則表達式匹配,區分字元大小寫;
~*:做正則表達式匹配,不區分字元大小寫;
^~:URI的左半部分匹配,不區分字元大小寫;

匹配優先順序:精確匹配=、^~、~或~*、不帶符號的URL

 

上面三個圖都是反代www.d.com/admin --> http://192.168.238.150/admin/    因此如果http://192.168.238.150/ 則最後

的/會被location後定義的參數覆蓋,如果http://192.168.238.150則location後定義的參數會被添加到http://192.168.238.150後

面, 

 

反代www.d.com/admin ---> http://192.168.238.150/hello  如果location中最後有/則hello最後也要有/否則會報錯

 

如果location後面跟了正則表達式或者location上下文使用了rewrite則proxy_pass 後的url 必須是http://192.168.238.150這種形

式,後面不能帶uri,哪怕只有/也不可以

 

接下來瞭解一個參數proxy_set_header field value,用於proxy_server向backend server 發送請求報文時,將某請求首部重新賦

值,或在原有值後面添加一個新值,或者自定義一個新首部,比如proxy_set_header Host value  Host是請求報文請求首部的

Host,這裡的value有兩個值要介紹一下,$proxy_host  假如proxy_pass http://www.a.com 那$proxy_host指的就是

www.a.com,  $http_host 這個是客戶端請求報文請求首部Host的值

 

 

上面的proxy_set_header作用是當nginx作為反代去請求backend server時會在請求首部添加一個x-real-ip的首部,並且指定其值

為$remote_addr

 

$remote_addr代表上游客戶端的ip地址,我們去backend server上修改一下日誌記錄格式就可以將上游客戶端的ip地址記錄到日誌

中去了(後端是httpd server)

 到後端server修改日誌格式 vim /var/log/httpd/access.log

 

將LogFormat 後的%h修改為%{x-real-ip}i  後面的i是指定其值的,但是如果有多層反代怎麼解決記錄真實ip地址的問題?

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for  其中X-Forwarded-For是約定俗成的首部名,

$proxy_add_x_forwarded_for的含義是不管X-Forwarded-For中有沒有值都將上游客戶端的ip地址添加到X-Forwarded-For首部

中,每台反代都添加這條命令就解決了上面的問題,如果通過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串ip

值,究竟哪個才是真正的用戶端的真實IP呢?

X-Forwarded-For: client1, proxy1, proxy2

X-Forwarded-For會取得第一個非unknown的有效IP字元串。

 

 

上面的設置,當代理伺服器向後端請求時,會將請求報文的請求首部Host設置為客戶端請求報文的請求首部Host的值

 

add_header這個參數是當代理伺服器返回給客戶端是在響應首部添加Via這個首部並賦值為$server_addr  $server_addr是nginx的

內置變數其值為代理伺服器自己的ip地址

 

 

反向代理緩存能把靜態頁面和動態頁面的請求都緩存下來,proxy_cache_path 只能存放於http上下文中,不能放置於server或

location

proxy_cache_path 指定緩存目錄,prxoy的上一級目錄必須存在否則會報錯, levels指定該緩存空間有兩層hash目錄,第一層目錄

為1個字元,第二層為2個字元,keys_zone=pcache 參數用來為這個緩存區起名(proxy_cache 指令需要用到  其後對應緩存區名

稱)後面的10m指記憶體緩存空間大小為10MB(這個10MB指的是對文件元數據的緩存), inactive=3h 指如果緩存數據在3小時

(天:d、秒:s、分:m)內沒有被訪問,將自動被刪除 max_size=10g 指硬碟緩存大小為10GB,proxy_cache調用緩存區後跟值

off表示禁用  proxy_cache_key $request_uri  以$request_uri的值為緩存鍵值,這樣做即使有多個主機名也一樣能緩存命中了 ,

這個參數可以省略不用指 

請求

http://www.ooxx.com/book/1232.html 
$request_uri獲取的只是/book/1232.html

proxy_cache_valid指令,可以在http、server、location中使用,如果proxy_cache_valid 不指定狀態碼,直接指定緩存時間,將

只緩存預設的狀態碼(200、301、302),而如果需要對304也指定,則需要寫完整的狀態碼,如上面寫的200 304

 

proxy_connect_timeout 定義與後端伺服器的超時時長;預設為60s 建議不超過75s

proxy_send_timeout 請求報文發送給後端伺服器的超時時長,預設為60s

proxy_read_timeout 等待後端伺服器發送響應報文的超時時長,預設為60s

上面三個指令可以定義在http server location中


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於排查問題找出性能瓶頸來說,最容易發現並解決的問題就是MYSQL的慢查詢以及沒有得用索引的查詢。 方法一: 這個方法我正在用,呵呵,比較喜歡這種即時性的。 Mysql5.0以上的版本可以支持將執行比較慢的SQL語句記錄下來。mysql> show variables like 'long%'; 註 ...
  • 閱讀目錄 序 時間同步 系列索引 本文版權歸mephisto和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作。 文章是哥(mephisto)寫的,SourceLink 本文版權歸mephisto和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作。 本文版權歸meph ...
  • SQL Server中,經常會用到Identity標識列,這種自增長的欄位操作起來的確是比較方便。但它有時還會帶來一些麻煩。 示例一 :當表中被刪除了某些數據的時候,自增長列的編號就不再是一個連線的數列。這種時候我們可以用以下方案來解決。 http://www.cnblogs.com/rouchen ...
  • --模擬用戶登錄,該用戶ID為1010 fnd_global.apps_initialize(user_id => 1010, resp_id => 20420, resp_appl_id => 1); end; --獲取當時登錄的用戶的ID DECLARE l_user_id NUMBER :=  ...
  • 估計沒什麼價值,單純地記錄下時間,以便以後查看。 TMS320F28335 STM32f030 i3 4170 i3 4170 主頻 150MHz 48MHz 3.7GHZ 3.7GHZ IDE CCS6.0 Eclipse VS2015社區版 VS2015社區版 加速技術 rts2800_fpu3 ...
  • crontab參數: -u:幫助其他用戶建立或移除工作排程 -l:查閱crontab的工作內容 -r:移除所有的crontab的工作內容 -e:編輯crontab文件 每項工作有六個欄位: * * * * * * 分鐘 小時 日期 月份 周 指令 0-59 0-23 1-31 1-12 0-7 指令 ...
  • ARM9嵌入式學習筆記(1) Linux命令 實驗1 1 2 Linux常見命令使用 1. 添加用戶 ; 設置賬戶密碼 ; 切換用戶 2. 關機命令 3. 拷貝命令 cp /home/test /tmp/ //將test文件拷貝到tmp目錄下 cp r /home/dir1 /tmp/ //將目錄d ...
  • 項目檢出 如果你的git還沒有代碼倉庫,可以用過git的代碼倉庫頁面新建一個你的倉庫 創建git上的倉庫後,我們還需要建立本地的倉庫,所以打開Mac終端,建立本地倉庫文件夾(這裡我用HelloC),然後進入到新建的文件夾下 mkdir HelloC cd HelloC 在git頁面中,複製你的倉庫地 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...