天天看點

nginx技術(2)nginx的配置詳解

nginx的配置

1,啟動nginx

1

2

3

4

5

6

7

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# /usr/sbin/nginx -c /etc/nginx/nginx.conf   啟動nginx</code>

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# ps -ef|grep nginx   檢視程序</code>

<code>root   </code><code>5479</code>   <code>1</code> <code>0</code> <code>04</code><code>:</code><code>15</code> <code>?    </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf</code>

<code>nginx   </code><code>5480</code> <code>5479</code> <code>0</code> <code>04</code><code>:</code><code>15</code> <code>?    </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>nginx: worker process  </code>

<code>root   </code><code>5534</code> <code>2377</code> <code>0</code> <code>04</code><code>:</code><code>22</code> <code>pts/</code><code>1</code>  <code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>grep nginx</code>

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# netstat -tulnp|grep nginx     檢視nginx監聽的端口</code>

<code>tcp    </code><code>0</code>   <code>0</code> <code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>80</code>         <code>0.0</code><code>.</code><code>0.0</code><code>:*          LISTEN   </code><code>5479</code><code>/nginx.conf</code>

2,停止nginx

<code>從容停止nginx</code>

<code>[root@centos6 ~]# kill -QUIT $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code>快速停止nginx</code>

<code>[root@centos6 ~]# kill -TERM $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code> </code><code>強制停止所有的nginx</code>

<code>[root@centos6 ~]# kill -</code><code>9</code> <code>nginx</code>

3,重新開機nginx

<code>[root@centos6 ~]# kill -HUP $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code> </code><code>檢測nginx的配置檔案的正确性</code>

<code>[root@centos6 ~]# /usr/sbin/nginx -t -c /etc/nginx/nginx.conf</code>

<code>nginx: the configuration file /etc/nginx/nginx.conf syntax </code><code>is</code> <code>ok</code>

<code>nginx: configuration file /etc/nginx/nginx.conf test </code><code>is</code> <code>successful</code>

4,nginx的配置

[root@centos6 rc0.d]# vim /usr/local/nginx/conf/nginx.conf

(1)全局模式

8

9

10

<code>#啟動程序數,通常設定成和cpu的數量相等</code>

<code>worker_processes </code><code>1</code><code>;</code>

<code>#全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]</code>

<code>error_log  logs/error.log info;</code>

<code>#程序檔案</code>

<code>pid logs/nginx.pid;</code>

<code>worker_rlimit_nofile65535;</code>

<code>這個指令是指當一個nginx 程序打開的最多檔案描述符數目,理論值應該是最多打開文</code>

<code>件數(ulimit -n)與nginx 程序數相除,但是nginx 配置設定請求并不是那麼均勻,是以最好與ulimit -n的值保持一緻。</code>

<code>現在在linux2.</code><code>6</code><code>核心下開啟檔案打開數為</code><code>65535</code><code>,worker_rlimit_nofile就相應應該填寫</code><code>65535</code><code>。</code>

(2)工作模式

<code>#工作模式與連接配接數上限</code>

<code>events</code>

<code>{</code>

<code>#參考事件模型,</code><code>use</code> <code>[ kqueue | rtsig | epoll | /dev/poll | select | poll ];</code>

<code>epoll模型是Linux </code><code>2.6</code><code>以上版本核心中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。</code>

<code>use</code> <code>epoll;</code>

<code>#單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)</code>

<code>worker_connections </code><code>65535</code><code>;</code>

<code>}</code>

程序的最大連接配接數受系統最大打開檔案數的限制,在執行作業系統指令 ulimit -n 65535之後

worker_connections才會生效

(3)設定http伺服器

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code>include</code> <code>mime.types; #檔案擴充名與檔案類型映射表</code>

<code>default_type application/octet-stream; #預設檔案類型</code>

<code>#charset utf-</code><code>8</code><code>; #預設編碼</code>

<code>server_names_hash_bucket_size </code><code>128</code><code>; #伺服器名字的hash表大小</code>

<code>client_header_buffer_size 32k; #上傳檔案大小限制</code>

<code>large_client_header_buffers </code><code>4</code> <code>64k; #設定請求緩</code>

<code>client_max_body_size 8m; #設定請求緩</code>

<code>sendfile on; #開啟高效檔案傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出檔案,對于普通應用設為 on,如果用來進行下載下傳等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖檔顯示不正常把這個改成off。</code>

<code>autoindex on; #開啟目錄清單通路,合适下載下傳伺服器,預設關閉。</code>

<code>tcp_nopush on; #防止網絡阻塞</code>

<code>tcp_nodelay on; #防止網絡阻塞</code>

