三、NGINX的配置与优化

3.1 nginx的完整配置示例

nginx的配置文件默认在nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf,假设您的nginx安装在/usr/local/webserver/nginx/目录下,那么默认的主配置文件则为/usr/local/webserver/nginx/nginx.conf,以下是我当时为某保险公司搭建的nginx的配置示例(部分信息做了漂白)。

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 /
    {    

         #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到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的配置文件主要由以下几部分构成:

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

3.2  nginx的虚拟主机配置

3.2.1 什么是虚拟主机

虚拟主机使用的是特殊的软硬件技术,他把一台运行在因特网上的服务器主机分成一台台“虚拟主机”,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Internet服务器功能,同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。

利用虚拟主机,不用为每个要运行的网站提供一台单独的nginx服务器或单独运行一组nginx进程。虚拟主机提供了在同一台服务器、同一组nginx进程上运行多个网站的功能。

Nginx可以配置多种类型的虚拟主机:一是基于IP的虚拟主机,二是基于域名的虚拟主机,三是基于端口的虚拟主机。这点与Apache一致。

下面分别讲解这三种虚拟主机的配置方法。

3.2.2 配置基于IP的虚拟主机

UNIX、Linux、FreeBSD操作系统都允许添加IP别名。IP别名的概念很简单:可以在一块物理网卡上绑定多个IP地址。这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机。设置IP别名也非常容易,只需配置系统上的网络接口,让他监听额外的IP地址。在Linux/UNIX系统上,可以使用标准的网络配置工具(比如ifconfig和route命令)添加IP别名。

以下是添加IP别名的示例:

先用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,也可以同样运行。

如果要在eth0网卡设备上添加两个IP别名192.168.8.43和192.168.8.44,可以通过以下的ifconfig和route命令来进行:

/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别名。

113006_Lt9U_2391658.png

这时候,从另外一台服务器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.43、192.168.8.44、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;
}

 

转载于:https://my.oschina.net/u/2391658/blog/728176

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值