nginx學習(二):初識配置檔案

weixin_34026276發表於2015-09-19
nginx的配置檔案預設在nginx安裝目錄中的conf子目錄中,主配置檔案為nginx.conf,
root@mgmserver conf]# pwd
/usr/local/nginx/conf
一、配置檔案
[root@mgmserver conf]# vi nginx.conf 
       1
      2 #user  nobody;         #指定執行的使用者和組;
      3 worker_processes  1;               #工作程式數,一般與CPU核數相同或是2倍;
      4#指定全域性錯誤日誌的路徑,錯誤日誌可選項 有[debug|info|notice|warn|error|crit]
      5 #error_log  logs/error.log;
      6 #error_log  logs/error.log  notice;
      7 #error_log  logs/error.log  info;
      8
   
   9 #pid        logs/nginx.pid;    #指定pid檔案存放的路徑
     10
     11
     12 events {
              use epoll;使用的網路I/O模式,LINUX下使用epoll模型;freebsd使用kqueue模型;在events 這裡,預設的是不是沒有設定使用的模型;如果要使用epoll 模型要在安裝時帶上--with-poll_module=epoll;
     13     worker_connections  1024;   #允許的連線數;
     14 }
     15
     16#設定http伺服器,利用它的反向代理功能提供負載均衡支援;
     17 http {
       
     18     include       mime.types;      #設定mime型別;
     19     default_type  application/octet-stream;
     20#設定日誌格式
     21     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
     22     #                  '$status $body_bytes_sent "$http_referer" '
     23     #                  '"$http_user_agent" "$http_x_forwarded_for"';
     24
     25     #access_log  logs/access.log  main;
     26
    
 27     sendfile        on;   #預設開啟sendfile,sendfile能有效提高web傳輸檔案的效率,nginx會自動使用
     28     #tcp_nopush     on;      #允許或禁止使用socket的tcp_nopush(on freebsd)或tcp_cork(on linux)選項,這個選項僅僅使用sendfile的時候可以用。
           tcp_nodelay     on;
轉帖自:http://blog.phpwap.net/?p=14對TCP_NODELAY 和 TCP_CORK的解釋,
這兩個選項都對網路連線的行為具有重要的作用。許多UNIX系統都實現了 TCP_NODELAY選項,但是,TCP_CORK則是Linux系統所獨有的 而且相對較新;它首先在核心版本2.4上得以實現。此外,其他UNIX系統版本也有功能類似的選項,值得注意
的是,在某種由BSD派生的系統上的 TCP_NOPUSH選項其實就是TCP_CORK的一部分具體實現。
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle 化”,Nagle化在這裡的含義是採用Nagle演算法把較小的
包組裝為更大的幀。 John Nagle是Nagle演算法的發明人,後者就是用他的名字來命名的,他在1984年首次用這種方法來嘗試解決福特汽車公司的網路擁塞問題(欲瞭解詳情請參 看IETF RFC 896)。他解決的問題就是所謂的silly window syndrome ,中文稱“愚蠢視窗症候群”,具體含義是,因為普遍終端應用程式每產生一次擊鍵操作就會傳送一個包,而典型情況下一個包會擁有一個位元組的資料載荷以及40 個位元組長的包頭,於是產生4000%的過載,很輕易地就能令網路發生擁塞,。 Nagle化後來成了一種標準並且立即在因特網上得以實現。它現在已經成為預設配置了,但在我們看來,有些場合下把這一選項關掉也是合乎需要的。
現在讓我們假設某個應用程式發出了一個請求,希望傳送小塊資料。我們可以選擇立即傳送資料或者等待產生更多的資料然後再一次傳送兩種策略。如果我們馬上發 送資料,那麼互動性的以及客戶/伺服器型的應用程式將極大地受益。例如,當我們正在傳送一個較短的請求並且等候較大的響應時,相關過載與傳輸的資料總量相 比就會比較低,而且,如果請求立即發出那麼響應時間也會快一些。以上操作可以通過設定套接字的TCP_NODELAY選項來完成,這樣就禁用了Nagle 演算法。
另外一種情況則需要我們等到資料量達到最大時才通過網路一次傳送全部資料,這種資料傳輸方式有益於大量資料的通訊效能,典型的應用就是檔案伺服器。應用 Nagle演算法在這種情況下就會產生問題。但是,如果你正在傳送大量資料,你可以設定TCP_CORK選項禁用Nagle化,其方式正好同 TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就讓我們仔細分析下其工作原理。

假設應用程式使用sendfile()函式來轉移大量資料。應用協議通常要求傳送某些資訊來預先解釋資料,這些資訊其實就是報頭內容。典型情況下報頭很 小,而且套接字上設定了TCP_NODELAY。有報頭的包將被立即傳輸,在某些情況下(取決於內部的包計數器),因為這個包成功地被對方收到後需要請求 對方確認。這樣,大量資料的傳輸就會被推遲而且產生了不必要的網路流量交換。
但是,如果我們在套接字上設定了TCP_CORK(可以比喻為在管道上插入“塞子”)選項,具有報頭的包就會填補大量的資料,所有的資料都根據大小自動地 通過包傳輸出去。當資料傳輸完成時,最好取消TCP_CORK 選項設定給連線“拔去塞子”以便任一部分的幀都能傳送出去。這同“塞住”網路連線同等重要。
總而言之,如果你肯定能一起傳送多個資料集合(例如HTTP響應的頭和正文),那麼我們建議你設定TCP_CORK選項,這樣在這些資料之間不存在延遲。能極大地有益於WWW、FTP以及檔案伺服器的效能,同時也簡化了你的工作。示例程式碼如下:

intfd, on = 1;

/* 此處是建立套接字等操作,出於篇幅的考慮省略*/

setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* cork */
write (fd, …);
fprintf (fd, …);
sendfile (fd, …);
write (fd, …);
sendfile (fd, …);

on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 */

不幸的是,許多常用的程式並沒有考慮到以上問題。例如,Eric Allman編寫的sendmail就沒有對其套接字設定任何選項。
Apache HTTPD是因特網上最流行的Web伺服器,它的所有套接字就都設定了TCP_NODELAY選項,而且其效能也深受大多數使用者的滿意。這是為什麼呢?答 案就在於實現的差別之上。由BSD衍生的TCP/IP協議棧(值得注意的是FreeBSD)在這種狀況下的操作就不同。當在TCP_NODELAY 模式下提交大量小資料塊傳輸時,大量資訊將按照一次write()函式呼叫傳送一塊資料的方式傳送出去。然而,因為負責請求交付確認的記數器是面向位元組而 非面向包(在Linux上)的,所以引入延遲的概率就降低了很多。結果僅僅和全部資料的大小有關係。而 Linux 在第一包到達之後就要求確認,FreeBSD則在進行如此操作之前會等待好幾百個包。

在Linux系統上,TCP_NODELAY的效果同習慣於BSD TCP/IP協議棧的開發者所期望的效果有很大不同,而且在Linux上的Apache效能表現也會更差些。其他在Linux上頻繁採用TCP_NODELAY的應用程式也有同樣的問題。

   #設定請求緩衝;
       client_header_buffer_size      1k;
    large_client_header_size       50k
   #設定客戶端能夠上傳檔案的大小
    client_max_body_size            8m;
     29
     30     #keepalive_timeout  0;
     31     keepalive_timeout  65;
     32
     33     #gzip  on;    #是否開啟gzip壓縮模組
     34#設定虛擬主機
     35     server {
     36         listen       80;   #監聽埠
     37         server_name  localhost;#主機名稱
    38
     39         #charset koi8-r;#設定使用字符集
     40
     41         #access_log  logs/host.access.log  main;#訪問日誌檔案存放路徑
     42
     43         location / {
     44             root   html;#網頁存放的目錄,也可是絕對路徑
     45             index  index.html index.htm;#預設首頁順序
     46         }
     47
     48         error_page  404              /404.html;
     49
     50         # redirect server error pages to the static page /50x.html
     51         #
     52         error_page   500 502 503 504  /50x.html;
     53         location = /50x.html {
     54             root   html;
     55         }
     56
     57         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
     58         #
     59         #location ~ \.php$ {
     60         #    proxy_pass   http://127.0.0.1;
     61         #}
     62
     63         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
     64         #
     65         #location ~ \.php$ {
     66         #    root           html;
     67         #    fastcgi_pass   127.0.0.1:9000;
     68         #    fastcgi_index  index.php;
     69         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
     70         #    include        fastcgi_params;
     71         #}
     72
     73         # deny access to .htaccess files, if Apache's document root
     74         # concurs with nginx's one
    75         #
     76         #location ~ /\.ht {
     77         #    deny  all;
     78         #}
     79     }
     80
     81
     82     # another virtual host using mix of IP-, name-, and port-based configuration
     83     #
     84     #server {
     85     #    listen       8000;
     86     #    listen       somename:8080;
     87     #    server_name  somename  alias  another.alias;
     88
     89     #    location / {
     90     #        root   html;
     91     #        index  index.html index.htm;
     92     #    }
     93     #}
     94
     95
     96     # HTTPS server
     97     #
     98     #server {
     99     #    listen       443;
    100     #    server_name  localhost;
    101
    102     #    ssl                  on;
    103     #    ssl_certificate      cert.pem;
    104     #    ssl_certificate_key  cert.key;
    105
    106     #    ssl_session_timeout  5m;
    107
    108     #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    109     #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    110     #    ssl_prefer_server_ciphers   on;
     111
    112     #    location / {
    113     #        root   html;
    114     #        index  index.html index.htm;
    115     #    }
    116     #}
    117
    118 }
  =========================================================
