Nginx常見配置

NO IMAGE

二話不說,直接進入配置主題,若對nginx

二、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

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;  
}
}
}

有收穫的朋友記得點個 收藏 哦~