1. 程式人生 > >Nginx基本配置詳解

Nginx基本配置詳解

Nginx在專案使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態伺服器。

1、nginx支援的負載均衡排程演算法方式:

    1)weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器宕                                                   機,nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。 這種方式下,可以給                                                 不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重資料                                                 越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配                                                 置進行調整的。

    2)ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後                            端伺服器,這也在一定程度上解決了叢集部署環境下session共享的問題。

    3)fair:智慧調整排程演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器                    分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種排程演算法。但是                    需要注意的是nginx預設不支援fair演算法,如果要使用這種排程演算法,請安裝upstream_fair模組          4)url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態服務                               器的情況下提高快取效率。同樣要注意nginx預設不支援這種排程演算法,需要安裝nginx的hash軟體包         

2、nginx配置檔案:nginx.conf                      1)主要由6個模組組成:

        (1)main:用於進行nginx全域性資訊的配置                 user nobody nobody;                 # user用來指定nginx worker程序執行使用者以及使用者組,預設nobody賬號執行                              worker_processes 2;                 # worker_processes指定nginx要開啟的子程序數量,執行過程中監控每個程序消耗記憶體(一般幾M~幾十M不等)                   根據實際情況進行調整,通常數量是CPU核心數量的整數倍                              error_log logs/error.log                 error_log logs/error.log notice                 error_log logs/error.log info                 # error_log定義錯誤日誌檔案的位置及輸出級別【debug / info / notice / warn / error / crit】                              pid logs/nginx.pid                 # pid用來指定程序id的儲存檔案的位置                                  worker_rlimit_nofile 1024;                 # worker_rlimit_nofile用於指定一個程序可以開啟最多檔案數量的描述                  (2)events:用於nginx工作模式的配置                 event {                     worker_connections 1024;                     # worker_connections 指定最大可以同時接收的連線數量,這裡一定要注意,最大連線數量是和worker processes                           共同決定的。                                          multi_accept on;                     # multi_accept 配置指定nginx在收到一個新連線通知後儘可能多的接受更多的連線                                          use epoll;                     # use epoll 配置指定了執行緒輪詢的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac請使用Kqueue                 }                  (3)http:用於進行http協議資訊的一些配置                 http {                     ##                     # 基礎配置                     ##

                    sendfile on;                         tcp_nopush on;                         tcp_nodelay on;                         keepalive_timeout 65;                         types_hash_max_size 2048;                         # server_tokens off;    

                    # server_names_hash_bucket_size 64;                     # server_name_in_redirect off;

                    include /etc/nginx/mime.types;                     default_type application/octet-stream;

                    ##                     # SSL證書配置                     ##

                    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE                     ssl_prefer_server_ciphers on;

                    ##                     # 日誌配置                     ##

                    access_log /var/log/nginx/access.log;                     error_log /var/log/nginx/error.log;

                    ##                     # Gzip 壓縮配置                     ##

                    gzip on;                     gzip_disable "msie6";

                    # gzip_vary on;                     # gzip_proxied any;                     # gzip_comp_level 6;                     # gzip_buffers 16 8k;                     # gzip_http_version 1.1;                     # gzip_types text/plain text/css application/json application/javascript/text/xml application/xml application/xml+rss                                             text/javascript;

                    ##                     # 虛擬主機配置                     ##

                    include /etc/nginx/conf.d/*.conf;                     include /etc/nginx/sites-enabled/*;                                                               A.基礎配置                         sendfile on:配置on讓sendfile發揮作用,將檔案的回寫過程交給資料緩衝去去完成,而不是放在應用中完成,這                                               樣的話在效能提升有有好處                                                  tc_nopush on:讓nginx在一個數據包中傳送所有的標頭檔案,而不是一個一個單獨發                                                  tcp_nodelay on:讓nginx不要快取資料,而是一段一段傳送,如果資料的傳輸有實時性的要求的話可以配置它,                                                     傳送完一小段資料就立刻能得到返回值,但是不要濫用哦

                        keepalive_timeout 10:給客戶端分配連線超時時間,伺服器會在這個時間過後關閉連線。一般設定時間較短,可                                                                以讓nginx工作持續性更好                                                  client_header_timeout 10:設定請求頭的超時時間                                                  client_body_timeout 10:設定請求體的超時時間                                                  send_timeout 10:指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,伺服器就會關閉這個連結

                        limit_conn_zone $binary_remote_addr zone=addr:5m :設定用於儲存各種key的共享記憶體的引數,                                                  limit_conn addr 100: 給定的key設定最大連線數

                        server_tokens:雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對於網站安全性的提                                                    升有好處哦                                                  include /etc/nginx/mime.types:指定在當前檔案中包含另一個檔案的指令                                                  default_type application/octet-stream:指定預設處理的檔案型別可以是二進位制                                                  type_hash_max_size 2048:混淆資料,影響三列衝突率,值越大消耗記憶體越多,雜湊key衝突率會降低,檢索速                                                                         度更快; 值越小key,佔用記憶體較少,衝突率越高,檢索速度變慢                                                               B.SSL證書配置                         ssl_protocols:指令用於啟動特定的加密協議,nginx在1.1.13和1.0.12版本後預設是ssl_protocols SSLv3 TLSv1                                                  TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在                                                     用但有不少被攻擊的漏洞。                         ssl prefer server ciphers:設定協商加密演算法時,優先使用我們服務端的加密套件,                                                                                                                   而不是客戶端瀏覽器的加密套件                                              C.日誌配置                         access_log logs/access.log:設定儲存訪問記錄的日誌                         error_log logs/error.log:設定儲存記錄錯誤發生的日誌                              D.Gzip配置                         gzip :是告訴nginx採用gzip壓縮的形式傳送資料。這將會減少我們傳送的資料量。                         gzip_disable :為指定的客戶端禁用gzip功能。我們設定成IE6或者更低版本以使我們的方案能夠廣泛相容。                         gzip_static :告訴nginx在壓縮資源之前,先查詢是否有預先gzip處理過的資源。這要求你預先壓縮你的檔案(在                                                這個例子中被註釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些檔案了。                         gzip_proxied :允許或者禁止壓縮基於請求和響應的響應流。我們設定為any,意味著將會壓縮所有的請求。                         gzip_min_length :設定對資料啟用壓縮的最少位元組數。如果一個請求小於1000位元組,我們最好不要壓縮它,                                                        因為壓縮這些小的資料會降低處理此請求的所有程序的速度。                         gzip_comp_level :設定資料的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。                                                                我們設定為4,這是一個比較折中的設定。                         gzip_type :設定需要壓縮的資料格式。上面例子中已經有一些了,你也可以再新增更多的格式。                                                               E.檔案快取配置                         open_file_cache :開啟快取的同時也指定了快取最大數目,以及快取的時間。我們可以設定一個相對高的最大                                                           時間,這樣我們可以在它們不活動超過20秒後清除掉。                         open_file_cache_valid :在open_file_cache中指定檢測正確資訊的間隔時間。                         open_file_cache_min_uses :定義了open_file_cache中指令引數不活動時間期間裡最小的檔案數。                         open_file_cache_errors :指定了當搜尋一個檔案時是否快取錯誤資訊,也包括再次給配置中新增檔案。我們也                                                                      包括了伺服器模組,這些是在不同檔案中定義的。如果你的伺服器模組不在這些位                                                                          置,你就得修改這一行來指定正確的位置。                                                            (4)server:是http模組中的一個子模組,用於進行伺服器訪問資訊的配置                 server {                     listen        80;                     server_name localhost    192.168.1.100;                     root        /nginx/www;                     index        index.php index.html index.html;                     charset        utf-8;                     access_log    logs/access.log;                     error_log    logs/error.log;                     ......                 }                                  server:一個虛擬主機的配置,一個http中可以配置多個server

                server_name:用力啊指定ip地址或者域名,多個配置之間用空格分隔

                root:表示整個server虛擬主機內的根目錄,所有當前主機中web專案的根目錄

                index:使用者訪問web網站時的全域性首頁

                charset:用於設定www/路徑中配置的網頁的預設編碼格式

                access_log:用於指定該虛擬主機伺服器中的訪問記錄日誌存放路徑

                error_log:用於指定該虛擬主機伺服器中訪問錯誤日誌的存放路徑                                                        (5)location:是nginx配置中出現最多的一個配置,主要用於配置路由訪問資訊,                                  在路由訪問資訊配置中關聯到反向代理、負載均衡等等各項功能                                         A.基本配置                                          location / {                         root    /nginx/www;                         index   index.php index.html index.htm;                     }                         location /:表示匹配訪問根目錄                         root:用於指定訪問根目錄時,訪問虛擬主機的web目錄                         index:在不指定訪問具體資源時,預設展示的資原始檔列表                                                   B.反向代理配置方式,通過反向代理代理伺服器訪問模式,通過proxy_set配置讓客戶端訪問透明化                                          location / {                         proxy_pass http://localhost:8888;                         proxy_set_header X-real-ip $remote_addr;                         proxy_set_header Host $http_host;                     }                                                   C.uwsgi配置,wsgi模式下的伺服器配置訪問方式

                    location / {                         include uwsgi_params;                         uwsgi_pass localhost:8888                     }                                                    (6)upstream:主要負責負載均衡的配置,通過預設的輪詢排程方式來分發請求到後端伺服器                                  upstream name {                     ip_hash;                     server 192.168.1.100:8000;                     server 192.168.1.100:8001 down;                     server 192.168.1.100:8002 max_fails=3;                     server 192.168.1.100:8003 fail_timeout=20s;                     server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;                 }                              ip_hash:指定請求排程演算法,預設是weight權重輪詢排程,可以指定                 server host:port:分發伺服器的列表配置                 down:表示該主機暫停服務                 max_fails:表示失敗最大次數,超過失敗最大次數暫停服務                 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求