Nginx常見配置

二話不說,直接進入配置主題,若對 nginx毫無瞭解的請跳轉 Nginx入門到實戰(1)基礎篇

在此以前,先把配置參數所在位置分爲四層php

1. conf 全局層
2. http 服務器層
3. server 虛擬主機層
4. location 定位層css

1、全局層

#有1個工做的子進程,能夠自行修改,但太大無益,由於要爭奪CPU,通常設置爲 CPU數*核數
worker_processes 1; 

#通常是配置nginx鏈接的特性,如1個子進程能同時容許多少鏈接
Event {
    
    #這是指一個子進程最大容許連1024個鏈接
    worker_connections  1024;
}

#這是配置http服務器的主要段
http { 
     
     #這是虛擬主機段
     Server1 {
      
            #定位,把特殊的路徑或文件再次定位,如image目錄單獨處理,如.php單獨處理
            Location {  
            ...    
            }
     }

     Server2 {
         ...
     }
}

2、HTTP服務器層

1. 網頁內容的壓縮編碼與傳輸速度優化

請求:
Accept-Encoding:gzip,deflate,sdch
響應:
Content-Encoding:gzip
Content-Length:36093

原理:
瀏覽器---請求----> 聲明能夠接受 gzip壓縮 或 deflate壓縮 或compress 或 sdch壓縮。html

從http協議的角度看--請求頭 聲明 acceopt-encoding: gzip deflate sdch (是指壓縮算法,其中sdch是google倡導的一種壓縮方式,目前支持的服務器尚很少)nginx

服務器-->迴應---把內容用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設置。apache

#在location或if段裏
    expires 30s;
    expires 30m;
    expires 2h;
    expires 30d;
    
location ~ image {
    expires 1d;
}

另: 304 也是一種很好的緩存手段segmentfault

原理是: 服務器響應文件內容是,同時響應etag標籤(內容的簽名,內容一變,他也變), 和 last_modified_since 2個標籤值。瀏覽器下次去請求時,頭信息發送這兩個標籤, 服務器檢測文件有沒有發生變化,如無,直接頭信息返回 etag,last_modified_since
瀏覽器知道內容無改變,因而直接調用本地緩存。
這個過程,也請求了服務器,可是傳着的內容極少。
對於變化週期較短的,如靜態html,js,css,,比較適於用這個方式瀏覽器

3、虛擬主機層

#基於域名的虛擬主機
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點之間,系統負載小)

4、定位層

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. 判斷普通命中,若是有多個命中,記錄下最長的命中結果爲準(記錄但不結束)
  3. 繼續判斷正則表達式的解析結果,按配置裏的正則表達式順序爲準,由上往下,一旦匹配成功1個,當即返回結果,並結束解析

分析:

  1. 普通命中順序無所謂,按命中長短來決定
  2. 正則命中,按順序

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

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

相關文章
相關標籤/搜索