文章目录
前言
在前面的文章中算是完成了对于后端项目的搭载与负载均衡,使用到了nginx负载均衡与keepalived实现多nginx的双机来保证稳定与可靠,这一篇文章就主要来讲一讲如何实现前端项目的稳定运行与高可用。
部署
之前我们在运行前后端分离项目的前端项目中,可以使用到很多的前端运行工具,但是本质上也都是在node下运行的,我们打包以后可能就要在nginx服务器上进行运行。
配置
首先是对于配置文件的更改,对于前端项目可以去前端项目地址进行下载,在自己本地进行运行。
我们进入到以下的目录中找到如下配置:
如下修改:
window.SITE_CONFIG['baseUrl'] = 'http://192.168.99.151:6201/renren-fast-server';
进入到前端项目所在的目录执行:
cnpm run build
执行完以后会出现一个叫做dist的文件夹,将dist下的所有文件拷贝到nginx下。
build目录的文件拷贝到宿主机的/home/fn1/renren-vue
、/home/fn2/renren-vue
、/home/fn3/renren-vue
的目录下面。
注意: 这里的文件夹是自己创建的。
创建3节点的Nginx,部署前端项目
节点1
宿主机/home/fn1/nginx.conf的配置文件如下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
server {
listen 6501;
# nginx端口
server_name 192.168.99.101;
# 宿主机的网络
location / {
root /home/fn1/renren-vue;
# 映射到容器内部。
index index.html;
}
}
}
-v /home/fn1/renren-vue:/home/fn1/renren-vue: 目录的映射:
#启动第fn1节点
docker run -it -d --name fn1 -v /home/fn1/nginx.conf:/etc/nginx/nginx.conf -v /home/fn1/renren-vue:/home/fn1/renren-vue --privileged --net=host nginx
节点2
宿主机/home/fn2/nginx.conf的配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
server {
listen 6502;
server_name 192.168.99.101;
location / {
root /home/fn2/renren-vue;
index index.html;
}
}
}
#启动第fn2节点
docker run -it -d --name fn2 -v /home/fn2/nginx.conf:/etc/nginx/nginx.conf -v /home/fn2/renren-vue:/home/fn2/renren-vue --privileged --net=host nginx
节点3
宿主机/home/fn3/nginx.conf的配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
server {
listen 6503;
server_name 192.168.99.101;
location / {
root /home/fn3/renren-vue;
index index.html;
}
}
}
启动fn3节点
#启动第fn3节点
docker run -it -d --name fn3 -v /home/fn3/nginx.conf:/etc/nginx/nginx.conf -v /home/fn3/renren-vue:/home/fn3/renren-vue --privileged --net=host nginx
配置负载均衡
以上我们就配置了三个前端项目节点,但是就和我们后端项目类似,我们需要进行一定的配置使其能够达到负载均衡。
宿主机/home/ff1/nginx.conf配置文件
注意这个目录与文件也都是自己自行创建
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
upstream fn {
# 负载均衡的配置
server 192.168.99.101:6501; # f1 nginx前端节点。
server 192.168.99.101:6502;
server 192.168.99.101:6503;
}
server {
listen 6601;
server_name 192.168.99.101;
location / {
proxy_pass http://fn; # 引用
index index.html index.htm;
}
}
}
#启动ff1节点
docker run -it -d --name ff1 -v /home/ff1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
宿主机/home/ff2/nginx.conf配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
upstream fn {
server 192.168.99.101:6501;
server 192.168.99.101:6502;
server 192.168.99.101:6503;
}
server {
listen 6602;
server_name 192.168.99.101;
location / {
proxy_pass http://fn;
index index.html index.htm;
}
}
}
#启动ff2节点
docker run -it -d --name ff2 -v /home/ff2/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
配置双机热备
既然想要实现双击热备还是要在各自的容器中安装keepalived
。
keepalived节点一
#进入ff1节点
docker exec -it ff1 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件(如下)
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.99.152
}
}
virtual_server 192.168.99.152 6701 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.99.101 6601 {
weight 1
}
}
keepalived节点2
#进入ff1节点
docker exec -it ff2 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件(如下)
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
# 以后的ip地址
192.168.99.152
}
}
virtual_server 192.168.99.152 6701 {
# 负载哪一个nginx。
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.99.101 6602 {
weight 1
}
}
后记
以上我们就实现了前端项目的负载均衡,下面来重新回顾一下。
- 首先我们将打包好的文件拷贝到nginx配置文件中,在这里这个nginx起到的是服务器的作用。需要映射配置文件与目录。
- 这个时候我们尝试访问
192.168.99.101:6501
,192.168.99.101:6502
,192.168.99.101:6503
,都可以正确访问,因为后端我们配置好了访问路径,能够正常得到页面。 - 但是单个节点还是十分有限的,所以我们就是用到了nginx来实现负载均衡,将三个地址负载到同一个地址上保障访问比较高时候还能维持正常的运行。这个时候就可以使用到
192.168.99.101:6601
访问,但是请求可以发送到后面的三个服务器上。 - 这个时候我们又会想到这样单节点的nginx负载均衡还是有一定的隐患的,若是这个出现了故障,那么也就不能够转发,所以设置了同样的nginx结点,地址为
192.168.99.101:6602
。这样就可以将两者给糅杂到一起使用到keepalived、 - 我们在每一个的nginx负载均衡容器内安装keepalived,设置虚拟的ip地址,让这两个nginx节点进行争抢。这个时候就是用到虚拟的ip地址
192.168.99.152
到端口6701
,所以以后就可以访问192.168.99.152:6701
,然后两个nginx进行虚拟ip的抢占,然后转发到服务器的三个服务器上,服务器的配置文件中有对后端项目地址的请求,再度调用后端项目,后端的项目也进行了负载均衡的部署,所以出现问题的可能性也会比较小,等请求到数据库层面,数据库层面的MySql数据库同样进行了多台sql服务器搭建起来一个集群,保证在每一个环节都有冗余的节点供我们使用。
结语
通过大约10天的学习总算是完成了高性能,高负载项目的搭建,虽然写出来感觉轻描淡写,只是简单的文件配置和命令行的输入,但是是在自己都实验过一遍以后,才写出来这几篇博客。其中出现了很多问题,网络不稳定,搭建过程中版本的不一致性,导致配置文件的不出现,端口和防火墙问题等等,也算是把linux的基础防火墙配置,以及文件的基础配置学习了一遍,也算是学习到了很多的东西。
之前的项目都是在本地跑,一个MySql服务器,创建几个表,打开redis客户端后端的项目就算好了,加上Spring Boot项目中不用配置tomcat服务器,傻瓜式操作,所以学习到高并发的地方还是蛮少的,这几天的学习也让我了解了更多的高并发层面的知识,获益匪浅。就酱。