【nginx+keepalived】nginx+keepalived搭建高可用
一、结构及环境
1.1 环境介绍
操作系统:centos7
nginx+keepalived:106.53.73.200 master
nginx+keepalived:182.254.184.102 backup
VIP:106.53.73.222 负载均衡器上配置的域名都解析到这个VIP上
1.2 环境安装
PS:两台服务器都需安装nginx和keepalived(nginx已经安装,这里不作解释)
安装依赖:
# yum -y install gcc pcre-devel zlib-devel openssl-devel
关闭selinux和防火墙:
# 查看selinux
# getenforce
Disabled # 设置selinux(临时修改)
# setenforce 0 # 永久修改(写进配置文件,重启服务器生效)
# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
# 查看状态(关闭只需将status改为stop即可)
# systemctl status firewalld
下载最新安装包:
# wget https://www.keepalived.org/software/keepalived-2.0.19.tar.gz
[root@VM_0_10_centos tmp]# tar -zxvf keepalived-2.0.19.tar.gz
[root@VM_0_10_centos tmp]# cd keepalived-2.0.19/
[root@VM_0_10_centos keepalived-2.0.19]# ./configure
出现以下错误,是没有安装依赖包,安装依赖包即可

[root@VM_0_10_centos keepalived-2.0.19]# yum -y install libnl libnl-devel
[root@VM_0_10_centos keepalived-2.0.19]# yum -y install libnfnetlink-devel
再次编译安装即可:
[root@VM_0_10_centos keepalived-2.0.19]# make && make install
加入到系统启动服务:
# 将nginx和keepalived加入到开机自启
[root@VM_0_10_centos keepalived-2.0.19]# cp -r /tmp/keepalived-2.0.19/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@VM_0_10_centos keepalived-2.0.19]# mkdir /etc/keepalived
[root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/sbin/keepalived /usr/sbin/
[root@VM_0_10_centos keepalived-2.0.19]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
[root@VM_0_10_centos keepalived-2.0.19]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
1.3 配置nginx服务
参考博客:https://blog.csdn.net/u012599988/article/details/82152224
配置文件接入:
[root@centos6-1 conf]# vim /usr/local/nginx/conf/nginx.conf
user www;
worker_processes 8; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 65535;
} http {
include mime.types;
default_type application/octet-stream;
charset utf-8; ######
## set access log format
######
log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_cookie" $host $request_time';
#######
## http setting
#######
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#便于测试,缓存功能先取消
#proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m;
#proxy_temp_path /var/www/cache/tmp; fastcgi_connect_timeout 3000;
fastcgi_send_timeout 3000;
fastcgi_read_timeout 3000;
fastcgi_buffer_size 256k;
fastcgi_buffers 8 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on; client_header_timeout 600s;
client_body_timeout 600s;
# client_max_body_size 50m;
client_max_body_size 100m; #允许客户端请求的最大单个文件字节数
client_body_buffer_size 256k; #缓冲区代理缓冲请求的最大字节数,可以理解为先保存到本地再传给用户 gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
gzip_vary on; ## includes vhosts
include vhosts/*.conf;
}
[root@centos6-1 conf]# mkdir /usr/local/nginx/conf/vhosts
[root@centos6-1 conf]# mkdir /var/www/cache
[root@centos6-1 conf]# ulimit 65535
[root@centos6-1 conf]# cd vhosts/
[root@centos6-1 vhosts]# vim LB.conf
upstream LB-WWW {
ip_hash;
server 192.168.139.129:8080 max_fails=3 fail_timeout=30s;
#max_fails = 3 为允许失败的次数,默认值为1
server 192.168.139.130:8080 max_fails=3 fail_timeout=30s;
#fail_timeout = 30s 当max_fails次失败后,暂停将请求分发到该后端服务器的时间
} server {
listen 80;
server_name dev.hanginx.com; access_log /usr/local/nginx/logs/dev-access.log;
error_log /usr/local/nginx/logs/dev-error.log;
location / {
proxy_pass http://LB-WWW;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300; #跟后端服务器连接超时时间,发起握手等候响应时间
proxy_send_timeout 300; #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_read_timeout 600; #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
proxy_buffer_size 256k; #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
proxy_buffers 4 256k; #同上,告诉nginx保存单个用几个buffer最大用多少空间
proxy_busy_buffers_size 256k; #如果系统很忙时候可以申请最大的proxy_buffers
proxy_temp_file_write_size 256k; #proxy缓存临时文件的大小
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
# proxy_cache mycache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
}
}
在两个tomcat服务下创建index文件进行测试,通过ip访问如下(需重启nginx和tomcat服务)


自己本人的配置文件是在nginx.conf配置文件中配置的,而不是通过include接入的方式:
[root@VM_0_10_centos ~]# less /usr/local/nginx/conf/nginx.conf
#user nobody;
user apache apache;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
} 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; #便于测试,缓存功能先取消
#proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m;
#proxy_temp_path /var/www/cache/tmp; client_max_body_size 100m; #允许客户端请求的最大单个文件字节数
client_body_buffer_size 256k; #缓冲区代理缓冲请求的最大字节数,可以理解为先保存到本地再传给用户 #gzip on;
#20190827添加
upstream testTomcat{
#设置分权,权重越高优先访问
server 106.53.73.200:8888 weight=1;
server 182.254.184.102:8888 weight=1;
} server {
listen 80;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #所有请求都在这里去找分配
location / {
#root html;
index index.html index.htm index.php;
#使用test分配规则,即刚刚自定义添加的upstream节点
proxy_pass http://testTomcat/test/;
# proxy_pass http://testTomcat/;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300; #跟后端服务器连接超时时间,发起握手等候响应时间
proxy_send_timeout 300; #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_read_timeout 600; #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
proxy_buffer_size 256k; #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
proxy_buffers 4 256k; #同上,告诉nginx保存单个用几个buffer最大用多少空间
proxy_busy_buffers_size 256k; #如果系统很忙时候可以申请最大的proxy_buffers
proxy_temp_file_write_size 256k; #proxy缓存临时文件的大小
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
# proxy_cache mycache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
1.4 配置keepalived服务
配置之前需要配置好邮件服务,当然,不配置邮件服务也没影响
mail配置参考博客:https://www.cnblogs.com/HeiDi-BoKe/p/11883323.html
master服务(106.53.73.200)配置:
# 修改之前先备份
[root@VM_0_10_centos ~]# cd /etc/keepalived/
[root@VM_0_10_centos keepalived]# pwd
/etc/keepalived
[root@VM_0_10_centos keepalived]# cp -r keepalived.conf keepalived.conf.bak
[root@VM_0_10_centos keepalived]# less keepalived.conf
! Configuration File for keepalived global_defs {
notification_email { # 指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
acassen@firewall.loc # 设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # keepalived在发生诸如切换操作时需要发送email通知地址
smtp_server 192.168.200.1 # 指定发送email的smtp服务器
smtp_connect_timeout 30 # 设置连接smtp server的超时时间
router_id MASTER-200 # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} #调用 shell 脚本对 haproxy 服务进行监控
vrrp_script check_pid {
script "/etc/keepalived/check_pid.sh /var/run/nginx/nginx.pid"
interval 2 # 检测间隔
weight -5 # 权重起伏
fall 2 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 # 检测1次成功就算成功。但不修改优先级
} vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是
说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER interface eth0 # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
# mcast_src_ip 172.16.0.10/20 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口
来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址 virtual_router_id 79 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 101 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { # 设置验证类型和密码。主从必须一样
auth_type PASS # 设置vrrp验证类型,主要有PASS和AH两种
auth_pass keepalived
}
virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
172.16.0.222/20 brd 172.16.15.255
}
#服务端口监控
track_script {
check_pid
}
}
[root@VM_0_10_centos keepalived]# less check_pid.sh
#!/bin/bash #keepalived 根据进程 Pid 监控服务脚本
#
#使用方法:
#vrrp_script check_pid {#创建一个vrrp_script脚本,检查配置
# script "/etc/keepalived/check_pid.sh /var/run/nginx.pid" #配置需要监控进程的PID 文件完整路径
# interval 2 #检查脚本的频率,单位(秒)
# weight -5 #权重起伏
#}
PidPath=$1
echo $PidPath
if [ -e $PidPath ];then
echo "$PidPath is run !!!"
exit 0;
else
echo "$PidPath File does not exist !!!"
exit -1;
fi
backup服务(182.254.184.102)配置:
[root@VM_0_16_centos tomcat-8.5.45]# cd /etc/keepalived/
[root@VM_0_16_centos keepalived]# ls
keepalived.conf
[root@VM_0_16_centos keepalived]# pwd
/etc/keepalived
[root@VM_0_16_centos keepalived]# cp -r keepalived.conf keepalived.conf.bak
[root@VM_0_16_centos keepalived]# cp /thyclient/keepalived.conf .
cp: overwrite ‘./keepalived.conf’? y
[root@VM_0_16_centos keepalived]# less keepalived.conf
! Configuration File for keepalived global_defs {
notification_email { # 指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
acassen@firewall.loc # 设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # keepalived在发生诸如切换操作时需要发送email通知地址
smtp_server 192.168.200.1 # 指定发送email的smtp服务器
smtp_connect_timeout 30 # 设置连接smtp server的超时时间
router_id MASTER-200 # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} #调用 shell 脚本对 haproxy 服务进行监控
vrrp_script check_pid {
script "/etc/keepalived/check_pid.sh /var/run/nginx/nginx.pid"
interval 2 # 检测间隔
weight -5 # 权重起伏
fall 2 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 # 检测1次成功就算成功。但不修改优先级
} vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是
说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER interface eth0 # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
# mcast_src_ip 172.16.0.10/20 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口
来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址 virtual_router_id 79 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 101 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { # 设置验证类型和密码。主从必须一样
auth_type PASS # 设置vrrp验证类型,主要有PASS和AH两种
auth_pass keepalived
}
virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
172.16.0.222/20 brd 172.16.15.255
}
#服务端口监控
track_script {
check_pid
}
}
1.5 配置好之后验证keepalived
1)先后在master、slave服务器上启动nginx和keepalived,保证这两个服务都正常开启:
[root@VM_0_10_centos keepalived]# /usr/local/nginx/sbin/nginx -s reload
[root@VM_0_10_centos keepalived]# /etc/init.d/keepalived restart
这里使用ip a查看vip、地址,并没有显示

解决:将keepalived.conf文件中的virtual_router_id参数设置成其它即可,如:79、89、101。只要取值范围在取值0-255就行。(我这里是改为了79,上面配置文件中也已修改)
然后重启keepalived服务即可

2)查看backup服务的vip地址(目前是没有的)

我们将master服务的keepalived服务停止,看下backup主机的vip地址是否漂移过去
[root@VM_0_10_centos keepalived]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl): [ OK ]
master主机的vip地址已经没有了

在backup主机上查看,此时从服务已经接管

参考博客
https://blog.csdn.net/u012599988/article/details/82152224
https://blog.csdn.net/weixin_30354675/article/details/99052381
https://www.cnblogs.com/kevingrace/p/6143977.html
【nginx+keepalived】nginx+keepalived搭建高可用的更多相关文章
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇
原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...
- Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
周末的时候一个正在学Linux的朋友问我,高可用怎么玩?我和他微信了将近三个小时,把Nginx和haproxy双主高可用教给他了,今天突然想把这个给写进博客里,供给那些正在学习Linux系统的朋友们, ...
- Keepalived+Nginx+tomcat实现系统的高可用
Keepalived+Nginx+tomcat实现系统的高可用 1:安装vmware虚拟机 2:安装linux系统,我自己下载的centos6.5 3:安装JDK,tomcat 解压tomcat到/u ...
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...
- 在CentOS上使用Nginx和Tomcat搭建高可用高并发网站
目录 目录 前言 创建CentOS虚拟机 安装Nginx 安装Tomcat 安装lvs和keepalived 反向代理 部署网站 搭建数据库 编写网站项目 解决session一致性 注意 参考资料 前 ...
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
- Keepalived+HAProxy 搭建高可用负载均衡
转载自:https://mp.weixin.qq.com/s/VebiWftaRa26x1aA21Jqww 1. 概述 软件负载均衡技术是指可以为多个后端服务器节点提供前端IP流量分发调度服务的软件技 ...
- LVS+Keepalived搭建高可用负载均衡
应用环境: LVS负责多台WEB端的负载均衡(LB):Keepalived负责LVS的高可用(HA),这里介绍主备模型. 测试环境: 配置步骤: 1. 安装软件 在LVS-1和LVS-2两台主机上安装 ...
- 通过LVS+Keepalived搭建高可用的负载均衡集群系统
1. 安装LVS软件 (1)安装前准备操作系统:统一采用Centos6.5版本,地址规划如下: 服务器名 IP地址 网关 虚拟设备名 虚拟ip Director Server 192.168 ...
随机推荐
- myBaits持久性框架
动态 SQL 博客交流群:1018996617 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL ...
- 关于C# 语言
C# 语法高度重视表达,但学习起来也很简单轻松. 任何熟悉 C.C++ 或 Java 的人都可以立即认出 C# 的大括号语法. 通常情况下,了解上述任何一种语言的开发者可以在很短的时间内就开始使用 C ...
- 解决failed to push some refs to 'git@github.com:TQBX/GIT-Github-.git'问题
解决以下问题问题: git pull origin master --allow-unrelated-histories 进入vim界面->ESC->:wq 重复第一步->git p ...
- numpy和matplotlib下载中出现的问题
在安装numpy的时候遇到如下所示的错误: 经过几个小时的查找,最终发现是pygame的路径不对导致.将pygame的具体路径加上后,问题解决.实施如下:得出一个结论:路径很重要,千万得小心哦. 报错 ...
- linux bash编程之函数和循环控制
函数:实现独立功能的代码段 函数只有在调用时才会执行 语法一: function F_NAME{ 函数体 } 语法二: F_NAME() { 函数体 } 函数的返回值: 默认函数返回值:函数执行状态返 ...
- 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同
原文链接:http://www.cnblogs.com/xiaoyou2018/p/10677437.html Windows server 2012 R2 解决"无法完成域加入,原因是试图 ...
- 【Android - 自定义View】之View的draw过程解析
draw(绘制)过程的作用是将View绘制到屏幕上面.View中有 draw() 方法和 onDraw() 方法,但onDraw()方法是空方法:ViewGroup中没有draw()方法,也没有onD ...
- Docker 更换国内的Hub源
前言 通常情况下,安装的Docker默认使用的是国外的Hub源,在pull镜像的时候很慢,甚至超时了,不动了,很烦人. 更换阿里云Docker的Hub源 阿里云 - 容器Hub服务控制台:https: ...
- Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)
1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. 安装 swoole 拓展包 安装 redis 拓展包 安装 la ...
- Linux常用基本命令 (逐步添加)
Linux jobs命令 fg , bg , jobs , & , ctrl + z都是跟系统任务有关 一.&命令 用在一个命令的最后,可以把这个命令放到后台执行 二.Ctrl + z ...