說說 NGINX 的配置及優化

最近感受不少東西在運用到必定的程度以後,會發現原來是本身瞭解到的不夠。一方面限於實際運用到的很少,一方面多是由於一開始沒有進行全面認識。遂這裏蒐集整理了一番NGINX。php

1、nginx啓動和關閉

centos平臺,源碼安裝的html

/usr/local/nginx/nginx            # 啓動
/usr/local/nginx/nginx -s reload  # 平滑重啓
/usr/local/nginx/nginx.conf       # 配置文件

mac平臺,使用brew安裝的前端

/usr/local/bin/nginx             # 啓動
/usr/local/bin/nginx -s reload   # 平滑重啓
/usr/local/etc/nginx/nginx.cnf   # 配置文件

2、nginx.conf 配置文件詳解

其實,對比,apache 的配置文件,它的相對比較清晰和簡單,以前以爲很難,如今沉下心來想一想,其實很簡單。大體的分塊下,基本就分爲如下幾塊:node

main
events   {
  ....
}
http        {
  ....
  upstream myproject {
    .....
  }
  server  {
    ....
    location {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}

以上咱們能夠看出,nginx配置文件主要分爲六個區域: nginx

一、main      (全局設置)
二、events    (nginx工做模式)
三、http      (http設置)
四、sever     (主機設置)
五、location  (URL匹配)
六、upstream  (負載均衡服務器設置)

2.1 main模塊

下面是一個main區域,他是一個全局的設置web

user nobody nobody;              # 指定 Nginx Worker 進程運行用戶以及用戶組,默認由 nobody 帳號運行
worker_processes 2;              # 指定 Nginx 要開啓的子進程數
error_log  /usr/local/var/log/nginx/error.log  notice;      # 定義全局錯誤日誌文件
pid        /usr/local/var/run/nginx/nginx.pid;              # 指定進程 id 的存儲文件位置
worker_rlimit_nofile 1024;       # 指定一個 nginx 進程能夠打開的最多文件描述符數目,若是設置 65535,須要使用命令 「ulimit -n 65535」 來設置

user 來指定 Nginx Worker 進程運行用戶以及用戶組,默認由 nobody 帳號運行。算法

worker_processes 來指定了 Nginx 要開啓的子進程數。每一個 Nginx 進程平均耗費 10M~12M 內存。根據經驗,通常指定 1 個進程就足夠了,若是是多核 CPU,建議指定和 CPU 的數量同樣的進程數便可。我這裏寫 2,那麼就會開啓 2 個子進程,總共 3 個進程。apache

error_log 用來定義全局錯誤日誌文件。日誌輸出級別有 debug、info、notice、warn、error、crit 可供選擇,其中,debug 輸出日誌最爲最詳細,而 crit 輸出日誌最少。後端

pid 用來指定進程id的存儲文件位置。centos

worker_rlimit_nofile 用於指定一個 nginx 進程能夠打開的最多文件描述符數目,這裏是 65535,須要使用命令 「ulimit -n 65535」 來設置。

2.2 events 模塊

events 模塊來用指定 nginx 的工做模式和工做模式及鏈接數上限,通常是這樣

events {
    use kqueue;                # mac 平臺,指定 Nginx 的工做模式
    worker_connections  1024;  # 定義 Nginx 每一個進程的最大鏈接數,即接收前端的最大請求數,默認是 1024
}

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_processes 和 worker_connections 決定,即 Max_clients = worker_processes * worker_connections,在做爲反向代理時,Max_clients 變爲:Max_clients = worker_processes * worker_connections/4。 
進程的最大鏈接數受 Linux 系統進程的最大打開文件數限制,在執行操做系統命令 「ulimit -n 65536」 後 worker_connections 的設置才能生效。

2.3 http 模塊

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

http{
    include       mime.types;                # 用來設定文件的 mime 類型,來告訴 nginx 來識別文件類型
    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"';
    # log_format 設置日誌的格式,和記錄哪些參數,這裏設置爲 main 類型的日誌
    access_log  /usr/local/var/log/nginx/access.log  main;
    # access_log 記錄每次的訪問日誌的文件地址,後面的 main 是日誌的格式樣式,對應於 log_format 的 main
    sendfile        on;    # 開啓高效文件傳輸模式
    tcp_nopush      on;    # 設置爲 on 用於防止網絡阻塞
    tcp_nodelay     on;    # 設置爲 on 用於防止網絡阻塞
    keepalive_timeout  10; # 設置客戶端鏈接保持活動的超時時間。在超過這個時間以後,服務器會關閉該鏈接

    #gzip  on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}

下面詳細介紹下這段代碼中每一個配置選項的含義。 

include 用來設定文件的 mime 類型,類型在配置文件目錄下的 mime.type 文件定義,來告訴 nginx 來識別文件類型。

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

log_format 用於設置日誌的格式(格式設置可參照 Nginx日誌格式設置),和記錄哪些參數,這裏設置爲 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_format 的 main。

sendfile 參數用於開啓高效文件傳輸模式。將 tcp_nopush 和 tcp_nodelay 兩個指令設置爲 on 用於防止網絡阻塞。

keepalive_timeout 設置客戶端鏈接保持活動的超時時間。在超過這個時間以後,服務器會關閉該鏈接。

2.4 server 模塊

sever 模塊是 http 的子模塊,它用來定一個虛擬主機。

咱們來看一個簡單的 server 是如何作的?

server {   # 標誌定義虛擬主機開始
        listen       8080;     # 指定虛擬主機的服務端口
        server_name  localhost 192.168.12.10 www.yangyi.com;  # 指定IP地址或者域名,多個域名之間用空格分開
        # 全局定義,若是都是這一個目錄,這樣定義最簡單。
        root   /Users/yangyi/www;  
        # root 表示在這整個 server 虛擬主機內,所有的 root web 根目錄。注意要和 locate {} 下面定義的區分開來
        index  index.php index.html index.htm;
        # index 全局定義訪問的默認首頁地址。注意要和 locate {} 下面定義的區分開來
        charset utf-8;   # 設置網頁的默認編碼格式
        access_log  usr/local/var/log/host.access.log  main; 
        # access_log 指定此虛擬主機的訪問日誌存放路徑,最後的 main 用於指定訪問日誌的輸出格式
        error_log  usr/local/var/log/host.error.log  error;
        ....
}

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

2.5 location 模塊

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

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

咱們先來看這個,設定默認首頁和虛擬機目錄。

location / {      # 表示匹配訪問根目錄
            root   /Users/yangyi/www;                # 指定訪問根目錄時,虛擬主機的 web 目錄
            index  index.php index.html index.htm;   # 設定咱們只輸入域名後訪問的默認首頁地址
        }

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

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

index 用於設定咱們只輸入域名後訪問的默認首頁地址,有個前後順序:index.php index.html index.htm,若是沒有開啓目錄瀏覽權限,又找不到這些默認首頁,就會報403錯誤。

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

下面這個例子是運用正則匹配來連接php。咱們以前搭建環境也是這樣作:

location ~ \.php$ {
            root           /Users/yangyi/www;
            fastcgi_pass   127.0.0.1:9000;       # 連接的是 php-fpm 的地址
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }

\.php$ 熟悉正則的咱們直到,這是匹配 .php 結尾的 URL,用來解析 php 文件。裏面的 root 也是同樣,用來表示虛擬主機的根目錄。 
fast_pass 連接的是 php-fpm 的地址。

2.6 upstream 模塊

upstream 模塊負責負載均衡模塊,經過一個簡單的調度算法來實現客戶端 IP 到後端服務器的負載均衡

upstream iyangyi.com{
    ip_hash;
    server 192.168.12.1:80;
    server 192.168.12.2:80 down;
    server 192.168.12.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.12.4:8080;
}

在上面的例子中,經過 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。
 

 

 

 

 

 

 

 

 

參考資料

1. nginx的配置、虛擬主機、負載均衡和反向代理(1)

2. nginx配置文件詳解中文版

3. Nginx配置性能優化

4. Linux下高併發socket最大鏈接數所受的各類限制

5. 設置nginx進程可打開最大的文件數

6. Nginx配置文件詳細說明

7. 輕量級HTTP服務器Nginx(配置與調試Nginx)

8. Nginx 反向代理、負載均衡、頁面緩存、URL重寫及讀寫分離詳解

9. 3、NGINX的配置與優化

相關文章
相關標籤/搜索