Nginx常見配置
在此之前,先把配置引數所在位置分為四層
1. conf 全域性層
2. http 伺服器層
3. server 虛擬主機層
4. location 定位層
一、全域性層
#有1個工作的子程式,可以自行修改,但太大無益,因為要爭奪CPU,一般設定為 CPU數*核數 worker_processes 1; #一般是配置nginx連線的特性,如1個子程式能同時允許多少連線 Event { #這是指一個子程式最大允許連1024個連線 worker_connections 1024; } #這是配置http伺服器的主要段 http { #這是虛擬主機段 Server1 { #定位,把特殊的路徑或檔案再次定位,如image目錄單獨處理,如.php單獨處理 Location { ... } } Server2 { ... } }
二、HTTP伺服器層
1. 網頁內容的壓縮編碼與傳輸速度優化
請求: Accept-Encoding:gzip,deflate,sdch 響應: Content-Encoding:gzip Content-Length:36093
原理:
瀏覽器---請求----> 宣告可以接受 gzip壓縮 或 deflate壓縮 或compress 或 sdch壓縮。
從http協議的角度看--請求頭 宣告 acceopt-encoding: gzip deflate sdch (是指壓縮演算法,其中sdch是google倡導的一種壓縮方式,目前支援的伺服器尚不多)
伺服器-->迴應---把內容用gzip方式壓縮---->發給瀏覽器
瀏覽<-----解碼gzip-----接收gzip壓縮內容
gzip #配置的常用引數 gzip on|off; #是否開啟gzip gzip_buffers 32 4K | 16 8K #緩衝(壓縮在記憶體中緩衝幾塊? 每塊多大?) gzip_comp_level #[1-9] #推薦6 壓縮級別(級別越高,壓的越小,越浪費CPU計算資源) gzip_disable #正則匹配UA 什麼樣的Uri不進行gzip gzip_min_length 200 #開始壓縮的最小長度(再小就不要壓縮了,意義不在) gzip_http_version 1.0|1.1 # 開始壓縮的http協議版本(可以不設定,目前幾乎全是1.1協議) gzip_proxied #設定請求者代理伺服器,該如何快取內容 gzip_types text/plain application/xml #對哪些型別的檔案用壓縮如txt,xml,html ,css ,若不知道型別名稱,可以檢視nginx下conf資料夾的mime.types gzip_vary on|off #是否傳輸gzip壓縮標誌
注意:
圖片/mp3這樣的二進位制檔案,不必壓縮因為壓縮率比較小,比如100->80位元組,而且壓縮也是耗費CPU資源的。比較小的檔案不必壓縮。
2. 快取設定
對於網站的圖片,尤其是新聞站,圖片一旦釋出,改動的可能是非常小的。我們希望 能否在使用者訪問一次後,圖片快取在使用者的瀏覽器端,且時間比較長的快取。
可以, 用到nginx的expires設定。
#在location或if段裡 expires 30s; expires 30m; expires 2h; expires 30d; location ~ image { expires 1d; }
另: 304 也是一種很好的快取手段
原理是: 伺服器響應檔案內容是,同時響應etag標籤(內容的簽名,內容一變,他也變), 和 last_modified_since 2個標籤值。瀏覽器下次去請求時,頭資訊傳送這兩個標籤, 伺服器檢測檔案有沒有發生變化,如無,直接頭資訊返回 etag,last_modified_since
瀏覽器知道內容無改變,於是直接呼叫本地快取。
這個過程,也請求了伺服器,但是傳著的內容極少。
對於變化週期較短的,如靜態html,js,css,,比較適於用這個方式
三、虛擬主機層
#基於域名的虛擬主機 server { listen 80; #監聽埠 server_name a.com; #監聽域名 location / { root /var/www/a.com; #根目錄定位 index index.html; } } #基於埠的虛擬主機配置 訪問 192.xxx.xx.xxx:8080 server { listen 8080; #監聽8080埠 server_name 192.xxx.xx.xxx; #伺服器IP地址 location / { root /var/www/html8080; index index.html; } }
1. 日誌管理
#不同的server可以使用不同的log #此處定義了日誌格式,最好定位在頂層,方便其他server公用 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; $remote_addr 使用者ip $remote_user [$time_local] 使用者訪問時間 $request 請求型別 get,post... $status 請求狀態 200 304... $body_bytes_sent 請求的內容有多少位元組 $http_referer 上一個頁面來自哪裡(從哪裡跳轉過來) $http_user_agent 使用者代理(用了什麼瀏覽器訪問) #這說明 該server, 它的訪問日誌的檔案,使用的格式main格式. access_log logs/host.access.log main;
寫一個sh指令碼,每天半夜切分log日誌,避免log每天累積造成檔案過大
#!/bin/bash base_path='/usr/local/nginx/logs' log_path=$(date -d yesterday +"%Y%m") day=$(date -d yesterday +"%d") mkdir -p $base_path/$log_path mv $base_path/access.log $base_path/$log_path/access_$day.log #echo $base_path/$log_path/access_$day.log kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` #Crontab 編輯定時任務 01 00 * * * /xxx/path/b.sh 每天0時1分(建議在02-04點之間,系統負載小)
四、定位層
1. location定位
location 有“定位”的意思,根據Uri來進行不同的定位,在虛擬主機的配置中,是必不可少的。location可以把網站的不同部分,定位到不同的處理方式上。
當我們碰到“.php”, 如何呼叫PHP直譯器? --這時就需要location
#location 的語法 location [=|~|~*|^~] patt { ... } #中括號可以不寫任何引數,此時稱為一般匹配 #也可以寫引數 #因此,大型別可以分為3種 #首先看有沒有精準匹配,如果有,則停止匹配過程,若沒有向下匹配到最符合的location location = patt {} #[精準匹配] location patt{} #[一般匹配] location ~ patt{} #[正則匹配]
匹配順序例項1
location / { root /usr/local/nginx/html; index index.html index.htm; } location ~ image { root /var/www/image; index index.html; } #如果我們訪問 http://xx.com/image/logo.png #此時, “/” 與”/image/logo.png” 匹配 #同時,”image”正則 與”image/logo.png”也能匹配,誰發揮作用? #正規表示式的成果將會使用. #圖片真正會訪問 /var/www/image/logo.png #注意,若在roo最後加了'/',那麼將訪問/var/www/image/image/logo.png
匹配順序例項2
location / { root /usr/local/nginx/html; index index.html index.htm; } location /foo { root /var/www/html; index index.html; } #我們訪問 http://xxx.com/foo #對於uri “/foo”, 兩個location的patt,都能匹配他們 #即 ‘/’能從左字首匹配 ‘/foo’, ‘/foo’也能左字首匹配’/foo’, #此時, 真正訪問 /var/www/html/index.html #原因:’/foo’匹配的更長,因此使用之
總結:
- 先判斷精準命中,如果命中,立即返回結果並結束解析過程
- 判斷普通命中,如果有多個命中,記錄下最長的命中結果為準(記錄但不結束)
- 繼續判斷正規表示式的解析結果,按配置裡的正規表示式順序為準,由上往下,一旦匹配成功1個,立即返回結果,並結束解析
分析:
- 普通命中順序無所謂,按命中長短來決定
- 正則命中,按順序
2. rewrite 重寫
#重寫中用到的指令 if (條件) {} #設定條件,再進行重寫 set #設定變數 return #返回狀態碼 break #跳出rewrite rewrite #重寫 #If 語法格式 If 空格 (條件) { 重寫模式 } #條件語法 1: “=”來判斷相等, 用於字串比較 2: “~” 用正則來匹配(此處的正則區分大小寫) ~* 不區分大小寫的正則 3: -f -d -e來判斷是否為檔案,為目錄,是否存在.
例子
location / { #當訪問ip相等時,返回403 if ($remote_addr = 192.xxx.xx.xx) { return 403; } #如果是IE瀏覽器訪問 if ($http_user_agent ~ MSIE) { rewrite ^.*$ /ie.htm; break; #若不brea,重定向後又會匹配到IE瀏覽器,又走到這一步,會迴圈重定向 } #若訪問目錄、檔案不存在,重定向到404頁面 if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /404.html break; } root html; index index.html }
以xx.com/dsafsd.html這個不存在頁面為例,我們觀察訪問日誌,日誌中顯示的訪問路徑,依然是GET /dsafsd.html HTTP/1.1。提示:伺服器內部的rewrite和302跳轉不一樣。
跳轉的話URL都變了,變成重新http請求404.html,而內部rewrite, 上下文沒變,
就是說 fastcgi_script_name 仍然是 dsafsd.html,因此會迴圈重定向。
set 是設定變數用的, 可以用來達到多條件判斷時作標誌用,達到apache下的 rewrite_condition的效果
#使用set方式防止重定向死迴圈 if ($http_user_agent ~* msie) { set $isie 1; } if ($fastcgi_script_name = ie.html) { set $isie 0; } if ($isie 1) { rewrite ^.*$ ie.html; }
3. Nginx與PHP配合
#當碰到訪問 .php 的時候時候 location ~ \.php$ { root html; #把請求的資訊轉發給9000埠的PHP程式 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #告訴php程式想執行哪個php檔案 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #1: 碰到php檔案, #2: 把根目錄定位到 html, #3: 把請求上下文轉交給9000埠PHP程式, #4: 並告訴PHP程式,當前的指令碼是 $document_root$fastcgi_scriptname # (注:PHP會去找這個指令碼並處理,所以指令碼的位置要指對)
4. 反向代理 + 負載均衡
用nginx做反向代理和負載均衡非常簡單。
只需要兩個配置, 1個proxy, 1個upstream,分別用來做反向代理,和負載均衡。
以反向代理為例,nginx不自己處理php的相關請求,而是把php的相關請求轉發給apache來處理。
#將php程式交給8080埠的apache處理,實現動靜分離 location ~ \.php$ { proxy_pass http://xxx.xxx.xx:8080 }
http { ... #負載均衡伺服器池 upstream xxx { server 127.xx.xx.xx1; server 127.xx.xx.xx2; } server { liseten 80; server_name localhost; location / { #使用者真實IP proxy_set_header X-Real-IP $remote_addr; proxy_pass http://xxx #upstream 對應自定義名稱 include proxy.conf; } } }
相關文章
- nginx常見命令Nginx
- nginx 常見引數以及重定向引數配置Nginx
- Nginx 內容快取及常見引數配置Nginx快取
- 【Nginx】常見問題Nginx
- nginx 常見問題Nginx
- Nginx伺服器常見配置清單備忘錄Nginx伺服器
- docker常見配置Docker
- nginx實現常見場景Nginx
- 阿里雲centos7伺服器nginx配置及常見問題解答阿里CentOS伺服器Nginx
- keepalived 1.3.5常見配置以及常見問題解決
- Django中的session常見配置DjangoSession
- Flutter配置環境常見問題Flutter
- Nginx入門到實戰(4)常見問題Nginx
- MySQL常見的配置引數概覽MySql
- Hive學習之常見屬性配置Hive
- ODBC 常見資料來源配置整理
- Nginx 配置Nginx
- 配置nginxNginx
- nginx配置Nginx
- vscode與chrome除錯配置與常見問題VSCodeChrome除錯
- 服務端常見服務安裝及配置服務端
- CUDA常見編譯器配置問題一覽編譯
- nginx之 nginx限流配置Nginx
- 教你解決Python3+selenium配置常見報錯Python
- SpringCloud之Eureka的常見問題及配置優化SpringGCCloud優化
- SharePlex安裝配置、常用功能配置文件、常見故障處理文件
- Nginx Location 配置Nginx
- nginx 配置使用Nginx
- Nginx配置HTTPSNginxHTTP
- nginx代理配置Nginx
- 配置nginx支援Nginx
- nginx常用配置Nginx
- Docker配置nginxDockerNginx
- NGINX基本配置Nginx
- 【Nginx】Referer配置Nginx
- Nginx - 最小配置Nginx
- Nginx部署配置Nginx
- Nginx 配置域名Nginx