nginx(三) -- nginx反向代理、负载均衡、动静分离

1. 反向代理1

1.1 实现效果

打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中

linux中安装tomcat不再多说

1.2 域名解析过程

在这里插入图片描述
注意:当我们在windows浏览器访问一个ip的时候,首先会进入到hosts文件中查找有没有此ip,如果没有,再进入到网络的dns域名解析器中查找。

配置分析:

  1. 首先需要在本地配置访问www.123.com:8080能访问到服务器上的8080
  2. 需要在服务器上配置访问80能直接链接到8080
  3. 最后即访问本地www.123.com(即访问www.123.com:80),能访问到服务器8080

1.3 host文件修改(本机配置)

在windows电脑的host文件中添加

ip地址   www.123.com

此时可以看到使用www.123.com:8080已经可以访问到tomcat主页了,此时请求www.123.com:8080就相当于访问ip:8080

1.4 修改nginx配置文件(服务器配置)

  1. 修改server_name为本机ip
  2. 修改location,添加proxy_pass
  3. 录入配置./nginx -s reload

这样,如果用户在本机ip上访问80端口,就会帮我们转发到proxy_pass设置的ip和端口8080

server {
   listen       80;
   server_name  ip; # 此ip为我阿里云服务器外网ip

   #charset koi8-r;

   #access_log  logs/host.access.log  main;

   location / {
       root   html;
	   proxy_pass  http://ip:8080;# 此ip为我阿里云服务器外网ip
       index  index.html index.htm;
   }

1.5 访问

在这里插入图片描述

2. 反向代理2

2.1 实现效果

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,

nginx 监听端口为 9001

访问 http://本机ip:9001/edu/ 直接跳转到 127.0.0.1:8081
访问 http://本机ip:9001/vod/ 直接跳转到 127.0.0.1:8082

2.2 准备工作:

在服务器中启动2个tomcat镜像,端口分别为8081和8082,在两个webapps中分别创建/edu/a.html和/vod/b.html

a中内容为数字8081,b中内容为数字8082

启动后查看:
在这里插入图片描述

2.3 修改配置文件

在nginx.conf中添加:

server {
    listen       9001;
    server_name  外网ip;
    # ~表示匹配如果路径中有edu,就转发到proxy_pass设置的地址去
    location ~/edu/ {
        proxy_pass   http://外网ip:8001;
    }
    location ~/vod/ {
        proxy_pass   http://外网ip:8002;
    }
}

reload让配置文件生效,开放9001端口

2.4 测试:

在这里插入图片描述

2.5 location指令说明

该指令用于匹配 URL

语法如下:
在这里插入图片描述

  1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  2. ~:用于表示 uri 包含正则表达式,并且区分大小写。
  3. ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  4. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

**注意:*如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识

3. 负载均衡(主要是配置upstream)

3.1 实现效果

浏览器地址栏输入地址 http://ip/edu/a.html,负载均衡效果,平均到 8081和8082 端口中;

准备:
在8081和8082的webapps中添加edu目录,在edu目录中添加a.html,内容分别为8081和8082

3.2 添加负载均衡配置

在nginx.conf中添加:

upstream myserver{
        server ip:8080;
        server ip:8081;
}

添加80的server中的proxy_pass:

server {
        listen       80;
        server_name  ip;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass  http://myserver;
            index  index.html index.htm;
        }

3.3 测试

多次请求http://ip/edu/a.html,可以看到nginx将请求均匀的分配给了8081和8082
在这里插入图片描述

3.4. 负载均衡的策略

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎, nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):

3.4.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除

upstream myserver{
        server ip:8080;
        server ip:8081;
}
3.4.2 weight

weight 代表权,重默认为 1,权重越高被分配的客户端越多 。

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream myserver{
          server ip:8080 weight=10;
          server ip:8081 weight=5;
}
3.4.3 ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题

也就是说客户端在第一次访问某个服务后,后面都是访问此服务 。

例如:

upstream myserver{
            ip_hash;
            server ip:8080;
            server ip:8081;
 }
3.4.4 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver{
             server ip:8080;
             server ip:8081;
             fair;
}

4. 动静分离

4.1 什么事动静分离

在这里插入图片描述
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200

4.2 准备工作

在项目某个目录下比如data/www中放一些静态资源如a.html或者img等。。。不多赘述

4.3 修改配置文件

在nginx.conf中添加重定向

location /www/ {
        root   /data/; # 通过www访问到/data/www中
        index  index.html index.htm;
}

location /image/ {
        root   /data/; # 通过image访问到/data/image中
        autoindex on; #目的是为了在访问 /image 时,能够显示目录里面的内容,当然这里也可以通过expire设置缓存过期时间 
}

4.4 测试

在这里插入图片描述

5. 项目中的nginx配置举例:

vhost文件夹中:

server {
    listen 8007 ssl;
    server_name XXX.net.cn;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers *;
    add_header Cache-Control no-cache;

    #证书
    # 。。。

    if ($request_method = 'OPTIONS') {
       return 204;
    }

    location /
    {
        root   /home/www/XXX-baoxiang-h5-8007;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
        expires  -1;
    }
    location /apibaoxiang/
    {
        proxy_pass http://getway-lsyx-server/;
        proxy_redirect default;
        proxy_read_timeout 3000;
    	proxy_redirect default;
    	proxy_http_version 1.1;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_set_header X-Real-IP $remote_addr;
	    limit_req zone=one burst=5000 nodelay;
    }
    include vhosts/common/upl.conf;
}

nginx.conf配置文件:

worker_processes  8;
events {
    worker_connections 102400;
    accept_mutex on;
    multi_accept on;
    use epoll;
}
http {
include  mime.types;
    keepalive_timeout  90000;
    limit_req_zone $binary_remote_addr zone=one:200m rate=2000r/s;
    gzip_static on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers  4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types  text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_proxied expired no-cache no-store private auth;
    gzip_vary on;
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log debug;
    client_header_timeout 90000;
    client_body_timeout 90000;
    client_body_buffer_size 300m;
    client_max_body_size 300m;
    reset_timedout_connection on;
    send_timeout 1000;
    #limit_conn_zone $binary_remote_addr zone=addr:50m rate=1000r/s;
    #limit_conn addr 1000;
    default_type text/html;
    charset UTF-8;
    open_file_cache max=100000 inactive=30s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    upstream getway-lsyx-server {
      fair;
      server 0.0.0.1:8301;
      server 0.0.0.2:8301;
      server 0.0.0.3:8301;
    }
    upstream getway-hls-server {
      fair;
      server 0.0.0.1:8301; # 此处为服务器外网ip
      server 0.0.0.2:8301;
      server 0.0.0.3:8301;
    }
   include vhosts/*.conf;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值