Nginx实战:反向代理、负载均衡和动静分离

前言:Nginx服务器可以用来做反向代理、负载均衡和动静分离。

 一、反向代理实战

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。

1.1、实现目标

访问http://39.106.49.9/edu/  直接跳转到 127.0.0.1:8001

访问http://39.106.49.9/xmh/ 直接跳转到 ip地址:8080

1.2、准备两台Tomcat下的hml网页访问

①在两台云服务器上配置两个Tomcat,端口分别为8001和8080,都可以访问,端口修改配置文件即可。

②新建html内容分别添加8001端口!!!和8080端口!!!

 1.3、修改Nginx配置文件 nginx.conf

nginx安装目录下:  /usr/local/nginx/conf/nginx.conf    (location过滤请求不能指定为 /naive,我很奇怪)


   server {

        listen       80;
        server_name  39.106.49.9;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /edu/ {
            proxy_pass http://127.0.0.1:8001;
        }        

       location /xmh/ {
         proxy_pass http://你的ip地址:8080;
       }

     }

重新加载nginx

./nginx -s reload

1.4、测试访问

实现了同一个端口Nginx反向代理,通过edu和xmh路径的切换显示不同的页面

二、负载均衡实战

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务(如Web服务)分摊到多个处理单元,共同完成工作任务,从而提高并发处理能力。Web负载均衡主要作用就是用来提升服务器性能,可以处理更多的请求和更大量的数据。

2.1、修改nginx.conf

  upstream myserver {

         server 127.0.0.1:8001;
         server 8.131.82.44:8080;
  }

  server {  

      listen 80; 
      server_name 39.106.49.939;
      location / {    
         proxy_pass http://myserver; 
      }
}
   

重启nginx

./nginx -s reload

2.2、在8080的tomcat的webapps文件夹下新建edu文件夹和8001.html文件,填写内容为8080端口!!!

2.3、在地址栏回车,就会分发到不同的tomcat服务器上 

2.4、负载均衡方式

①轮询(默认)

②weight,代表权,权越高优先级越高
在这里插入图片描述

③fair,按后端服务器的响应时间来分配请求,相应时间短的优先分配
在这里插入图片描述

④ip_hash,每个请求按照访问ip的hash结果分配,这样每一个访客固定的访问一个后端服务器,可以解决session 的问题
在这里插入图片描述

2.5、负载均衡分类

1)二层负载均衡(mac)

根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应.

2)三层负载均衡(ip)

一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应. (即一个ip对一个ip的转发, 端口全放开)

3)四层负载均衡(tcp)

在三次负载均衡的基础上,即从第四层"传输层"开始, 使用"ip+port"接收请求,再转发到对应的机器。

4)七层负载均衡(http)

从第七层"应用层"开始, 根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。

我们运维中最常见的四层和七层负载均衡,这里重点说下这两种负载均衡。

1>四层的负载均衡就是基于IP+端口的负载均衡:在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。

