1. 程式人生 > >nginx的配置檔案詳解

nginx的配置檔案詳解

nginx.conf配置檔案詳解

其實,對比,apache的配置檔案,它的相對比較清晰和簡單,之前覺得很難,現在沉下心來想想,其實很簡單。大致的分塊下,基本就分為以下幾塊:

  1. main
  2. events {
  3. ....
  4. }
  5. http {
  6. ....
  7. upstream myproject {
  8. .....
  9. }
  10. server {
  11. ....
  12. location {
  13. ....
  14. }
  15. }
  16. server {
  17. ....
  18. location {
  19. ....
  20. }
  21. }
  22. ....
  23. }

nginx配置檔案主要分為六個區域: 
main(全域性設定)events(nginx工作模式)http(http設定)、 
sever(主機設定)

location(URL匹配)upstream(負載均衡伺服器設定)

main模組

下面時一個main區域,他是一個全域性的設定:

  1. user nobody nobody;
  2. worker_processes 2;
  3. error_log /usr/local/var/log/nginx/error.log notice;
  4. pid /usr/local/var/run/nginx/nginx.pid;
  5. worker_rlimit_nofile 1024;

user 來指定Nginx Worker程序執行使用者以及使用者組,預設由nobody賬號執行。

worker_processes來指定了Nginx要開啟的子程序數。每個Nginx程序平均耗費10M~12M記憶體。根據經驗,一般指定1個程序就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的程序數即可。我這裡寫2,那麼就會開啟2個子程序,總共3個程序。

error_log用來定義全域性錯誤日誌檔案。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。

pid用來指定程序id的儲存檔案位置。

worker_rlimit_nofile用於指定一個nginx程序可以開啟的最多檔案描述符數目,這裡是65535,需要使用命令“ulimit -n 65535”來設定。

events 模組

events模組來用指定nginx的工作模式和工作模式及連線數上限,一般是這樣:

  1. events {
  2. use kqueue;#mac平臺
  3. worker_connections
    1024;
  4. }

use用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,因為Mac基於BSD,所以Mac也得用這個模式,對於Linux系統,epoll工作模式是首選。

worker_connections用於定義Nginx每個程序的最大連線數,即接收前端的最大請求數,預設是1024。最大客戶端連線數由worker_processesworker_connections決定,即Max_clients=worker_processes*worker_connections,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections/4。 
程序的最大連線數受Linux系統程序的最大開啟檔案數限制,在執行作業系統命令“ulimit -n 65536”後worker_connections的設定才能生效。

http 模組

http模組可以說是最核心的模組了,它負責HTTP伺服器相關屬性的配置,它裡面的server和upstream子模組,至關重要,等到反向代理和負載均衡以及虛擬目錄等會仔細說。

  1. http{
  2. include mime.types;
  3. default_type application/octet-stream;
  4. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  5. '$status $body_bytes_sent "$http_referer" '
  6. '"$http_user_agent" "$http_x_forwarded_for"';
  7. access_log /usr/local/var/log/nginx/access.log main;
  8. sendfile on;
  9. tcp_nopush on;
  10. tcp_nodelay on;
  11. keepalive_timeout 10;
  12. #gzip on;
  13. upstream myproject {
  14. .....
  15. }
  16. server {
  17. ....
  18. }
  19. }

下面詳細介紹下這段程式碼中每個配置選項的含義。 
include 來用設定檔案的mime型別,型別在配置檔案目錄下的mime.type檔案定義,來告訴nginx來識別檔案型別。

default_type設定了預設的型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp檔案就會出現下載了。

log_format用於設定日誌的格式,和記錄哪些引數,這裡設定為main,剛好用於access_log來紀錄這種型別。

main的型別日誌如下:也可以增刪部分引數。

127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"

access_log 用來紀錄每次的訪問日誌的檔案地址,後面的main是日誌的格式樣式,對應於log_formatmain

sendfile引數用於開啟高效檔案傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設定為on用於防止網路阻塞。

keepalive_timeout設定客戶端連線保持活動的超時時間。在超過這個時間之後,伺服器會關閉該連線。

還有很多各種配置,以後等用到來再說。

server 模組

sever 模組是http的子模組,它用來定一個虛擬主機,我們先講最基本的配置,這些在後面再講。

我們看一下一個簡單的server 是如何做的?

  1. server {
  2. listen 8080;
  3. server_name localhost 192.168.12.10 www.yangyi.com;
  4. # 全域性定義,如果都是這一個目錄,這樣定義最簡單。
  5. root /Users/yangyi/www;
  6. index index.php index.html index.htm;
  7. charset utf-8;
  8. access_log usr/local/var/log/host.access.log main;
  9. aerror_log usr/local/var/log/host.error.log error;
  10. ....
  11. }

