正向代理

如果把局域网外的internet想象成一个巨大的资源库,那么局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务器就称之为正向代理。

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

image.png

反向代理

反向代理,其客户端对这种代理是无感知的,客户端不需要做任何配置就访问服务,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,再返回给客户端。这时反向代理服务器和目标服务器对外就是一个服务器。

客户端去访问www.xxx.com这个网站时,这个反向代理服务器会将你的请求转发给其它的服务器(随机),然后再返回请求。

image.png

负载均衡

单个服务器解决不了,就增加服务器的数量,然后将请求分发到各个服务器上,将原来请求集中到单个服务器上的情况改为多个服务器,将负载分发到不同服务器,也就是所谓的负载均衡。

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕之后再将结果返回给客户端,这种情况在处理并发请求较少的情况下是比较合适的,成本也低,但随着数据量不断增加,业务复杂程度增加,就会造成请求变得缓慢。这时我们会选择升级服务器配置,来解决这个问题,但是服务器配置也是有限的。下图看着跟反向代理一样,区别就是负载均衡对反向代理增加了一些策略配置,我客户端15个请求去访问,而代理服务器会根据设定的策略将请求转发给对应的服务器,一个服务器去处理5个请求,对负载进行分流,从而减轻压力。

image.png

动静分离

为了加快服务器的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低服务器的压力。

image.png

简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离,严格来说就是把动态请求和静态请求分开,可以理解为使用nginx处理静态请求,tomcat处理动态页面。静动分离有两种,一种是把静态文件独立成单独域名放在独立服务器上,另一种是动态和静态文件混合在一起,使用nginx来分开。

Nginx环境搭建

参考链接

https://www.runoob.com/linux/nginx-install-setup.html

Nginx配置文件

第一部分:全局块

主要设置一些影响nginx服务器整体运行的命令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。

1
2
3
4
5
6
7
8
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid

worker_processes是nginx服务器并发处理服务的关键配置,其值越大,处理并发量也越多,但是会受到设备限制。

第二部分:events块

主要影响nginx服务器与用户的网络连接

1
2
3
4
events {
worker_connections 1024;
}

最大连接数1024,此配置对nginx性能影响较大,根据实际情况灵活配置。

第三部分:http块

nginx配置最频繁的部分。代理、缓存、日志定义等大部分功能和第三方模块都在此配置。

http块也包括http全局块、server块。

  1. http全局块

htpp全局配置包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;
...............
  1. sever块

和虚拟主机有密切关系,每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机,而每个server块也分为全局server块,以及可以同时包含多个location块。

  • 全局sever块

本虚拟主机监听配置和主机的名称或IP配置

location块

基于nginx服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配(/uri_string),对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,许多的第三方模块的配置也在这里进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    server {
#监听端口
listen 80;
#主机名
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;
#本地路径
location / {
root html;
index index.html index.htm;
}
.........

location通过一些正则来进行匹配。

匹配机制链接

https://www.cnblogs.com/IPYQ/p/7889399.html

实验环境准备

  • java
  • tomcat

下载链接

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

http://tomcat.apache.org/download-80.cg

访问过程

配置反向代理

在windows系统的host文件进行域名和ip对应关系的配置

访问成功

nginx配置反向代理(一)

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name 192.168.73.138;

#charset koi8-r;

#access_log logs/host.access.log main;

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

proxy_pass 这个参数就是做代理转发。

这里重新加载报错

解决方案

1
/usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf

然后在重新reload。。。

最后的效果图

nginx配置反向代理(二)

使用nginx反向代理,通过路径跳转到不同端口的服务中去,比如访问 http://127.0.0.1:9001/test1/ 直接跳转到127.0.0.1:8080,访问 http://127.0.0.1:9001/test2/ 直接跳转到127.0.0.1:8081。

在Linux复制tomcat,修改conf配置文件server.xml,更改端口号,然后再启动tomcat,注意防火墙的端口配置规则。

为了区别两个tomcat,分别在tomcat的webapps中创建目录并写入内容

nginx具体配置

测试

负载均衡配置

1
2
3
4
5
6
7
8
9
10
11
12
13
http{
upstream myserver{
ip_hash;
server IP:端口 weight=1;
fair;
}
server{

location / {
proxy_pass http://myserver;
}
}
}
  • 轮询(默认)

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

1
2
3
upstream myserver{
server IP:端口;
}
  • weight(权重)

weight代表权,默认为1,权重越高分配越多

1
2
3
upstream myserver{
server IP:端口 weight=1;
}
  • ip_hash

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

1
2
3
4
upstream myserver{
ip_hash;
server IP:端口;
}
  • fair(第三方)

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

1
2
3
4
upstream myserver{
server IP:端口;
fair;
}

eg.

静动分离配置

通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量,Expires定义:是给一个资源设定一个过期时间。

例如设置 expires 3d,表示在三天之内访问URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则之间从服务器下载,返回状态码200,如果有经常更新的文件,不建议使用expires来缓存。

root 指定资源文件夹

autoindex on 参数列出文件

nginx高可用

当只有一台nginx服务器的时候,如果这台服务器宕机,那么所有业务服务都将终止。使用两台nginx服务器,一台当备用,当主服务器出现问题,就会转到备用服务器。

准备:

  • 两台服务器192.168.73.11和192.168.73.10
  • 两台服务器装nginx
  • 两台服务器装keepalived
1
yum install keepalived -y

安装完成之后在etc里有keepalived目录,里面就是配置文件。

keepalived配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#全局定义
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_ server 192.168.73.11
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}

#检查脚本
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}

#虚拟IP
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.73.50 // VRRP H虛拟ip地址
}
}

router_id LVS_DEVEL 唯一标识

检查脚本nginx_check.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then
/usr/local/webserver/nginx/sbin
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then
killall keepalived
fi
fi

systemctl start keepalived

启动nginx/keepalived

ps -ef | grep keepalived

查看虚拟IP

image.png

关闭nginx服务

image.png

image.png