对应的负载均衡器称为四层交换机(L4 switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡器不理解应用协议(如HTTP/FTP/MySQL等等)。

实现四层负载均衡的软件有:

F5:硬件负载均衡器,功能很好,但是成本很高。

lvs:重量级的四层负载软件

nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活

haproxy:模拟四层转发,较灵活

2>七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡:在四层负载均衡的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。

对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此种负载均衡器能理解应用协议。

实现七层负载均衡的软件有:

haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;

nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;

apache:功能较差

Mysql proxy:功能尚可。

总的来说,一般是lvs做4层负载;nginx做7层负载(也能做4层负载, 通过stream模块);haproxy比较灵活,4层和7层负载均衡都能做


三、动静分离实战

Nginx作为网页静态服务器:为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析的速度,降低由单个服务器的压力

把动态请求和静态请求分开,不是讲动态页面和静态页面物理分离,可以理解为nginx处理静态页面,tomcat处理动态页面

动静分离大致分为两种:一、纯粹将静态文件独立成单独域名放在独立的服务器上,也是目前主流方案;二、将动态跟静态文件混合在一起发布,通过nginx分开。

动静分离图析

 3.1、准备静态文件

3.2、配置nginx


四、Nginx 常用配置清单

侦听端口

server {  
# Standard HTTP Protocol 
listen 80; 
# Standard HTTPS Protocol 
listen 443 ssl; 
# For http2  
listen 443 ssl http2; 
# Listen on 80 using IPv6 
listen [::]:80; 
# Listen only on using IPv6 
listen [::]:80 ipv6only=on;
}

访问日志

server { 
# Relative or full path to log file 
access_log /path/to/file.log;  
# Turn 'on' or 'off'  
access_log on;
}

域名

server {
# Listen to yourdomain.com 
server_name yourdomain.com;  
# Listen to multiple domains  server_name yourdomain.com www.yourdomain.com; 
# Listen to all domains
server_name *.yourdomain.com; 
# Listen to all top-level domains 
server_name yourdomain.*; 
# Listen to unspecified Hostnames (Listens to IP address itself) 
server_name "";
}

静态资产

server {  
listen 80;  
server_name yourdomain.com;  
location / {      
root /path/to/website; 
}
}

重定向

server { 
listen 80;
server_name www.yourdomain.com;
return 301 http://yourdomain.com$request_uri;
}
server {
listen 80; 
server_name www.yourdomain.com; 
location /redirect-url { 
return 301 http://otherdomain.com; 
}
}

反向代理

server { 
listen 80; 
server_name yourdomain.com;
location / {  
proxy_pass http://0.0.0.0:3000; 
# where 0.0.0.0:3000 is your application server (Ex: node.js) bound on 0.0.0.0 listening on port 3000  
}
}

负载均衡

upstream node_js { 
server 0.0.0.0:3000; 
server 0.0.0.0:4000; 
server 123.131.121.122;
}
server {  
listen 80; 
server_name yourdomain.com;
location / {    
proxy_pass http://node_js; 
}
}

SSL 协议

server { 
listen 443 ssl; 
server_name yourdomain.com;
ssl on; 
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privatekey.pem; 
ssl_stapling on;
ssl_stapling_verify on; 
ssl_trusted_certificate /path/to/fullchain.pem; 
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:50m;
add_header Strict-Transport-Security max-age=15768000;
}
# Permanent Redirect for HTTP to HTTPS
server 
{  
listen 80;  
server_name yourdomain.com; 
return 301 https://$host$request_uri;
}

五、Nginx部署https的方法

(1)新建与配置文件Nginx.conf同级文件夹lls放置证书

 (2)在Nginx.conf配置文件中加入如下代码

server {
    listen 443 ssl;
    server_name www.zhengzl.cn;
    ssl_certificate lls/zhengzl.crt;
    ssl_certificate_key lls/zhengzl.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    #禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
    server_tokens off;
    #如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问
    fastcgi_param   HTTPS               on;
    fastcgi_param   HTTP_SCHEME         https;
    access_log /usr/local/nginx/logs/httpsaccess.log;
}

 (3)想要自动https就要加入如下代码

 server {
        listen  80;
        server_name www.yourdomain.com;
        rewrite ^(.*) https://$server_name$1 permanent; #http 跳转 https
    }

(4)重启Nigex服务器访问


六、Nginx高可用

如果Nginx宕机,用户请求无法实现效果。我们需要保证Nginx的高可用,安装keepalived组件,实现Nginx的主备部署。

Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。 


参考链接:

Nginx 常用配置清单

linux负载均衡总结性说明(四层负载/七层负载)

Nginx 挂了怎么办?怎么实现高可用?

Nginx结合keepalived实现高可用的完整步骤

Nginx+Keepalived实现简单的服务高可用


版权声明:本文为CSDN2497242041原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。