<code>keepalive_timeout </code><code>120</code><code>; #長連接配接逾時時間,機關是秒</code>

<code>#FastCGI相關參數是為了改善網站的性能:減少資源占用,提高通路速度。下面參數看字面意思都能了解。</code>

<code>fastcgi_connect_timeout </code><code>300</code><code>;</code>

<code>fastcgi_send_timeout </code><code>300</code><code>;</code>

<code>fastcgi_read_timeout </code><code>300</code><code>;</code>

<code>fastcgi_buffer_size 64k;</code>

<code>fastcgi_buffers </code><code>4</code> <code>64k;</code>

<code>fastcgi_busy_buffers_size 128k;</code>

<code>fastcgi_temp_file_write_size 128k;</code>

<code>#gzip子產品設定</code>

<code>gzip on; #開啟gzip壓縮輸出</code>

<code>gzip_min_length 1k; #最小壓縮檔案大小</code>

<code>gzip_buffers </code><code>4</code> <code>16k; #壓縮緩沖區</code>

<code>gzip_http_version </code><code>1.0</code><code>; #壓縮版本(預設</code><code>1.1</code><code>,前端如果是squid2.</code><code>5</code><code>請使用</code><code>1.0</code><code>)</code>

<code>gzip_comp_level </code><code>2</code><code>; #壓縮等級</code>

<code>gzip_types text/plain application/x-javascript text/css application/xml;</code>

<code>#壓縮類型,預設就已經包含textml,是以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。</code>

<code>gzip_</code><code>var</code><code>y on;</code>

<code>#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連接配接數的時候需要使</code>

<code>設定允許用戶端請求的最大的單個檔案的位元組數</code>

<code>   </code><code>client_max_body_size 20m;</code>

<code>設定用戶端的請求頭的header buffer的大小。對于大多數請求,1kb的的大小就夠了。如果自定義了消息頭或者有更大的cookie,那麼就可以增加其大小了</code>

<code>    </code><code>client_header_buffer_size 32k;</code>

<code>用來指定用戶端請求中較大的消息頭緩存的最大數量和大小,這裡的意思是</code><code>4</code><code>為個數,32k為大小 </code>

<code> </code><code>large_client_header_buffers </code><code>4</code> <code>32k;</code>

<code>設定用戶端請求頭的讀取逾時時間   超過這個時間就會傳回</code><code>408</code>

<code>    </code><code>client_header_timeout </code><code>10</code><code>;</code>

<code>設定用戶端請求主體讀取逾時時間  超過這個時間就會傳回</code><code>408</code>

<code>    </code><code>client_body_timeout </code><code>10</code><code>;</code>

<code>指定響應用戶端的逾時時間。這個時間僅僅限于兩個連接配接活動之間的時間,如果超過這個時間,用戶端沒有任何活動,nginx就會關閉連接配接</code>

<code>    </code><code>send_timeout  </code><code>10</code><code>;</code>

(4)負載均衡配置

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

<code>nginx 的upstream目前支援</code><code>4</code><code>種方式的配置設定</code>

<code>1</code><code>、輪詢(預設)</code>

<code>每個請求按時間順序逐一配置設定到不同的後端伺服器 ,如果後端伺服器down掉,能自動剔除。</code>

<code>2</code><code>、weight</code>

<code>指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的情況。</code>

<code>例如:</code>

<code>    </code><code>upstream bakend {</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.14</code> <code>weight=</code><code>10</code><code>;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.15</code> <code>weight=</code><code>10</code><code>;</code>

<code>    </code><code>}</code>

<code>2</code><code>、ip_hash</code>

<code>每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session 的問題。</code>

<code>         </code><code>ip_hash;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.14</code><code>:</code><code>88</code><code>;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.15</code><code>:</code><code>80</code><code>;</code>

<code>3</code><code>、fair(第三方)</code>

<code>按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。</code>

