单机容量问题:

    随着并发量提高,单机cpu使用率增高,memory占用增加,网络带宽使用增加。

解决:

    需要水平扩展,做nginx反向代理+负载均衡策略,把同一个域名代理到多个不同的application服务器上。就要把后端的tomcat服务器集群以一个统一的域名暴露出去。

如上图架构,就需要四台虚拟机来做水平扩展,一台用于nginx反向代理,一台用于mysql,两台用于jar。

注意设置数据库的远程访问权限:

grant all privileges on *.* to root@'%' identified by 'root'; //授权任何域名用户访问对应root账号并且基于所有的权限

flush privileges;  //刷新配置生效

接入nginx反向代理:

nginx一般用于做静态web服务器,动静分离服务器,反向代理服务器。

扩展后的架构图:

 所有请求静态资源resource的通过nginx走本地磁盘(线上用NAS代替),非静态请求走服务器。前端需要修改全局映射地址,用来既可以在本地调试,又可以在云端调试:

gethost.js:

//设置全局变量h_host,在所有文件引入替换掉ajax请求路径,在线上可在改为公网地址,nginx映射后需要更改映射名称
var g_host="localhost:8090";

nginx不支持热部署,需要在加载前就确定需要使用的模块,所以建议使用OpenResty做nginx的开发框架。OpenResty是基于nginx上另外开发包装了可以支持lua,Redis的一些应用。

1.下载OpenResty

OpenResty地址:openresty.org

使用OpenResty需要前置安装pcre和openssl:

yum install pcre-devel openssl-devel gcc curl

安装OpenResty:

./configure

 编译安装: 

make

make install

 安装完成:

 2.将nginx指定成对应的web服务器

以指定配置文件的方式启动nginx:

sbin/nginx -c conf/nginx.conf  //默认80端口启动

netstat -an | grep 80  //查看启动状态

 访问后端地址,出现一下画面即安装完成:

 3.在OpenResty上完成前端资源的部署

前端资源部署:

scp -r * root@ip:/usr/local/openresty/nginx/html/

 location节点Path设置特定resource,请求走静态代理到本地磁盘:

vim conf/nginx.conf

server{
    listener 80;
    server_name localhost;

    locatin /resources/ {  //加上resources目录,注意两边都有/
        alias /usr/local/openresty/nginx/html/resources/;  //alias把路由在/resources/上的请求替换成此地址
        index index.html index.html;
    }
}

 在本地html文件下创建resources目录并执行:

mv *.html resources/

mv gethost.js resources/

cp -r static resources/

 修改配置后平滑无缝(连接不会断,但是进程号改变)重启nginx:

sbin/nginx - s reload

如图,真正起作用的是worker process。

location节点其他路径,设置nginx反向代理做动态代理

修改conf配置,设置upstream server,开启proxy pass路径:

vim conf/nginx.conf

//添加nginx反向代理,设置轮询为相等
upstream backend_server{
    server ip1 weight=1;
    server ip2 weight=1;
}

//开启反向代理
server{
    listener 80;
    server_name localhost;

    locatin /resources/ {
        alias /usr/local/openresty/nginx/html/resources/;
        index index.html index.html;
    }

    //除开resources外其他请求走一下动态资源
    location / {
        proxy_pass http://backend_server;  //proxy_pass:当前路径访问此节点时nginx不处理请求,把它代理到backend_server上(见上方配置),前端h_host需要配置
        proxy_set_header Host $http_host:$proxy_port;  //对应host传入http_host变量内,不然拿不到对应的host
        proxy_set_header X-Real-IP $remote_addr;  //真正的IP地址是远端的地址,不然拿到backend_server的地址是上面配置的地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  //nginx作为代理服务器转发了对应请求
    }
}

执行reload:sbin/nginx -s reload

开启tomcat access log(异步存储,不会影响性能)验证:

        1.在项目文件下新建tomcat文件,更改777权限,写入配置:

application.properties:

server.tomcat.accesslog.enable=true
server.tomcat.accesslog.directory=/var/www/project/tomcat
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D //%h:远端host地址 %u:远端主机的user %t:处理时长 %r:打印出第一行的请求方法 %s:http的返回状态码 %b:对应请求response的大小 %D:对应处理请求的时长

        2.重启tomcat:kill+port然后启动

        3.异步查看tomcat下的日志文件:

tail -f access_log.2021-07-13.log

        4.同步到服务器2中:

scp application.properties root@ip2:/var/www/miaosha/

         5.配置777权限+重启

使用Jmeter进行压测:

之前把数据库和项目的代码放在同一台服务器上测试的结果是数据库耗时较大,所以我们把用于数据库服务器分离出来并做带宽提升到20Mbps,把带宽所产生的影响降至最低。

在jmeter中创建请求进行压测:

        把ip地址设为代理服务器的地址后,设置同样的请求路径:

        设置同样的线程数为1000,启动时间为5s,循环30次,得到下图:

 进入数据库的服务器,使用top -H查看当前系统实时的资源消耗情况:

可以看到实时的资源消耗情况,对于单机情况下的数据库服务的压力减小了许多。

小问题:

1.当数据库和项目代码不再同一台服务器上数据库连接的消耗?

通过druid连接池长连接的断链和建连解决。

2.nginx和程序之间短连接问题?

可以通过查看实时访问项目的端口号(netstat -an | grep ip | wc -l)看到一直在创建连接和断开连接,所以是短链接。这种消耗不科学。

需要改nginx配置:

vim conf/nginx.conf

upstream backend_server{
    server ip1 weight=1;
    server ip2 weight=1;
    keepalive 30;  //30s
}


server{
    listener 80;
    server_name localhost;

    locatin /resources/ {
        alias /usr/local/openresty/nginx/html/resources/;
        index index.html index.html;
    }

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $http_host:$proxy_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_verion 1.1;  //开启http1.1,1.0不支持长连接
        proxy_set_header Connection "";  //为空默认开启长连接
    }
}

然后重新roload:sbin/nginx -s reload

通过netstat -an | grep ip |grep ESTABLISH 查看已建立的连接为长连接。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