Nginx配置文件及模塊解析

1、Nginx是什麼?

Nginx是一個基於c語言開發的高性能http服務器及反向代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發,官方測試nginx可以支支撐5萬併發連接,而且cpu、內存等資源消耗卻很是低,運行很是穩定。javascript

2、爲何要用Nginx?

理由一:

  • 傳統的小型網站併發量小,用戶使用的少,因此在低併發的狀況下,用戶能夠直接訪問tomcat服務器,而後tomcat服務器返回消息給用戶。固然,爲了解決併發,可使用負載均衡,也就是多增長几個tomcat服務器,當用戶訪問的時候,請求能夠提交到空閒的tomcat服務器上。
  • 可是這種狀況下可能會出現一種問題:假設把圖片上傳到了tomcat1上了,當要訪問這個圖片的時候,tomcat1正好在工做,因此訪問的請求就交給其餘的tomcat操做,而tomcat之間的數據沒有進行同步,因此就發生了咱們要請求的圖片找不到。
  •  爲了解決這種狀況,咱們專門創建一個圖片服務器,用來存儲圖片。這樣當都把圖片上傳的時候,不論是哪一個服務器接收到圖片,都把圖片上傳到圖片服務器。而圖片服務器上須要安裝一個http服務,可使用tomcat、apache、nginx。

理由二:

  • nginx經常使用作靜態內容服務和代理服務器,直面外來請求轉發給後面的應用服務(tomcat,django什麼的),tomcat更多用來作作一個應用容器,讓java web app跑在裏面的東西。

理由三:

  • nginx做反向代理:
  • 反向代理就是後端服務不直接對外暴露,請求首先發送到nginx,而後nginx將請求轉發到後端服務器,好比tomcat等.若是後端服務只有一臺服務器,nginx在這裏只有一個做用就是起到了代理後端服務接收請求的做用.稱之爲反向代理.

理由四:

  • nginx做負載均衡:
  • 在現實的應用場景中,一臺後端服務器出現單點故障的機率很大或者單臺機器的吞吐量有限,沒法承擔過多請求.這時候就須要在nginx後端配置多臺服務器,利用nginx內置的規則講請求轉發到後端不一樣的機器上.這時候就起到了負載均衡的做用.

3、Nginx配置文件

3.1:主要分紅四部分:

  • main(全局設置),main部分設置的指令將影響其它全部部分的設置;
  • server(主機設置),server部分的指令主要用於指定虛擬主機域名、IP和端口;
  • upstream(上游服務器設置,主要爲反向代理、負載均衡相關配置),upstream的指令用於設置一系列的後端服務器,設置反向代理及後端服務器的負載均衡;
  • location(URL匹配特定位置後的設置),location部分用於匹配網頁位置(好比,根目錄「/」,「/images」,等等);

3.2:它們之間的關係:

  • server繼承main,location繼承server;upstream既不會繼承指令也不會被繼承。它有本身的特殊指令,不須要在其餘地方的應用。

3.3:舉例說明:

下面的nginx.conf簡單的實現nginx在前端作反向代理服務器的例子,處理js、png等靜態文件,jsp等動態請求轉發到其它服務器tomcat:css

  1 user www www;
  2 worker_processes 2;
  3   
  4 error_log logs/error.log;
  5 #error_log logs/error.log notice;
  6 #error_log logs/error.log info;
  7   
  8 pid logs/nginx.pid;
  9   
 10   
 11 events {
 12 use epoll;
 13 worker_connections 2048;
 14 }
 15   
 16   
 17 http {
 18 include mime.types;
 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;
 28 # tcp_nopush on;
 29   
 30 keepalive_timeout 65;
 31   
 32 # gzip壓縮功能設置
 33 gzip on;
 34 gzip_min_length 1k;
 35 gzip_buffers 4 16k;
 36 gzip_http_version 1.0;
 37 gzip_comp_level 6;
 38 gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
 39 gzip_vary on;
 40   
 41 # http_proxy 設置
 42 client_max_body_size 10m;
 43 client_body_buffer_size 128k;
 44 proxy_connect_timeout 75;
 45 proxy_send_timeout 75;
 46 proxy_read_timeout 75;
 47 proxy_buffer_size 4k;
 48 proxy_buffers 4 32k;
 49 proxy_busy_buffers_size 64k;
 50 proxy_temp_file_write_size 64k;
 51 proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
 52   
 53 # 設定負載均衡後臺服務器列表
 54 upstream backend {
 55 #ip_hash;
 56 server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
 57 server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
 58 }
 59   
 60 # 很重要的虛擬主機配置
 61 server {
 62 listen 80;
 63 server_name itoatest.example.com;
 64 root /apps/oaapp;
 65   
 66 charset utf-8;
 67 access_log logs/host.access.log main;
 68   
 69 #對 / 全部作負載均衡+反向代理  70 location / {
 71 root /apps/oaapp;
 72 index index.jsp index.html index.htm;
 73   
 74 proxy_pass http://backend;
 75 proxy_redirect off;
 76 # 後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP  77 proxy_set_header Host $host;
 78 proxy_set_header X-Real-IP $remote_addr;
 79 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 80 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
 81   
 82 }
 83   
 84 #靜態文件,nginx本身處理,不去backend請求tomcat
 85 location ~* /download/ {
 86 root /apps/oa/fs;
 87   
 88 }
 89 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
 90 {
 91 root /apps/oaapp;
 92 expires 7d;
 93 }
 94 location /nginx_status {
 95 stub_status on;
 96 access_log off;
 97 allow 192.168.10.0/24;
 98 deny all;
 99 }
100   
101 location ~ ^/(WEB-INF)/ {
102 deny all;
103 }
104 #error_page 404 /404.html;
105   
106 # redirect server error pages to the static page /50x.html
107 #
108 error_page 500 502 503 504 /50x.html;
109 location = /50x.html {
110 root html;
111 }
112 }
113   
114 ## 其它虛擬主機,server 指令開始
115 }