<code>upstream backend {</code>

<code>    </code><code>server server1;</code>

<code>    </code><code>server server2;</code>

<code>    </code><code>fair;</code>

<code>4</code><code>、url_hash(第三方)</code>

<code>按通路url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,後端伺服器為緩存時比較有效。</code>

<code>例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法</code>

<code>    </code><code>server squid1:</code><code>3128</code><code>;</code>

<code>    </code><code>server squid2:</code><code>3128</code><code>;</code>

<code>    </code><code>hash   $request_uri;</code>

<code>    </code><code>hash_method crc32;</code>

<code>tips:</code>

<code>upstream bakend{#定義負載均衡 裝置的Ip及裝置狀态</code>

<code>ip_hash;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>9090</code> <code>down;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>8080</code> <code>weight=</code><code>2</code><code>;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>6060</code><code>;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>7070</code> <code>backup;</code>

<code>在需要使用負載均衡的server中增加</code>

<code>proxy_pass http:</code><code>//bakend/ ;</code>

<code>每個裝置的狀态設定為:</code>

<code>1</code><code>.down 表示單前的server暫時不參與負載</code>

<code>2</code><code>.weight 預設為</code><code>1</code><code>.weight越大,負載的權重就越大。</code>

<code>3</code><code>.max_fails :允許請求失敗的次數預設為</code><code>1</code><code>.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤</code>

<code>4</code><code>.fail_timeout:max_fails次失敗後,暫停的時間。</code>

<code>5</code><code>.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。是以這台機器壓力會最輕。</code>

<code>nginx支援同時設定多組的負載均衡,用來給不用的server來使用。</code>

<code>client_body_in_file_only 設定為On 可以講client post過來的資料記錄到檔案中用來做debug</code>

<code>client_body_temp_path 設定記錄檔案的目錄 可以設定最多</code><code>3</code><code>層目錄</code>

<code>location 對URL進行比對.可以進行重定向或者進行新的代理 負載均衡</code>

(5)虛拟主機的配置

<code>server {</code>

<code> </code><code>listen </code><code>80</code> <code>default_server;</code>

<code> </code><code>server_name </code><code>192.168</code><code>.</code><code>87.133</code><code>;</code>

<code> </code><code>root /usr/html/www1;</code>

<code> </code><code>index index.html;</code>

<code> </code><code>}</code>

<code>http:</code><code>//192.168.87.133 就可以通路/usr/html/www1</code>

<code>server</code>

<code>#監聽端口</code>

<code>listen </code><code>80</code><code>;</code>

<code>#域名可以有多個,用空格隔開</code>

<code>server_name www.ha97.com ha97.com;</code>

<code>index index.html index.htm index.php;</code>

<code>root /usr/html/ha97;</code>

#定義本虛拟主機的通路日志

access_log /var/log/loginx/ha97access.log access;

(6) URL配置

55

56

57

58

59

60

61

62

63

<code>文法規則: location [=|~|~*|^~] /uri/ { … }</code>

<code>= 開頭表示精确比對</code>

<code>^~ 開頭表示uri以某個正常字元串開頭,了解為比對url路徑即可。nginx不對url做編碼,是以請求為/</code><code>static</code><code>/</code><code>20</code><code>%/aa,可以被規則^~ /</code><code>static</code><code>//aa比對到(注意是空格)。</code>

<code>~ 開頭表示區分大小寫的正則比對</code>

<code>~* 開頭表示不區分大小寫的正則比對</code>

<code>!~和!~*分别為區分大小寫不比對及不區分大小寫不比對 的正則</code>

<code>/ 通用比對,任何請求都會比對到。</code>

<code>多個location配置的情況下比對順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):</code>

<code>首先比對 =,其次比對^~, 其次是按檔案中順序的正則比對,最後是交給 /通用比對。當有比對成功時候,停止比對,按目前比對規則處理請求。</code>

<code>例子,有如下比對規則:</code>

<code>location = / {</code>

<code>#規則A</code>

<code>location = /login {</code>

<code>#規則B</code>

<code>location ^~ /</code><code>static</code><code>/ {</code>

<code>#規則C</code>

<code>location ~ \.(gif|jpg|png|js|css)$ {</code>

<code>#規則D</code>

<code>location ~* \.png$ {</code>

<code>#規則E</code>

<code>location !~ \.xhtml$ {</code>

<code>#規則F</code>

<code>location !~* \.xhtml$ {</code>

<code>#規則G</code>

<code>location / {</code>

<code>#規則H</code>

<code>那麼産生的效果如下:</code>

<code>通路根目錄/, 比如http:</code><code>//localhost/将比對規則A</code>

<code>通路 http:</code><code>//localhost/login将比對規則B,http://localhost/register則比對規則H</code>

<code>通路 http:</code><code>//localhost/static/a.html将比對規則C</code>

<code>通路 http:</code><code>//localhost/a.gif, http://localhost/b.jpg将比對規則D和規則E,但是規則D順序優先,規則E不起作用,而 http://localhost/static/c.png則優先比對到規則C</code>

<code>通路 http:</code><code>//localhost/a.PNG則比對規則E,而不會比對規則D,因為規則E不區分大小寫。</code>

<code>通路 http:</code><code>//localhost/a.xhtml不會比對規則F和規則G,http://localhost/a.XHTML不會比對規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合比對規則但是不會比對到,是以想想看實際應用中哪裡會用到。</code>

<code>通路 http:</code><code>//localhost/category/id/1111則最終比對到規則H,因為以上規則都不比對,這個時候應該是nginx轉發請求給後端應用伺服器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理伺服器存在。</code>

<code>是以實際使用中,個人覺得至少有三個比對規則定義,如下:</code>

<code>#直接比對網站根,通過域名通路網站首頁比較頻繁,使用這個會加速處理,官網如是說。</code>

<code>#這裡是直接轉發給後端應用伺服器了,也可以是一個靜态首頁</code>

<code># 第一個必選規則</code>

<code>proxy_pass http:</code><code>//tomcat:8080/index</code>

<code># 第二個必選規則是處理靜态檔案請求,這是nginx作為http伺服器的強項</code>

<code># 有兩種配置模式,目錄比對或字尾比對,任選其一或搭配使用</code>

<code> </code><code>root /webroot/</code><code>static</code><code>/;</code>

<code>location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {</code>

<code> </code><code>root /webroot/res/;</code>

<code>#第三個規則就是通用規則,用來轉發動态請求到後端應用伺服器</code>

<code>#非靜态檔案請求就預設是動态請求,自己根據實際把握</code>

<code>#畢竟目前的一些架構的流行,帶.php,.jsp字尾的情況很少了</code>

<code>proxy_pass http:</code><code>//tomcat:8080/</code>

(7)自動索引及别名功能

<code> </code><code>root /usr/html;</code>

<code> </code><code>location /www1 {</code>

<code>  </code><code>autoindex on;  (如果有index.html檔案會優先通路)</code>

<code>  </code><code>}</code>

<code> </code><code>location /i/ {</code>

<code>  </code><code>alias /etc/; (當通路http:</code><code>//192.168.87.133/i/的時候其實是通路/etc)</code>

(8)控制站點通路

<code>listen </code><code>80</code> <code>default_server;</code>

<code>server_name </code><code>192.168</code><code>.</code><code>87.133</code><code>;</code>

<code>root /usr/html;</code>

<code>index index.html;</code>

<code>location /www1 {</code>

<code> </code><code>autoindex on;</code>

<code> </code><code>deny </code><code>192.168</code><code>.</code><code>87.1</code><code>;</code>

<code> </code><code>allow </code><code>192.168</code><code>.</code><code>87.133</code> <code>; 當拒絕和允許沖突的話,按照次序生效,最前面的生效</code>

<code>location /i/ {</code>

<code> </code><code>alias /etc/;</code>

(9)身份驗證

nginx的身份驗證和apache的一樣

<code>        </code><code>index  index.html index.htm;</code>

<code>        </code><code>auth_basic     </code><code>"nginx_auth"</code><code>;</code>

<code>        </code><code>auth_basic_user_file /usr/local/nginx/conf/htpassword;</code>

<code>        </code><code>}</code>

<code>[root@test4 nginx]# which htpasswd</code>

<code>/usr/bin/htpasswd</code>

<code>[root@test4 nginx]# htpasswd -c /usr/local/nginx/conf/htpassword webadmin</code>

<code>New password:</code>

<code>Re-type </code><code>new</code> <code>password:</code>

<code>Adding password </code><code>for</code> <code>user webadmin</code>

(10)狀态檢查

子產品stubstatus需要在編譯的時候手動指定才可以使用

<code>location /nginx_status {</code>

<code>  </code><code>stub_status on;</code>

<code>  </code><code>access_log off;</code>

<code>http:</code><code>//192.168.87.133/nginx_status</code>

(11)nginx的日志自動切割

nginx沒有apache類似的cronolog的功能支援,但是可以通過nginx信号控制能的腳本來實作日志的自動切割

<code>#/bin/bash</code>

<code>mkdir -p /home/nginx/logs</code>

<code>savepath_log=</code><code>'/home/nginx/logs'</code>

<code>nginx_log=</code><code>'/usr/local/nginx/logs'</code>

<code>mkdir -p $savepath_log/$(date +%Y)/(date +%m)</code>

<code>mv $nginx_log/access.log  $savepath_log/$(date +%Y)/(date +%m)/access.$(date +%F).log</code>

<code>mv $nginx_log/error.log  $savepath_log/$(date +%Y)/(date +%m)/error.$(date +%F).log</code>

<code>kill -USER1 `cat /usrlocal/nginx/logs/nginx.pid`</code>

USER1信号是使nginx自動切換日志

本文轉自陳仲陽0 51CTO部落格,原文連結:http://blog.51cto.com/wolfword/1205176

繼續閱讀