nginx基本配置學習
阿新 • • 發佈:2018-12-25
關於代理
正向代理:也就是一個代理,其工作原理就是一個跳板,加入我要訪問google.com,但不能直接訪問,可以通過訪問A,A可以訪問到google.com,A此時就可以作為一個正向代理。正向代理是一個位於客戶端和原始伺服器(例如google)之間的伺服器,然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。 反向代理:正好相反,對於客戶端來說它就像是原始伺服器,並且客戶端不需要進行任何特別的設定,客戶端向反向代理的名稱空間中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這部分內容就是它自己的一樣。 nginx就是一個非常優秀的反向代理伺服器,nginx中的配置檔案主要是 nginx.conf,其結構相對來說比較清晰和簡單,大致的分塊:nginx檔案中的註釋行以#開頭, main部分主要屬性配置有:main (全域性設定) events (nginx工作模式) { .... } http { .... upstream myproject (負載均衡器設定) { ..... } server (主機設定) { .... location (url匹配) { .... } } server { .... location { .... } } .... }
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型別,型別在配置檔案目錄下的mime.type檔案定義,來告訴nginx來識別檔案型別。 default_type設定了預設的型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp檔案就會出現下載了。 sendfile on可以開啟高效檔案傳輸模式,將tcp_nopush和tcp_nodelay兩個屬性設定成on用於防止網路阻塞。 keepalive_timeout設定客戶端連線保持活動的超時時間,超過後伺服器會關閉該連線。 server模組在http模組範圍內,為子模組,用來定義一個虛擬主機,一個簡單的server定義例項: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;
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一起使用,進行伺服器健康狀態檢查。
server 192.168.1.130 weight=1 max_fails=2 fail_timeouts=30s;
- down:該伺服器暫時不參與負載均衡,相當於註釋;
- backup:這臺機器是備份伺服器,當其他伺服器不可用時才使用;
- weight輪詢(預設),每個請求按照順序逐一分配,會自動剔除宕機的伺服器;
- ip_hash,每個請求按訪問ip的hash結果分配,同一個ip的訪客會固定訪問同一臺伺服器,解決動態網頁存在的session共享問題;
- fair,只能負載均衡演算法,根據頁面大小和載入時間長短智慧地進行負載均衡,根據後端伺服器的響應時間來分配請求,需要下載upstream_fair來支援該演算法;
- url_hash,根據訪問url進行hash的結果來分配請求,使得每個url定向到同一個伺服器,進一步提高後端快取伺服器的效率,需要下載hash軟體包支援該演算法;
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: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
在淘寶改進的tengine中,有些訪問日誌欄位不支援,例如在我們的環境中$upstream_addr就不起作用。