4、經常使用指令說明

4.1:main全局配置

nginx在運行時與具體業務功能(好比http服務或者email服務代理)無關的一些參數,好比工做進程數,運行的身份等。html

  • woker_processes 2

在配置文件的頂級main部分,worker角色的工做進程的個數,master進程是接收並分配請求給worker處理。這個數值簡單一點能夠設置爲cpu的核數grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,若是開啓了ssl和gzip更應該設置成與邏輯CPU數量同樣甚至爲2倍,能夠減小I/O操做。若是nginx服務器還有其它服務,能夠考慮適當減小。前端

  • worker_cpu_affinity

也是寫在main部分。在高併發狀況下,經過設置cpu粘性來下降因爲多CPU核切換形成的寄存器等現場重建帶來的性能損耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。java

  • worker_connections 2048

寫在events部分。每個worker進程能併發處理(發起)的最大鏈接數(包含與客戶端或後端被代理服務器間等全部鏈接數)。nginx做爲反向代理服務器,計算公式 最大鏈接數 = worker_processes * worker_connections/4,因此這裏客戶端最大鏈接數是1024,這個能夠增到到8192都不要緊,看狀況而定,但不能超事後面的worker_rlimit_nofile。當nginx做爲http服務器時,計算公式裏面是除以2。nginx

  • worker_rlimit_nofile 10240

寫在main部分。默認是沒有設置,能夠限制爲操做系統最大的限制65535。web

  • use epoll

寫在events部分。在Linux操做系統下,nginx默認使用epoll事件模型,得益於此,nginx在Linux操做系統下效率至關高。同時Nginx在OpenBSD或FreeBSD操做系統上採用相似於epoll的高效事件模型kqueue。在操做系統不支持這些高效模型時才使用select。算法

4.2:http服務器

與提供http服務相關的一些配置參數。例如:是否使用keepalive啊,是否使用gzip進行壓縮等。apache

  • sendfile on

開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,減小用戶空間到內核空間的上下文切換。對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載;django

  • keepalive_timeout 65 :

長鏈接超時時間,單位是秒,這個參數很敏感,涉及瀏覽器的種類、後端服務器的超時設置、操做系統的設置,能夠另外起一片文章了。長鏈接請求大量小文件的時候,能夠減小重建鏈接的開銷,但假若有大文件上傳,65s內沒上傳完成會致使失敗。若是設置時間過長,用戶又多,長時間保持鏈接會佔用大量資源;

  • send_timeout :

用於指定響應客戶端的超時時間。這個超時僅限於兩個鏈接活動之間的時間,若是超過這個時間,客戶端沒有任何活動,Nginx將會關閉鏈接;

  • client_max_body_size 10m

容許客戶端請求的最大單文件字節數。若是有上傳較大文件,請設置它的限制值;

  • client_body_buffer_size 128k

緩衝區代理緩衝用戶端請求的最大字節數;

4.3:模塊http_proxy:

這個模塊實現的是nginx做爲反向代理服務器的功能,包括緩存功能

  • proxy_connect_timeout 60

nginx跟後端服務器鏈接超時時間(代理鏈接超時)

  • proxy_read_timeout 60

鏈接成功後,與後端服務器兩個成功的響應操做之間超時時間(代理接收超時)

  • proxy_buffer_size 4k

設置代理服務器(nginx)從後端realserver讀取並保存用戶信息的緩衝區大小,默認與proxy_buffers大小相同,其實能夠將這個指令值設的小一點

  • proxy_buffers 4 32k

proxy_buffers緩衝區,nginx針對單個鏈接緩存來自後端realserver的響應,網頁平均在32k如下的話,這樣設置

  • proxy_busy_buffers_size 64k