server標誌定義虛擬主機開始。 
listen用於指定虛擬主機的服務埠。 
server_name用來指定IP地址或者域名,多個域名之間用空格分開。 
root 表示在這整個server虛擬主機內,全部的root web根目錄。注意要和locate {}下面定義的區分開來。 
index 全域性定義訪問的預設首頁地址。注意要和locate {}下面定義的區分開來。 
charset用於設定網頁的預設編碼格式。 
access_log用來指定此虛擬主機的訪問日誌存放路徑,最後的main用於指定訪問日誌的輸出格式。

location 模組

location模組是nginx中用的最多的,也是最重要的模組了,什麼負載均衡啊、反向代理啊、虛擬域名啊都與它相關。慢慢來講:

location 根據它字面意思就知道是來定位的,定位URL,解析URL,所以,它也提供了強大的正則匹配功能,也支援條件判斷匹配,使用者可以通過location指令實現Nginx對動、靜態網頁進行過濾處理。像我們的php環境搭建就是用到了它。

我們先來看這個,設定預設首頁和虛擬機器目錄。

  1. location /{
  2. root /Users/yangyi/www;
  3. index index.php index.html index.htm;
  4. }

location /表示匹配訪問根目錄。

root指令用於指定訪問根目錄時,虛擬主機的web目錄,這個目錄可以是相對路徑(相對路徑是相對於nginx的安裝目錄)。也可以是絕對路徑。

index用於設定我們只輸入域名後訪問的預設首頁地址,有個先後順序:index.php index.html index.htm,如果沒有開啟目錄瀏覽許可權,又找不到這些預設首頁,就會報403錯誤。

location 還有一種方式就是正則匹配,開啟正則匹配這樣:location ~。後面加個~

下面這個例子是運用正則匹配來連結php。我們之前搭建環境也是這樣做:

  1. location ~ \.php$ {
  2. root /Users/yangyi/www;
  3. fastcgi_pass 127.0.0.1:9000;
  4. fastcgi_index index.php;
  5. include fastcgi.conf;
  6. }

\.php$ 熟悉正則的我們直到,這是匹配.php結尾的URL,用來解析php檔案。裡面的root也是一樣,用來表示虛擬主機的根目錄。 
fast_pass連結的是php-fpm 的地址,之前我們也搭建過。其他幾個引數我們以後再說。

location 還有其他用法,等講到例項的時候,再看吧。

upstram 模組

upstream 模組負債負載均衡模組,通過一個簡單的排程演算法來實現客戶端IP到後端伺服器的負載均衡。我先學習怎麼用,具體的使用例項以後再說。

  1. upstream iyangyi.com{
  2. ip_hash;
  3. server 192.168.12.1:80;
  4. server 192.168.12.2:80 down;
  5. server 192.168.12.3:8080 max_fails=3 fail_timeout=20s;
  6. server 192.168.12.4:8080;
  7. }

在上面的例子中,通過upstream指令指定了一個負載均衡器的名稱iyangyi.com。這個名稱可以任意指定,在後面需要的地方直接呼叫即可。

裡面是ip_hash這是其中的一種負載均衡排程演算法,下面會著重介紹。緊接著就是各種伺服器了。用server關鍵字表識,後面接ip。

Nginx的負載均衡模組目前支援4種排程演算法:

  1. weight 輪詢(預設)。每個請求按時間順序逐一分配到不同的後端伺服器,如果後端某臺伺服器宕機,故障系統被自動剔除,使使用者訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用於後端每個伺服器效能不均的情況下。
  2. ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共享問題。
  3. fair。比上面兩個更加智慧的負載均衡演算法。此種演算法可以依據頁面大小和載入時間長短智慧地進行負載均衡,也就是根據後端伺服器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支援fair的,如果需要使用這種排程演算法,必須下載Nginx的upstream_fair模組。
  4. url_hash。按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端快取伺服器的效率。Nginx本身是不支援url_hash的,如果需要使用這種排程演算法,必須安裝Nginx 的hash軟體包。

在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和埠,同時還可以設定每個後端伺服器在負載均衡排程中的狀態。常用的狀態有:

  • down,表示當前的server暫時不參與負載均衡。
  • backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。
  • max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。
  • fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。

注意 當負載排程演算法為ip_hash時,後端伺服器在負載均衡排程中的狀態不能是weight和backup。


轉載自:https://www.zybuluo.com/phper/note/89391