二、配置檔案格式:上面的是nginx.conf的配置示例,有些是新增上去的,主要構成可以簡化為:
 
......
events
{
......
}
http{
......
server{
 
 
......
       }
server{
.......      
       }
.......
}
 
實際上這麼分開我們就能一目瞭然的看到nginx.conf配置檔案的結構,不是很難;
 
三、nginx的代理檔案註釋
 
proxy_redirect                                  off;
#proxy_set_header 指令用於在反向代理的後端web伺服器發起請求時新增指定的header頭資訊;
proxy_set_header           Host   $host;
proxy_set_header           X-Real-IP $remote_addr;

 

#允許客戶端請求的最大單個檔案位元組數;
client-max_body_size      10m;

#緩衝區代理緩衝使用者端請求的最大位元組數,可以理解為先儲存到本地再傳給使用者;
client_body_buffer_size   128;
#跟後端伺服器連線超時時間,發起握手等候響應超時時間;
poxy_connect_timeout      5;

#連線成功後,等候後端伺服器響應時間,其實已經進入後端的排隊之中等候處理;
proxy_read_timeout        60;
#後端伺服器資料回傳時間,就是規定時間內後端伺服器必須傳完所有的資料;
proxy_send_timeout         5;

#代理請求快取區,這個快取區見會保護使用者的頭資訊以提供nginx進行校對規則,一般只要能儲存下頭
#資訊即可
proxy_buffer_size        16k;
#同上 ,告訴nginx儲存單個用的幾個buffer最大用多大空間
proxy_buffers         4   64k;

#如果系統很忙的時候可以申請更大的proxy_buffers官方推薦×2
proxy_busy_buffers_size 128k;
#proxy快取臨時檔案的大小;
proxy_temp_file_write_size 128k;

若轉載請註明出處!若有疑問,請回復交流!

相關文章