1. 程式人生 > >nginx基本配置學習

nginx基本配置學習

關於代理

正向代理:也就是一個代理,其工作原理就是一個跳板,加入我要訪問google.com,但不能直接訪問,可以通過訪問A,A可以訪問到google.com,A此時就可以作為一個正向代理。正向代理是一個位於客戶端和原始伺服器(例如google)之間的伺服器,然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。 反向代理:正好相反,對於客戶端來說它就像是原始伺服器,並且客戶端不需要進行任何特別的設定,客戶端向反向代理的名稱空間中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這部分內容就是它自己的一樣。 nginx就是一個非常優秀的反向代理伺服器,nginx中的配置檔案主要是 nginx.conf,其結構相對來說比較清晰和簡單,大致的分塊:
main (全域性設定)
events (nginx工作模式)  {
  ....
}
http        {
  ....
  upstream myproject (負載均衡器設定) {
    .....
  }
  server (主機設定) {
    ....
    location (url匹配) {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}
  nginx檔案中的註釋行以#開頭, main部分主要屬性配置有:
user nobody
 
worker_processes auto;
pid logs/nginx.pid;
 
worker_cpu_affinity auto;
  執行nginx的使用者,這也決定了該程序能否訪問的檔案系統讀寫許可權。 在linux/unix系統中,一般的程序都會將本程序的pid寫到一個磁碟檔案中,其中只有一行,用cat命令可以檢視。使用檔案作為程序鎖,可以防止程序啟動多個副本,只有獲得pid(固定路徑固定檔名)寫入許可權的程序才能正常啟動並把自身的pid寫入到該檔案中,其他同一個程式的多餘程序則自動退出。 對於worker_processes,應該為worker角色程序個數,nginx啟動後會有多個worker處理http請求,master角色程序並不處理請求,而是根據相應配置檔案資訊管理worker程序,master程序主要負責接收客戶端的請求,並將請求分配給多個worker,每個worker程序負責真正處理請求。 最理想的worker_processes值取決於很多因素,包含但不限於cpu核數,如果設定成自動(auto),會自動檢測cpu cores並設定worker_processes引數。如果nginx處理的是cpu密集型,比較耗費cpu的操作,建立將此值設定為cpu個數或cpu核數。 events模組用來指定nginx的工作模式以及連線數上限
events {
    use kqueue; #mac
    worker_connections  51200;
}
  use用來指定nginx的工作模式,支援的有:select, poll, kqueue, epoll, rtsig, /dev/poll,其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,因為Mac基於BSD,所以Mac也得用這個模式,對於Linux系統,epoll工作模式是首選。 worker_connections,每個worker程序能夠併發處理(發起)的最大連線數(包含所有連線數)。需要注意的是,這個數量包括了所有連線,與被代理服務之間的連線數,與其他角色之間的,不僅僅是與客戶端的,另一個需要注意的是這個實際的值不能超過當前最大檔案開啟數量(worker_rlimit_nofile)。 程序的最大連線數受Linux系統程序的最大開啟檔案數限制,在執行作業系統命令“ulimit -n 65536”後worker_connections的設定才能生效。 http模組是最核心的模組,負責http伺服器相關屬性的配置:
include       mime.types;
     default_type  application/octet-stream;
     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
     #                  '$status $body_bytes_sent "$http_referer" '
     #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
     access_log on;
     log_format main '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
     access_log  /usr/local/etc/nginx/logs/access.log  main;
 
     sendfile        on;
     #tcp_nopush     on;
 
     #keepalive_timeout  0;
     keepalive_timeout  65;
 
     #gzip  on;
  include 來用設定檔案的mime型別,型別在配置檔案目錄下的mime.type檔案定義,來告訴nginx來識別檔案型別。 default_type設定了預設的型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp檔案就會出現下載了。 sendfile on可以開啟高效檔案傳輸模式,將tcp_nopush和tcp_nodelay兩個屬性設定成on用於防止網路阻塞。 keepalive_timeout設定客戶端連線保持活動的超時時間,超過後伺服器會關閉該連線。 server模組在http模組範圍內,為子模組,用來定義一個虛擬主機,一個簡單的server定義例項:
server {  #定義虛擬主機開始
        listen       8080; #指定虛擬機器主機的服務埠
        server_name  localhost 192.168.1.130 www.aaa.com; #指定ip地址或者域名,多個域名用空格分開
        # 全域性定義,如果都是這一個目錄,這樣定義最簡單。
        root   /Users/yangyi/www; #server虛擬機器內全部的root web根目錄
        index  index.php index.html index.htm; #定義全域性訪問預設地址
        charset utf-8; # 網頁預設編碼格式
        access_log  usr/local/var/log/host.access.log  main; #訪問日誌
        error_log  usr/local/var/log/host.error.log  error; #錯誤日誌
        ....
}
   location模組是nginx中使用率非常高的,也很重要,用來定位和解析URL,提供了強大的正則表示式功能,同時支援條件判斷匹配,使用者可以通過location指令實現nginx對動靜網頁進行過濾處理。 location / 表示匹配訪問根目錄,root指定指定訪問根目錄時虛擬主機的web目錄,該目錄可以是相對路徑(相對nginx),也可以為絕對路徑。 預設的首頁和虛擬機器目錄,index用於設定我們只輸入域名後的預設首頁地址。
location / {
            root   /Users/aaa/www;
            index  index.php index.html index.htm;
        }
  此外,location還可以進行正則匹配,例如php環境的配置:
location ~ \.php$ {
            root           /Users/aaa/www;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }
  nginx中提供了強大而簡單的負載均衡功能,使用的是upstream模組,一個簡單的例子:
upstream webservers{
    server 192.168.33.11 weight=10;
    server 192.168.33.12 weight=10;
    server 192.168.33.13 weight=10;
}
server {
    listen 80;
    server_name upstream.iyangyi.com;
    access_log /usr/local/var/log/nginx/upstream.iyangyi.access.log main;
    error_log /usr/local/var/log/nginx/upstream.iyangyi.error.log error;
    location / {
        proxy_pass http://webservers;
        proxy_set_header  X-Real-IP  $remote_addr;
    }
}
  通過 location的proxy_pass來將請求導至 webservers中(名稱可自定義),定義的upstream將請求根據weight(權重)分發至對應的3臺伺服器中,在upstream模組中還有另外的引數:
  • max_fails: 允許請求失敗的次數,預設為1,當超過最大次數時,返回proxy_next_upstream模組定義的錯誤;
  • fail_timeout: 在經理max_fails次失敗後,暫停服務的時間,與max_fails一起使用,進行伺服器健康狀態檢查。
當失敗2次後,就停止30秒該服務。
server 192.168.1.130 weight=1 max_fails=2 fail_timeouts=30s;
  
  • down:該伺服器暫時不參與負載均衡,相當於註釋;
  • backup:這臺機器是備份伺服器,當其他伺服器不可用時才使用;
upstream可以使用某種負載均衡演算法來進行排程,當前支援的有:
  • weight輪詢(預設),每個請求按照順序逐一分配,會自動剔除宕機的伺服器;
  • ip_hash,每個請求按訪問ip的hash結果分配,同一個ip的訪客會固定訪問同一臺伺服器,解決動態網頁存在的session共享問題;
  • fair,只能負載均衡演算法,根據頁面大小和載入時間長短智慧地進行負載均衡,根據後端伺服器的響應時間來分配請求,需要下載upstream_fair來支援該演算法;
  • url_hash,根據訪問url進行hash的結果來分配請求,使得每個url定向到同一個伺服器,進一步提高後端快取伺服器的效率,需要下載hash軟體包支援該演算法;
注意,當選擇ip_hash時,weight和backup引數會失效。 日誌 nginx中有兩種日誌,訪問日誌和錯誤日誌。其中訪問日誌記錄客戶端訪問nginx的每一個請求,包括使用者地域來源,跳轉來源,使用終端某個url訪問量等,訪問日誌可以自定義;錯誤日誌則記錄使用者訪問nginx出錯時的日誌,格式不支援自定義,通過錯誤日誌可以得到系統某個服務或server的效能瓶頸。 在http中開啟訪問日誌,access_log屬性為on,access_log指定日誌的地址
access_log on;
log_format main '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
access_log  /usr/local/etc/nginx/logs/access.log  main;
  log_format指定日誌的格式,其中$後面就是nginx中定義的變數,如果按照上面的配置,日誌如下:
[31/Oct/2016:20:43:27 +0800] 127.0.0.1 - - - localhost  to: 119.254.109.163:8081: GET /home/homePage/getHomeImg.json HTTP/1.1 upstream_response_time 0.165 msec 1477917807.635 request_time 0.165
  日誌中屬性的含義:
屬性名稱 屬性含義
$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址
$time_local 記錄訪問時間與時區
$remote_user 記錄客戶端使用者名稱稱
$request 記錄請求的url與http協議
$request_uri  /stat.php?id=1585378&web_id=1585378
$request_time 請求的耗時 0.205
$connection 所用連線序號
$http_referer 用來記錄從哪個頁面連結過來的
$http_user_agent 記錄客戶端瀏覽器的相關資訊 “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$body_bytes_sent 記錄傳送給客戶端檔案主體內容大小
$status 記錄請求狀態;成功是200
$http_host 請求地址,即瀏覽器中你輸入的地址(IP或域名) img.alipay.com 10.253.70.103
$upstream_status upstream狀態 200
$ssl_protocol SSL協議版本 TLSv1
$ssl_cipher 交換資料中的演算法 RC4-SHA
nginx常見問題 出現nginx pid檔案失敗,使用nginx -s reload時,需要根據pid檔案中的程序id(pid)來重新載入配置,如果沒有一個已經執行的nginx程序,就無法向其傳送訊號(signal),此時直接執行nginx即可。
nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
   在淘寶改進的tengine中,有些訪問日誌欄位不支援,例如在我們的環境中$upstream_addr就不起作用。