高負荷下緩衝大小(proxy_buffers*2)

  • proxy_max_temp_file_size

當 proxy_buffers 放不下後端服務器的響應內容時,會將一部分保存到硬盤的臨時文件中,這個值用來設置最大臨時文件大小,默認1024M,它與 proxy_cache 沒有關係。大於這個值,將從upstream服務器傳回。設置爲0禁用。

  • proxy_temp_file_write_size 64k

當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小。proxy_temp_path(能夠在編譯的時候)指定寫到哪那個目錄。

  • proxy_pass,proxy_redirect

見 location 部分。

4.4:模塊http_gzip:

  • gzip on :

開啓gzip壓縮輸出,減小網絡傳輸。

  • gzip_min_length 1k :

設置容許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是20。建議設置成大於1k的字節數,小於1k可能會越壓越大。

  • gzip_buffers 4 16k :

設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。4 16k表明以16k爲單位,安裝原始數據大小以16k爲單位的4倍申請內存。

  • gzip_http_version 1.0 :

用於識別 http 協議的版本,早期的瀏覽器不支持 Gzip 壓縮,用戶就會看到亂碼,因此爲了支持前期版本加上了這個選項,若是你用了 Nginx 的反向代理並指望也啓用 Gzip 壓縮的話,因爲末端通訊是 http/1.0,故請設置爲 1.0。

  • gzip_comp_level 6 :

gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)

  • gzip_types :

匹配mime類型進行壓縮,不管是否指定,」text/html」類型老是會被壓縮的。

  • gzip_proxied any :

Nginx做爲反向代理的時候啓用,決定開啓或者關閉後端服務器返回的結果是否壓縮,匹配的前提是後端服務器必需要返回包含」Via」的 header頭。

  • gzip_vary on :

和http頭有關係,會在響應頭加個 Vary: Accept-Encoding ,可讓前端的緩存服務器緩存通過gzip壓縮的頁面,例如,用Squid緩存通過Nginx壓縮的數據。。

4.5:server虛擬主機

http服務上支持若干虛擬主機。每一個虛擬主機一個對應的server配置項,配置項裏面包含該虛擬主機相關的配置。在提供mail服務的代理時,也能夠創建若干server。每一個server經過監聽地址或端口來區分。

  • listen
    監聽端口,默認80,小於1024的要以root啓動。能夠爲listen *:80listen 127.0.0.1:80等形式。
  • server_name
    服務器名,如localhostwww.example.com,能夠經過正則匹配。

4.6:模塊http_stream

這個模塊經過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡,upstream後接負載均衡器的名字,後端realserver以 host:port options; 方式組織在 {} 中。若是後端被代理的只有一臺,也能夠直接寫在 proxy_pass 。

4.7: location

http服務中,某些特定的URL對應的一系列配置項。

  • root /var/www/html

定義服務器的默認網站根目錄位置。若是locationURL匹配的是子目錄或文件,root沒什麼做用,通常放在server指令裏面或/下。

  • index index.jsp index.html index.htm

定義路徑下默認訪問的文件名,通常跟着root

  • proxy_pass http:/backend

請求轉向backend定義的服務器列表,即反向代理,對應upstream負載均衡器。也能夠proxy_pass http://ip:port

4.8:訪問控制 allow/deny

Nginx 的訪問控制模塊默認就會安裝,並且寫法也很是簡單,能夠分別有多個allow,deny,容許或禁止某個ip或ip段訪問,依次知足任何一個規則就中止往下匹配。如:

location /nginx-status {
stub_status on;
access_log off;
# auth_basic "NginxStatus";
# auth_basic_user_file /usr/local/nginx-1.6/htpasswd;
  
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
}

咱們也經常使用 httpd-devel 工具的 htpasswd 來爲訪問的路徑設置登陸密碼:

# htpasswd -c htpasswd admin
New passwd:
Re-type new password:
Adding password for user admin
  
# htpasswd htpasswd admin //修改admin密碼
# htpasswd htpasswd sean //多添加一個認證用戶

這樣就生成了默認使用CRYPT加密的密碼文件。打開上面nginx-status的兩行註釋,重啓nginx生效。

4.9:列出目錄 autoindex

Nginx默認是不容許列出整個目錄的。如需此功能,打開nginx.conf文件,在location,server 或 http段中加入autoindex on;,另外兩個參數最好也加上去:

  • autoindex_exact_size off; 

默認爲on,顯示出文件的確切大小,單位是bytes。改成off後,顯示出文件的大概大小,單位是kB或者MB或者GB

  • autoindex_localtime on;

默認爲off,顯示的文件時間爲GMT時間。改成on後,顯示的文件時間爲文件的服務器時間

 

location /images {
root /var/www/nginx-default/images;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}

 

 

5、參考資料:http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity
相關文章
相關標籤/搜索