阿里云个人服务器搭建项目笔记四:nginx反向代理优化,分布式扩展

首先我们需要思考上一个章节并发上不去的原因。发现在并发环境下mysql数据库的压力始终很大,一台服务器上面不仅仅要跑java的jar包程序,还要承受高并发访问数据库的压力。这样的压力都在同一台服务器上显然存在缺陷。所以我们可以购买多台服务器。

一台专门用来部署项目的数据库。
两台或多台用来部署项目jar包。
一台用来配置部署nginx反向代理。

首先这里购买4台服务器,两台跑java,一台部署数据库,一台部署nginx。

部署前准备:
将原来的 //var/www项目文件夹传输至另两台需要部署jar包的服务器中,原来的服务器就用来部署mysql数据库。

使用scp:
scp -r //var/www root@目标服务器ip地址:/var,然后输入密码即可。
这里如果购买的多台服务器都是阿里云的同一地区的服务器,用私有ip进行传输,因为阿里云同一地区的服务器是内网互通的,互相传输快的飞起。

分别将www内的项目文件传输完成之后。准备在两台服务器上面配置数据库连接并启动。

应用程序服务器(两台)

先在两台应用程序服务器上rpm安装jdk,之前的笔记中有操作流程这里不再赘述。
切换到项目www/seckill目录准备启动项目。在把jar包跑起来之前,先要将接收到的配置文件修改一下,因为,项目中的application.properties文件默认的datasource.url是localhost:3306。如果这样启动起来,是找不到数据库的,因为应用程序服务器并不是用来部署数据库的,所以,我们打开外挂的配置文件修改datasource:
vim application.properties.
添加下面一行配置:
spring.datasource.url=jdbc:mysql://数据库服务器的内网ip:3306/seckillboot?serverTimezone=GMT%2B8
数据库服务器的内网地址即刚刚传输项目的服务器,必须用内网ip保证数据库访问速度

配置好DataSource之后,在启动项目之前,测试能否连接上数据库的服务器:
yum install telnet
telnet 数据库服务器ip 3306
结果发现,远程数据库拒绝了连接。
这时候我们要去数据库服务器配置mysql的远程连接权限(见第二部分)。
配置好之后再次telnet ip:3306测试连接,提示输入数据库密码即可连接,这里就不连了,直接 ./deploy.sh & 启动项目即可。
启动项目之后,访问 项目服务器公有ip/可以访问数据库的路径,我的是ip/item/get?id=9,可以显示出从数据库获取的item数据,表示部署成功(两台服务器操作相同)

数据库服务器

配置其他服务器连接数据库的权限

只要知道数据库的root的密码就可以有全部数据库的全部权限,最后刷新权限,无需重启数据库,可以这样配置。
mysql -uroot -p密码
grant all privileges on *.* to root@’%’ identified by ‘root’;

flush privileges;

这时,到应用程序服务器上就可以访问到数据库服务器的数据库。
下面是nginx反向代理服务器的配置。

nginx反向代理服务器

在部署nginx的服务器上安装openresty:
1.下载openresty并上传到部署nginx的服务器。
2.chomd -R 777授予权限,tar -xvzf 包名 安装解压。
3.cd 解压后的openresty目录。
4. 执行 ./configure(需要先yum install gcc)
5. make编译完成之后,make install
6. cd //user/local/openresty进入openresty目录。
7. 在nginx目录下,cd ls直到出现conf html logs sbin四个文件夹。在这个目录下执行sbin/nginx -c conf/nginx.conf 启动nginx,配置文件的主要参数:
location节点path:指定url映射key
location节点内容:root指定location path后对应的根路径,index指定默认的访问页。
重启nginx的命令为:sbin/nginx -s reload

8.启动nginx之后访问服务器ip会显示openresty的成功页。
至此nginx安装部署完成。

将前端资源部署到nginx上。

1.将本地的html文件上传到服务器的:/usr/local/openresty/nginx/html路径下,并命名为resources文件夹。
2.vim编辑/usr/local/openresty/nginx/conf路径下的nginx.conf文件修改前端路由配置。
3.修改如下区域的配置

        #access_log  logs/host.access.log  main;

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

