基于nginx实现web服务器的双机热备

1.适用场景

对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。双机热备由备用的服务器解决了在主服务器故障时服务不中断的问题。

2.nginx

nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

3.方法

前提:

  1. nginx环境

  2. 准备两台web服务器

  • 192.168.81.146
  • 192.168.81.147
    在两台机器上部署相同web服务,共用一套存储设备,其中146服务器作为主服务器,147作为备用服务器。yii.nginx.com作为该web服务的域名。

步骤1. 配置nginx.conf文件
在nginx.conf文件里添加如下代码

   #双机热备方式  
   upstream yii.nginx.com {  
       server 192.168.81.146:8080;  
       server 192.168.81.147:8080 backup;  
   }  
  
   #反向代理配置  
   server {  
     listen       80;  
     server_name  yii.nginx.com;  
     charset utf-8;  
     location /{  
        proxy_pass http://yii.nginx.com;  
     }  
  }  
#映射到tomcat访问路径
#双机热备方式
upstream srm.rrswl.com_server {
         server 10.138.10.23:8080;
         server 10.138.10.24:8080;
         #会话保持
         ip_hash;

}
#反向代理
server {
        #此处的80端口可以改为其他端口,nginx默认80可以改为8080,防止端口冲突上面的
        #8080需要改为其他端口即可
        listen 80;
        server_name  10.138.10.23;

        # individual nginx logs for this web vhost
        #日志路径即nginx安装路径
        #启动日志报错可删除日志
        access_log /usr/local/nginx/logs/srm.rrswl-access.log main;
        error_log /usr/local/nginx/logs/srm.rrswl-error.log ;
  #访问映射路径
  location =/ {
                rewrite ^ /srm-angular-bootstrap/login.html redirect ;
  }
  #静态文件加载
  location / {
    proxy_pass http://srm.rrswl.com_server;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable    "MSIE [1-6]\."; 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_connect_timeout 3;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
}

##############################################################
#映射到tomcat访问路径
#双机热备方式
#访问域名
upstream srm.rrswl.com_server {
         server 10.138.41.139:8080;
         server 10.138.41.140:8080;
         #会话保持
         ip_hash;

}
#附件nginx配置
upstream srm.rrswl.com_8000_server {
         server 10.138.231.185:8000;
         server 10.138.231.186:8000;
         ip_hash;
}
#反向代理
#作用:访问80  自动跳转到443   也就是htttp重定向到https
server {
        listen       80;
        server_name  srm.rrswl.com;
        rewrite ^(.*)$  https://$host$1 permanent;
}

server {
        #listen 80;
        listen       443 ssl;
        server_name  srm.rrswl.com;
        
        #证书
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/server_rrswl.pem;
        ssl_certificate_key /usr/local/nginx/conf/ssl/server_rrswl.key;
        ssl_session_timeout 5m;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers   on;
        #日志路径即nginx安装路径
        #启动日志报错可删除日志
        # individual nginx logs for this web vhost
        access_log /usr/local/nginx/logs/srm.rrswl-access.log main;
        error_log /usr/local/nginx/logs/srm.rrswl-error.log ;
    #访问映射路径
  location =/ {
                rewrite ^ /srm-angular-bootstrap/login.html redirect ;
  }
    #静态文件加载
  location / {
    proxy_pass http://srm.rrswl.com_server;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable    "MSIE [1-6]\."; 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_connect_timeout 3;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
}
#附件
server {
        listen 8000 ssl;
        server_name  srm.rrswl.com;


        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/server_rrswl.pem;
        ssl_certificate_key /usr/local/nginx/conf/ssl/server_rrswl.key;
        ssl_session_timeout 5m;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers   on;

        access_log /usr/local/nginx/logs/srm.rrswl_8000-access.log main;
        error_log /usr/local/nginx/logs/srm.rrswl_8000-error.log ;

  location / {
    proxy_pass http://srm.rrswl.com_8000_server;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable    "MSIE [1-6]\."; 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_connect_timeout 3;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
}

#双机热备方式  
  upstream server_backend{  
       server 10.138.10.23:8080;  
       server 10.138.10.24:8080;  
   }  
  
   #反向代理配置  
   server {  
     listen       80;  
     server_name  10.138.10.23;  
     charset utf-8;  
     location /{  
        proxy_pass http://server_backend/srm-angular-bootstrap/login.html;  
     }  
  }
 

访问地址 http://10.138.10.23 自动映射到对应地址,在页面端不要加端口

  • 校验nginx配置正确./nginx  -t
    nginx重新启动。在改了配置文件的情况下:./nginx -s reload

说明:backup是利用nginx的热备功能,这也是最典型的应用带来的重要好处之一,当非backup Server能够很好的为Client提供服务的时候,backup Server不对外界提供服务,此时backup Server处于冷状态;当所有非backup Server不能很好的为Client提供服务的时候,backup Server为Client提供服务,做到了热备,某台或者所有非backup Web Server宕机不会影响整个Web项目的访问功能,Web项目仍然可以为Client提供服务。
步骤2.启动nginx

start nginx

步骤3.访问域名http://yii.nginx.com
访问http://yii.nginx.com域名,可以看到我们部署的web服务(我们看到的是146服务器上部署的服务),如果此时192.168.81.146的服务器出现故障,服务器无法连接,nginx自动将请求转发到备用服务器192.168.81.147:8080上。通过nginx的主备机制,使得用户访问的web服务不会因为主服务器的故障而无法访问。

4.测试方法可行性

通过上述步骤,我们可以测试nginx对于双机热备是否可行,我们在146机器上部署tomcat7.0,在147机器上部署tomcat8.0,当146机器没有故障时,访问域名我们可以看到界面是tomcat7.0,当我们关闭146服务,重新访问域名,访问页面是tocmat8.0,因此可以证明,当主服务器出现故障时无法提供服务时,备用服务器能代替主服务器提供服务,保证服务的不中断。

5.其他知识点

5.1关于nginx的反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处理的是tomcat。

5.2关于双机热备

  1. 双机热备

从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。双机热备由备用的服务器解决了在主服务器故障时服务不中断的问题。

  1. 为什么使用双机热备

双机热备针对的是服务器的故障。
服务器的故障可能由各种原因引起,如设备故障、操作系统故障、软件系统故障等等。
而对于一些重要系统而言,用户是很难忍受这样长时间的服务中断的。因此,就需要通过双机热备,来避免长时间的服务中断,保证系统长期、可靠的服务。
决定是否使用双机热备,正确的方法是要分析一下系统的重要性以及对服务中断的容忍程度,以此决定是否使用双机热备。即,你的用户能容忍多长时间恢复服务,如果服务不能恢复会造成多大的影响。

  1. 双机热备的三种实现方案
    组成双机热备的方案主要的三种方式分别为:基于共享存储(磁盘阵列)的方式,全冗余方式和复制方式。
  • (1)基于共享存储(磁盘阵列)的方式
    共享存储方式主要通过磁盘阵列提供切换后,对数据完整性和连续性的保障。用户数据一般会放在磁盘阵列上,当主机宕机后,备机继续从磁盘阵列上取得原有数据。如下图所示
    这种方式因为使用一台存储设备,往往被业内人士称为磁盘单点故障。但一般来讲存储的安全性较高。所以如果忽略存储设备故障的情况下,这种方式也是业内采用最多的热备方式了。

  • image.png

  • (2)全冗余方式
    全冗余方式就是双机双存储,基于单台存储的传统双机热备方式,确实存在存储单点故障的情况,为实现存储冗余,存储高可用也已经越来越多的被用户接受。我们从理解上可以看出,双机热备最早是为解决服务器的计划性停机与非计划性宕机的解决方案,但是我们无法实现存储的计划性停机与非计划性宕机带来的服务器停机,而存储作为双机热备中唯一存储数据的设备,它一旦发生故障往往会造成双机热备系统全面崩溃。

  • image.png

  • (3)
    这种方式主要利用数据的同步方式,保证主备服务器的数据一致性。

  • image.png

参考资料

http://www.cnblogs.com/Eric-5279/p/5479255.html

nginx实现跨域

在location / {}的配置里加上这个

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";


作者:_Reality
链接:https://www.jianshu.com/p/db1f114182b1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/qq_19897551/article/details/82905596