3、NGINX的配置與優化

3.1 nginx的完整配置示例

nginx的配置文件默認在nginx程序安裝目錄的conf二級目錄下,主配置文件爲nginx.conf,假設您的nginx安裝在/usr/local/webserver/nginx/目錄下,那麼默認的主配置文件則爲/usr/local/webserver/nginx/nginx.conf,如下是我當時爲某保險公司搭建的nginx的配置示例(部分信息作了漂白)。javascript

user  apache apache;
worker_processes 4;

error_log  /usr/local/webserver/nginx/logs/nginx_error.log  crit;

pid        /usr/local/webserver/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;

events
{
  use epoll;
  worker_connections 65535;
}

http
{
  include       mime.types;
  default_type  application/octet-stream;
      
  server_names_hash_bucket_size 128;
  client_header_buffer_size 128k;
  large_client_header_buffers 4 32k;
  client_max_body_size 300m;
      
  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 1800;

  tcp_nodelay on;
  
  fastcgi_connect_timeout 1800;
  fastcgi_send_timeout 1800;
  fastcgi_read_timeout 1800;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;

  client_body_buffer_size  512k;
  proxy_connect_timeout    5;
  proxy_read_timeout       1800;
  proxy_send_timeout       1800;
  proxy_buffer_size        128k;
  proxy_buffers            4 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 512k;
  

  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  
  #add_header Content-Encoding gzip;

  #注:proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
  proxy_temp_path   logs/proxy_temp_dir;
  #設置Web緩存區名稱爲cache_one,內存緩存空間大小爲200MB,1天沒有被訪問的內容自動清除,硬盤緩存空間大小爲30GB。
  proxy_cache_path  logs/proxy_cache_dir  levels=1:2   keys_zone=cache_one:10m inactive=1d max_size=10g;
  

    upstream xxx1_domain_cluster {  
    ip_hash;
    server 9.0.1.11:9000;
    server 9.0.1.12:9000;  
	  server 9.0.1.13:9000;
	  server 9.0.1.14:9000; 
      }

    upstream xxx2_domain_cluster {
    ip_hash;
    server 9.0.1.11:9004;
    server 9.0.1.12:9004;
	  server 9.0.1.13:9004;
	  server 9.0.1.14:9004;
      }
      
    upstream xxx3_domain_cluster {
    ip_hash;
    server 9.0.1.11:9001;
    server 9.0.1.12:9001;
    server 9.0.1.13:9001;
    server 9.0.1.14:9001;
      }
      
     upstream xxx4_domain_cluster{
     ip_hash;
     server 9.0.1.11:9002;
     server 9.0.1.12:9002;
     server 9.0.1.13:9002;
     server 9.0.1.14:9002;
     }
     
     upstream xxx5_domain_cluster{
     ip_hash;
     server 9.0.1.11:9003;
     server 9.0.1.12:9003;
     server 9.0.1.13:9003;
     server 9.0.1.14:9003;
     }
     upstream xxx6_domain_cluster{
     ip_hash;
     server 9.0.1.11:9005;
     server 9.0.1.12:9005;
     server 9.0.1.13:9005;
     server 9.0.1.14:9005;
     }
     upstream xxx7_domain_cluster{
     ip_hash;
     server 9.0.1.11:9006;
     server 9.0.1.12:9006;
     server 9.0.1.13:9006;
     server 9.0.1.14:9006;
     }
     upstream xxx8_domain_cluster{
     ip_hash;
     server 9.0.1.11:9099;
     server 9.0.1.12:9099;
     server 9.0.1.13:9099;
     server 9.0.1.14:9099;
     }
     upstream xxx9_domain_cluster{
     ip_hash;
     server 9.0.1.11:9007;
     server 9.0.1.12:9007;
     server 9.0.1.13:9007;
     server 9.0.1.14:9007;
     }
     upstream xxx10_domain_cluster{
     ip_hash;
     server 9.0.1.11:9008;
     server 9.0.1.12:9008;
     server 9.0.1.13:9008;
     server 9.0.1.14:9008;
     }    
     upstream xxx11_domain_cluster{
     ip_hash;
     server 9.0.1.11:8008; 
     server 9.0.1.12:8008;
     server 9.0.1.13:8008;
     server 9.0.1.14:8008;
     }

  server
  {
    listen       80;
    server_name  9.0.1.11;
    index index.html Login.jsp index.jsp QueryCodeInputOverview.jsp;
    default_type 'text/html';
    charset UTF-8;

    root  /usr/local/webserver/nginx/html;
     
   location /xxx/ {
       charset gb2312;
       index broadcast.html;
       proxy_pass  http://guoyuan_domain_cluster;
       proxy_set_header Host $host;
       
     location ~(\.jsp)|(\.do)~{     
       charset gb2312;
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://xxx1_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   }
   
   
   location /undwrt/ {
   
       proxy_pass  http://undwrt_domain_cluster;
       proxy_set_header Host $host;
       
     location ~(\.jsp)|(\.do)~{
     
      if ($request_uri ~* ^9\.0\.1\.5(.*)$){
       rewrite ^(.*)1.5(.*)/undwrt(.*)$ http://9.0.1.13/undwrt permanent;
       proxy_pass http://$http_host$request_uri;
 
       }

       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://undwrt_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
       
   }

   access_log logs/access_undwrt_domain_cluster.log;
   }
    
   location /prpall/ {
       charset utf-8;
       proxy_pass  http://prpall_domain_cluster;
       proxy_set_header Host $host;
       
     location ~(\.jsp)|(\.do)~{     
       charset utf-8;
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://prpall_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }

   access_log logs/access_prpall_domain_cluster.log;
   }
   
   location /account/ {
       proxy_pass  http://account_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://account_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_account_domain_cluster.log;
       }
   location /payment/ {
       charset utf-8;
       proxy_pass  http://payment_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       charset utf-8;
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://payment_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_payment_domain_cluster.log;
       }
   location /visa/ {
   
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_visa_domain_cluster.log;
       }
   location /reins/ {
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_reins_domain_cluster.log;
       }
       
       
     location /newclaim/ {
     
       if ($host ~* ^www\.gyic\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.gyic.com:9003/newclaim last;
       }
     
       charset GB2312;
       proxy_pass  http://newclaim_domain_cluster;
       proxy_set_header Host $host;
       
       gzip on;
       gzip_min_length  1k;
       gzip_buffers     4 128k;
       gzip_http_version 1.1;
       gzip_comp_level 2;
       gzip_types       text/plain application/x-javascript text/css application/xml;
       gzip_vary on;
  
       add_header Content-Encoding gzip;
           
     location ~(\.jsp)|(\.do)|(\.htm)|(\.html)~{
       charset GBK;
       
       #if ($host ~* ^9\.0\.1\.(.*?)$)
       #{
       #rewrite ^/(.*)$ http://9.0.1.13:9003/newclaim last;
       #}
       
       if ($host ~* ^www\.gyic\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.gyic.com:9003/newclaim last;
       }
       
       gzip on;
       gzip_min_length  1k;
       gzip_buffers     4 128k;
       gzip_http_version 1.1;
       gzip_comp_level 2;
       gzip_types       text/plain application/x-javascript text/css application/xml;
       gzip_vary on;
  
       add_header Content-Encoding gzip;
       
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://newclaim_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                  
     
    }
   
        access_log logs/access_newclaim_domain_cluster.log;
     }
     
     location /claim/ {
     
       if ($host ~* ^www\.gyic\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.gyic.com:9002/claim last;
       }
     
       charset GB2312;
       proxy_pass  http://claim_domain_cluster;
       proxy_set_header Host $host;       
           
     location ~(\.jsp)|(\.do)|(\.htm)|(\.html)~{
       charset GBK;
       
       if ($host ~* ^www\.gyic\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.gyic.com:9002/claim last;
       }      
       
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://claim_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                  
     
    }
   
        access_log logs/access_claim_domain_cluster.log;
     }
       
       
       
   location /reserve/ {
       charset  utf-8;
       if ($host ~* ^www\.xxxx\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.xxxx.com:9007/reserve last;
       }
       proxy_pass  http://reserve_domain_cluster;
       proxy_set_header Host $host;
      location ~(\.jsp)|(\.do)~{
       charset  utf-8;
       if ($host ~* ^www\.gyic\.(.*?)$)
       {
       rewrite ^/(.*)$ http://www.xxxx.com:9007/reserve last;
       }
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://reserve_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_reserve_domain_cluster.log;
       }
       
       

       
   location /platform/ {
       charset  utf-8;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       charset  utf-8;
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_patform_domain_cluster.log;
       }
   location /newreport/ {
       charset UTF-8;
       proxy_pass  http://newreport_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)|(\.html)~{
       default_type 'text/html';
       charset GB2312;
       index newreporthelp.html welcome.html;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://newreport_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
   access_log logs/access_newreport_domain_cluster.log;
       }
   location /anareport/ {
       charset GB2312;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       charset GB2312;      
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_anareport_domain_cluster.log;
       
       }
   location /FXQ/ {
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_FXQ_domain_cluster.log;
       }
   location /srs/ {
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_srs_domain_cluster.log;
       }
   location /sales/ {
       
       #if ($host ~* ^www\.gyic\.(.*?)$)
       #{
       #rewrite ^/(.*)$ http://www.xxxx.com/sales/common/Login.jsp break;
       #}
   
       #index Login.jsp
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
     
       #if ($host ~* ^www\.gyic\.(.*?)$)
       #{
       #rewrite ^/(.*)$ http://www.xxxx.com/sales/common/Login.jsp break;
       #}
     
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   
   }
     access_log logs/access_sales_domain_cluster.log;
       }
   location /webapp/ {
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_webapp_domain_cluster.log;
       }
       
     location /WebRoot/ {
       proxy_pass  http://webroot_domain_cluster;
       proxy_set_header Host $host;
     location ~(\.jsp)|(\.do)~{
       #index index.jsp QueryCodeInputOverview.jsp QueryCodeInputOverviewResult.jsp;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://webroot_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
   }
     access_log logs/access_webapp_domain_cluster.log;
       }
         
      
   location /nginxstatus {  
       stub_status on;  
       access_log off;  
       allow all;  
   }   
   
    location /
    {    

         #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_cache cache_one;
         #對不一樣的HTTP狀態碼設置不一樣的緩存時間
         proxy_cache_valid  200 304 12h;
         #以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希,存儲緩存內容到二級緩存目錄內
         proxy_cache_key $host$uri$is_args$args;
         proxy_set_header Host  $host;
         proxy_set_header X-Forwarded-For  $remote_addr;
         #proxy_pass http://backend_server;
	 proxy_pass http://xxx1_domain_cluster;
	 #proxy_pass http://www.xxx.com;
	 access_log logs/access_backend_server_log;
         expires      1d;
    }    
    
    #用於清除緩存,假設一個URL爲http://192.168.8.42/test.txt,經過訪問http://192.168.8.42/purge/test.txt就能夠清除該URL的緩存。
    location ~ /purge(/.*)
    {
     #設置只容許指定的IP或IP段才能夠清除URL緩存。
     allow            127.0.0.1;
     allow            9.0.0.0/16;
#     deny            all;
     proxy_cache_purge    cache_one   $host$1$is_args$args;
    }    

    #擴展名以.php、.jsp、.cgi結尾的動態應用程序不緩存。
    location ~ .*\.(php|cgi)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Forwarded-For  $remote_addr;
         #proxy_pass http://backend_server;
    }

				location /get/
				{
				set $hostx "";
				set $addrs "";
				if ( $uri ~ "^/get/http./+([^/]+)/(.+)$") {
				  set $hostx $1;
				  set $addrs $2;
				}
				resolver 127.0.0.1;
				proxy_pass http://$hostx/$addrs;
				proxy_set_header referer "http://$hostx";
				}

    access_log  logs/access.log;
  }
  
  server
  {
  listen 9.0.1.5:9004;
  
 location /undwrt/ {
       #if ($host ~* ^9\.0\.1\.5\.(.*?)$){
       #rewrite ^/(.*)$ http://9.0.1.13:9004/undwrt redirect; 
       #}
       proxy_pass  http://undwrt_domain_cluster;
       proxy_set_header Host $host;

     location ~(\.jsp)|(\.do)~{
       #if ($host ~* ^9\.0\.1\.5\.(.*?)$){
       #rewrite ^/(.*)$ http://9.0.1.13:9004/undwrt redirect; 
       #}

       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://undwrt_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   
   }
     access_log logs/access_undwrt1_domain_cluster.log;
       }
    }
    
  server
  {
  listen 9.0.1.5:9001;
  
 location /prpall/ {
       #if ($host ~* ^9\.0\.1\.5\.(.*?)$){
       #rewrite ^/(.*)$ http://9.0.1.13:9001/prpall redirect; 
       #}
       proxy_pass  http://prpall_domain_cluster;
       proxy_set_header Host $host;

     location ~(\.jsp)|(\.do)~{
       #if ($host ~* ^9\.0\.1\.5\.(.*?)$){
       #rewrite ^/(.*)$ http://9.0.1.13:9001/prpall redirect; 
       #}

       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://prpall_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   
   }
     access_log logs/access_prpall1_domain_cluster.log;
       }
    } 
    
    
  #server
  #{
  #listen www.xxx.com:9003;
  
 #location /newclaim/ {
       
       ##if ($host ~* ^www\.gyic\.com\(.*?)$)
       ##{
       ##rewrite ^/(.*)$ http://9.0.1.14:9003/newclaim last;
       ##}
       
       
       #proxy_pass  http://newclaim_domain_cluster;
       #proxy_set_header Host $host;
       
     #location ~(\.jsp)|(\.do)~{
     
       #proxy_set_header X-Real-IP $remote_addr;
       #proxy_set_header Host $host;
       #proxy_pass  http://newclaim_domain_cluster;
       #proxy_set_header Host $host;
       #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   
   #}
     #access_log logs/access_claim1_domain_cluster.log;
       #}
    #} 
    
   server
  {
  listen 9.0.1.5:7001;
  
 location /reins/ {

       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;

     location ~(\.jsp)|(\.do)~{

       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host;
       proxy_pass  http://other_domain_cluster;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   
   }
     access_log logs/access_reins1_domain_cluster.log;
       }
    }                                                                       
}

從示例中能夠看出,nginx.conf的配置文件主要由如下幾部分構成:php

……
events
{……}
http{
server{……}
server{……}
}

3.2  nginx的虛擬主機配置

3.2.1 什麼是虛擬主機

虛擬主機使用的是特殊的軟硬件技術,他把一臺運行在因特網上的服務器主機分紅一臺臺「虛擬主機」,每臺虛擬主機均可以是一個獨立的網站,能夠具備獨立的域名,具備完整的Internet服務器功能,同一臺主機上的虛擬主機之間是徹底獨立的。從網站訪問者來看,每一臺虛擬主機和一臺獨立的主機徹底同樣。css

利用虛擬主機,不用爲每一個要運行的網站提供一臺單獨的nginx服務器或單獨運行一組nginx進程。虛擬主機提供了在同一臺服務器、同一組nginx進程上運行多個網站的功能。html

Nginx能夠配置多種類型的虛擬主機:一是基於IP的虛擬主機,二是基於域名的虛擬主機,三是基於端口的虛擬主機。這點與Apache一致。java

下面分別講解這三種虛擬主機的配置方法。node

3.2.2 配置基於IP的虛擬主機

UNIX、Linux、FreeBSD操做系統都容許添加IP別名。IP別名的概念很簡單:能夠在一塊物理網卡上綁定多個IP地址。這樣就可以在使用單一網卡的同一個服務器上運行多個基於IP的虛擬主機。設置IP別名也很是容易,只需配置系統上的網絡接口,讓他監聽額外的IP地址。在Linux/UNIX系統上,可使用標準的網絡配置工具(好比ifconfig和route命令)添加IP別名。nginx

如下是添加IP別名的示例:web

先用ifconfig查看該服務器的IP地址,下面這臺服務器有一塊物理網卡設備eth0和本地迴環設備lo,eth0的IP地址爲192.168.8.42,本地迴環lo的IP地址爲127.0.0.1。本地迴環表明設備的本地虛擬接口,因此默認被看作是永遠不會宕掉的接口,他的主要做用有兩個:一是測試本機的網絡配置,能ping通127.0.0.1說明本機的網卡和IP協議安裝都沒有問題;另外一個做用是某些Server/Client的應用程序在運行時須調用服務器上的資源,通常要指定SERVER的IP地址,但當該程序要在同一臺機器上運行且沒有別的Server時,就能夠把SERVER的資源裝在本機上,SERVER的IP地址設爲127.0.0.1,也能夠一樣運行。shell

若是要在eth0網卡設備上添加兩個IP別名192.168.8.43和192.168.8.44,能夠經過如下的ifconfig和route命令來進行:apache

/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add –host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add –host 192.168.8.44 dev eth0:2

這時,在執行ifconfig命令,就能夠看到eth0網卡設備上綁定了兩個IP別名。

這時候,從另一臺服務器ping 192.168.8.43 和 192.168.8.44兩個IP,若是可以PING通,則證實配置無誤。可是,經過ifconfig和route配置的IP別名在服務器重啓後會自動消失,不過能夠將這兩條ifconfig和route命令添加到/etc/rc.local文件中,讓系統開機時自動運行,如下是相關命令。

在文件末尾增長如下內容,而後保存便可:

/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add –host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add –host 192.168.8.44 dev eth0:2

下面開始配置基於IP的虛擬主機。不管是經過IP別名在一臺服務器上配置多個IP地址,仍是經過多塊網卡在服務器上配置多個IP地址,在NGINX中都能將其配置成爲基於IP的虛擬主機。

接下來在NGINX配置文件(nginx.conf)中,分別對192.168.8.4三、192.168.8.4四、192.168.8.45三個IP配置三個純靜態HTML支持的虛擬主機,如代碼:

http{
server{
listen  192.168.8.43:80;
server_name 192.168.8.43;
access_log logs/server1.access.log  combined;
location /{
#默認首頁文件,順序從左到右,若是找不到index.html文件,則查找index.htm文件做爲首頁文件
index  index.html  index.htm;
root /data0/htdocs/server1;
}
……
}

從上面的配置文件能夠看出,一段server{……}就是一個虛擬主機,若是要配置多個虛擬主機,創建多段server{}配置便可,很是方便。監聽IP和端口也能夠不寫IP地址,只寫端口,把它配置成「listen 80」,則表示監聽該服務器上全部IP的80端口,可經過server_name區分不一樣的虛擬主機。

3.2.3   配置基於域名的虛擬主機

基於域名的虛擬主機是最多見的一種虛擬主機。只需配置你的DNS服務器,將每一個主機名映射到正確的IP地址,而後配置NGINX服務器,令其識別不一樣的主機名就能夠了。這種虛擬主機技術,使不少虛擬主機能夠共享同一個IP地址,有效解決了IP地址不足的問題。因此,若是沒有特殊要求使你必須配置一個基於IP的虛擬主機,最好仍是使用基於域名的虛擬主機。

接下來配置基於域名的虛擬主機。在如下的示例中,配置了三個虛擬主機,第一個虛擬主機表示對域名aaa.domain.com的訪問都由它來處理,第二個虛擬主機表示全部對域名bbb.otherdomain.com的訪問都由它來處理,第三個虛擬主機表示對域名www.domain.com、domain.com,以及除了aaa.domain.com以外的全部*.domain.com二級域名的訪問都由它來處理。每一個虛擬主機的網頁文件分別存放了不一樣的目錄中,每一個虛擬主機使用了不一樣的日誌文件來記錄訪問日誌,如代碼:

http
{
server
{
listen 80;
server_name aaa.domain.com;
access_log  logs/aaa.domain.com.access.log combined;
location /
{
index index.html index.htm;
root /data0/htdocs/aaa.domain.com;
}
}
server 80;
server_name bbb.otherdomain.com;
access_log  logs/bbb.otherdomain.com.access.log combined;
location /
{
index  index.html  index.htm;
root /data0/htdocs/bbb.otherdomain.com;
}
}
……
}

3.3   nginx 的日誌文件配置與切割

在上面的nginx虛擬主機配置中,已經使用了access_log進行了日誌記錄,這一節中,咱們將詳細介紹Nginx訪問日誌文件得配置。

與nginx日誌相關的指令主要有兩條,一條是log_format,用來設置日誌的格式,另一條是access_log,用來指定日誌文件得存放路徑、格式和緩存大小。兩條指令在nginx配置文件中的位置能夠在http{……}之間,也能夠在虛擬主機之間,即server{……}兩個大括號之間。

3.3.1 用log_format指令設置日誌格式

log_format指令用來設置日誌的記錄格式,它的語法以下:log_format name format [format …]

其中name 表示定義的格式名稱,format表示定義的格式樣式。log_format有一個默認的、無須設置的combined日誌格式設置,至關於Apache的combined日誌格式,其具體參數以下:

log_format combined ‘$remote_addr - $remote_user [$time_local]’
                    ‘」$request」 $status $body_bytes_sent ‘
                    ‘」$http_referer」  「$http_user_agent」’;

注意:log_format指令設置的name名稱在nginx配置文件中是不能重複的。

假設將nginx服務器做爲web服務器,位於負載均衡設備、Squid、Nginx反向代理以後,就不能獲取到客戶端的真實IP地址了。緣由是通過反向代理以後,因爲在客戶端和Web服務器之間增長了中間層,所以Web服務器沒法直接拿到客戶端的IP,經過$remote_addr變量拿到的將是反向代理服務器的IP地址。可是,反向代理服務器在轉發請求的HTTP頭信息中,能夠增長X-Formated-For信息,用以記錄原有的客戶端IP地址和原來客戶端請求的服務器地址。

     這時候,就要用log_format指令來設置日誌格式,讓日誌記錄X-Forwarded-For信息中的IP地址,即客戶的真實IP。例如,建立一個名爲mylogformat的日誌格式,再用$http_x_forwarded_for變量記錄用戶的X-Forwarded-For IP地址:

log_format mylogformat ‘$http_x_forwarded_for - $remote_user [$time_local]’
                    ‘」$request」 $status $bodybytes_sent ‘
                    ‘」$http_referer」

在日誌變量中,變量$remote_addr和$http_x_forwarded_for用於記錄IP地址;$remote_user用於記錄遠程客戶端用戶名稱;$time_local用於記錄訪問時間與時區;$request用於記錄請求URL與HTTP協議;$status 用於記錄請求狀態,例如成功時狀態爲200,頁面找不到時狀態爲404;$body_bytes_sent用於記錄發送給客戶端的主體內容大小;$http_referer用於記錄是從哪一個頁面連接訪問過來的;$http_user_agent用於記錄客戶端瀏覽器的相關信息。

如下爲日誌範例:

124.42.4.194 - -[12/Mar/2012:02:18:23 +0800] 「GET / HTTP/1.1」 200 36179 「-」
Mozilla/4.0 (compatible;MSIE 7.0;Windows NT 5.1 ;Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.1;SV1);CIBA;.NET CLR 2.0.50727)」

3.3.2 Nginx日誌文件得切割

生產環境中的服務器,用於訪問日誌文件增加速度很是快,日誌太大會嚴重影響服務器效率。同時,爲了方便對日誌進行分析計算,需要對日誌文件進行定時切割。定時切割的方式有按月、按天、按小時切割等。最經常使用的是按天切割。

Nginx不支持像Apache同樣使用cronolog來輪轉日誌,可是能夠採用如下方式來實現日誌文件得切割:

mv /data1/logs/access.log    /data1/logs/20120418.log

kill  -USR1 Nginx主進程號

首先經過mv 命令將日誌文件重命名爲/data1/logs/20120418.log,而後發送kill –USR1信號給NGINX的主進程號,讓Nginx從新生成一個新的日誌文件/data1/logs/access.log。若是nginx.conf配置文件中使用了」pid /usr/local/webserver/nginx/nginx.pid;」指令,指定了pid文件得存放路徑,咱們能夠經過cat 這個pid文件得到nginx的主進程號,命令以下:

kill –USR1 ‘cat  /usr/local/webserver/nginx/nginx.pid’

若是想天天定時切割日誌,還須要藉助crontab,咱們能夠寫一個按天切割的日誌,按年、月份目錄存放日誌的shell腳本:

vi  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh,輸入如下內容並保存:

#!/sbin/bash
#這個腳本須在天天的00:00運行
#nginx 日誌文件得存放路徑
logs_path = 「data1/logs/」
mkdir –p ${logs_path}$(date –d 「yesterday」 + 「%Y」)/$(date –d 「yesterday」 + 「%m」)/
mv ${logs_path}access.log ${logs_path}$(date –d 「yesterday」 + 「%Y」)/$(date –d 「yesterday」 +」%m」)/access_$(date –d 「yesterday」 +」%Y%m%d」).log
kill –USR1 ‘cat /usr/local/webserver/nginx/nginx.pid’

配置Crontab天天凌晨00:00定時執行這個腳本:crontab –e

輸入如下內容:

00 00 * * * /sbin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

3.4 nginx的壓縮輸出配置

gzip(GNU-ZIP)是一種壓縮技術。通過gzip壓縮後的頁面大小能夠變爲原來的30%甚至更小。這樣,用戶瀏覽頁面的時候會快得多。gzip的壓縮頁面須要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮,傳到瀏覽器後瀏覽器解壓並解析。瀏覽器那裏咱們不用擔憂,由於IE、Firefox、Opera、谷歌Chrome等絕大多數瀏覽器都支持解析gzip過的頁面。

nginx的壓縮輸出由一組gzip壓縮指令來實現。咱們從示例入手,來學習gzip壓縮輸出。gzip壓縮輸出的相關指令位於http{……}兩個大括號之間:

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_com_level 2;
gzip_types text/plain application/x-javascript text/css  /application/xml;
gzip_vary on;

3.5  nginx的瀏覽器本地緩存設置

瀏覽器緩存是爲了加速瀏覽,瀏覽器在用戶磁盤上對最近請求過的文檔進行存儲,當訪問者再次請求這個頁面時,瀏覽器就能夠從本地磁盤顯示文檔,這樣就能夠加速頁面的閱覽。緩存的方式節約了網絡的資源,提升了網絡的效率。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
相關文章
相關標籤/搜索