即如果输入的路径地址包括了/resources下,那么就会自动去/usr/local/openresty/nginx/html/resources/这个alias路径下寻找资源,并且将对应名字的html资源拼接在后面,也就是说alias起到一个替代的作用

开始配置nginx反向代理

将静态资源部署到了nginx服务器之后,我们还要做以下操作配置反向代理以完成请求的路由:

  • 设置upstream server
  • 设置动态请求location为proxy pass路径。

继续修改nginx.conf(这部分非常关键):

配置upstream:


    #gzip  on;
    upstream seckill_server{
	server 应用程序服务器1的私有ip:服务器的tomcat端口号 weight=1;
	server 应用程序服务器2的私有ip:服务器的tomcat端口号 weight=1;
    }

以上面代码为例,seckill_server是这个upstream的别名,下面要用到,ip和端口号指明了应用程序服务器的tomcat的路由地址,weight指明了nginx反向代理服务器配置的轮询是一比一的,也就是一半的请求轮询的路由到应用程序服务器1,一半到应用程序服务器2。(如果应用程序服务器在本机的话,要注意nginx和tomcat的端口号不能冲突,比如本机的tomcat端口号是8080,那么直接server localhost:8080;即可)

配置动态资源的location

在上一次配置的静态资源的location的下面新增一个配置:

location / {
	    proxy_pass http://seckill_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; # nginx作为代理服务器转发请求
	}

配置的意思就是如果请求路径不包括resources,那么所有请求都会发送到seckill_server
之后sbin/nginx -s reload重启nginx,可以t进入logs目录tail -f error.log查看是否报错。

2020.2.23更新这里留下的坑
nginx配置upstream的时候名字不能包含 _ 下划线!这里我配置的seckill_server就完美的踩到了这个坑…这里就不修改了,如果配置的话要注意一下,tomcat8及以上都会有这个问题。

分布式扩展之后的压测

先将服务器的带宽扩展以减少带宽造成的网络延迟误差。
先压测之前的单机服务器,开启1000个线程循环30次,5秒之内启动。
结果:
average:460ms左右
tps:1500左右
top -H->%Cpu(s):最高达到了80us
load average:1.3
可以发现单机服务器的负载达到了在这个并发环境下近乎达到了极限。

压测分布式扩展之后的服务器:
压测nginx代理服务器的代理地址,并观察数据库服务器的top -H:
结果:
average:450ms左右
tps:1750左右
top -H->%Cpu(s):2us
load average:0.5
可以发现分布式扩展之后数据库服务器的压力明显减小。可以说解决了单机容量的瓶颈问题。

其他优化

配置nginx和应用服务器长连接

我们的数据库服务器是通过druid连接池实现连接的,也就是数据库服务器默认是长连接的方式,但是nginx默认是和后端服务器默认是短连接的方式,有建立连接和释放连接的过程,虽然局域网内的服务器短连接耗时很少,但是还是需要优化。


    #gzip  on;
    upstream seckill_server{
	server 应用程序服务器1的私有ip:服务器的tomcat端口号 weight=1;
	server 应用程序服务器2的私有ip:服务器的tomcat端口号 weight=1;
	keepalive 30;# 开启keepalive模式,设置keepalive为30秒
    }
    

修改http协议版本以支持keepalive:

       location / {
            proxy_pass http://seckill_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_version 1.1;
            proxy_set_header Connection "";
        }

再次压测结果:
average:350ms左右
tps:1750左右(变化不大)
top -H->%Cpu(s):2us (变化不大)
load average:0.5(变化不大)

可以看出,配置了nginx和后端服务器的长连接之后,平均的请求时长降低了100ms,减少了网络不断建立和释放连接的耗时。

留下的坑

没有配置分布式的session,因为我的项目的用户登录的信息存储在tomcat的session内,如果nginx通过反向代理路由到了一台没有session的服务区上,那么用户将无法完成需要登录(get session)的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值