linux基本命令,Nginx,集群学习笔记

`LInux的引言

​ Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIxUnix多用户,多任务,支持多线程和多CPU的操作系统.

Linux的诞生

20世纪80年代,由于供教学使用的典型操作系统很少,因此在荷兰当教授的美国人AndrewS.Tanebaum编写了一个操作系统,名为MINIX,为了向学生讲述操作系统内部工作原理.MINIX虽好,但只是一个用于教学目的的简单操作系统,而不是一个强有力的使用操作系统,然而最大的好处是代码开源.

在全世界都钻研MINIX源代码来了解操作系统的过程中,芬兰赫尔辛基大学的大二猛男Linus Torvalds在吸收了MINIX精华的急促上,于1991年写出了属于自己的Linux操作系统,版本为Linux0.01,是Linux时代开始的标志.他利用Unix的核心,去除繁杂的核心程序,改写成适用于一般计算机的x86系统.并放在网络上供大家下载.1994年推出完整的核心Version1.0.至此,Linux逐渐成为功能完善,稳定的操作系统,并被广泛使用

总结:Linux出现于1991年,是由芬兰赫尔辛基大学的大二猛男Linus Torvalds和后来加入的众多爱好者共同开发完成

Git也是这个猛男的杰作...

Linux的特点

  • 完全免费
  • 多用户,多任务

Linux注意细节

1 注意:root用户为超级管理员 具有linux系统中最高权限

​ 如果是管理员登陆下载终端显示为:# 普通用户为:$

2 linux中系统中文件管理方式

注意: 在linux系统中没有盘符的概念 linux系统管理文件是以树的形式管理文件,整个系统的根文件为 "/"

3 linux系统中命令的使用

注意:在使用linux系统命令时严格区分大小写

使用命令语法: 命令 [-选项] [参数]

Linux的目录结构

# 目录结构
- 重点
	bin		存放二进制文件
	etc		存放配置文件目录
	usr		存放安装程序
	home	普通用户目录
	root	超级用户目录
	tmp		存放临时文件

linux常用命令(1)

1 查看目录中文件和目录

  • 查看当前目录中的文件和目录 ls .(当前目录不写 默认就是当前目录)
  • 查看当前目录中文件和目录的详细 ls -l
  • 查看当前目录中的所有文件(包含隐藏文件) ls -a
  • 查看当前目录中文件和子目录 ls -R
  • 查看指定目录中文件和目录 ls /(指定目录)
  • 查看文件和目录的命令可以组合使用 ls -la

例如: ls /etc

2 清除当前命令行内容

  • clear 清楚内容

3 切换目录的指令

  • cd 切换的目录
  • pwd (print work directory)展示当前的目录
  • cd /root或者cd ~或者cd回到root的家目录

1 ls命令

# ls 显示文件和目录列表
	常用参数:
	-l(long)  长格式显示文件和目录信息
	-a(all)  显示所有文件和目录
	-R  递归显示指定目录下的文件清单

ls -l长格式说明

[root@iZ8vbcat4c50w7qaxpzpqbZ ~]# ls -l
总用量 20
1    2     3   4   5     6        7        8
-rw-r--r-- 1 root root   22 8月  17 20:06 aa.txt
drwxr-xr-x 2 root root 4096 8月  17 19:25 bb
# 解读
- -rw-r--r--一共10位, 1 9分为2部分信息
	1 第一个信息  1位
		d代表当前类型为目录
		-代表当前类型为文件
	2 第二个信息  9位
		-第一个3位  --代表当前文件创建者的操作权限  r(读) w(写) x(执行)   user
		-第二个3位  --代表当前文件创建者同组的用户对该文件操作权限   group
		-第三个3位  --代表当前文件创建者的不同组用户对该文件操作权限   other
	3 第三个信息  链接数
		一般文件链接数位1
		目录的链接数为2
	4 第四个信息
		当前文件创建者
	5 第五个信息
		当前文件创建者所属的组
	6 第六个信息
		当前文件占用空间大小
	7 第七个信息
		文件的最后一次修改时间
	8 第八个信息
		文件名或目录名

操作文件命令

# cd 切换目录
# pwd 显示当前工作目录(print working directory)
# touch 创建空文件
	当文件存在时修改文件创建时间
# mkdir 创建目录(make directory)
	-p 父目录不存在的情况下先生成父目录(parents)
# cp 复制文件或目录(copy)
	cp 文件名 目录b  ---复制文件->目录
	cp -r 目录名a 目录b  ---复制目录a->目录b
	-r 递归处理,将指定目录下的文件与子目录一并拷贝(recursive)
# mv 移动文件或目录,文件或目录改名(move)
	mv 文件名	新文件名  ---文件改名
	mv 文件名	目录名  ---文件移动
	mv 目录名	不存在目录名  ---目录改动
	mv 目录名	已存在目录名  ---目录移动
# rm 删除文件(remove)
	-r 同时删除该目录下的所有文件(recursive)
	-f 强制删除文件或目录(force)
# rmdir 删除空目录(remove directory)
# cat 显示文本文件内容 (catenate)  用来展示少量内容
# more,less  分页显示内容  q(快速退出)
# head,tail 查看文件的头和尾的内容 (默认展示10行)	head -n 20  ---展示头20行
# tail -f b.log  循环读取(fellow)
	一般常用于看springboot启动日志或者tomcat启动日志
# echo 输出命令
	echo I love you  ---用来向屏幕输出一句话
	echo I love you >> aa.txt  --将这段内容输入到文件中 有内容就文末追加
	

网络相关命令

# ip addr 或者 ip a  查看ip地址
# ping  测试网络连通性

tar命令

# tar 命令	xxx.tar
	-c 建立一个压缩文件的参数指令(create)
	-x 揭开一个压缩文件的参数指令(extract)
	-z 是否需要用 gzip 压缩
	-v 压缩的过程中显示文件(verbose)
	-f 使用档名 在 f 之后要立即接档名(file)
# 常用组合
	# tar -cvf linux.tar aa.txt bb.txt cc.txt   --将aa.txt bb.txt cc.txt打包成linux.tar
	# tar -zcvf linux.tar.gz aa.txt bb.txt cc.txt   --将aa.txt bb.txt cc.txt打包成linux.tar并压缩
	# tar -zxvf linux.tar.gz  --将linux.tar.gz解压缩

systemctl 服务命令

# systemctl
  systemctl status|start|restart|stop 服务名(mysqld firewalld network)
	systemctl status 服务名  --查看某个服务的运行状态
	systemctl start 服务名   --启动某个服务
	systemctl restart 服务名   --重启某个服务
	systemctl stop 服务名   --停止某个服务

进程相关命令

# ps 查询在当前控制台上运行的进程
	ps -aux   --查询系统中所有运行的进程,包括后台进程,其中:
	  - 参数a是所有进程
	  - 参数x包括不占用控制台的进程
	  - 参数u显示当前进程的用户
	ps -ef   --查询系统中所有运行的进程,包括后台进程,而且可以显示出每个进程的父进程号
	ps -aux|grep 进程  服务名  关键字   --搜索进程   (重点)
# top 命令  动态显示系统进程

# kill 杀死进程
	kill 3029   --3029是进程号,一般在执行kill命令之前,先用ps或pstree来查询一下将要被杀掉的进程的进程号
	kill -9 3029   --强制终止3029号进程的运行,其中参数 -9 代表强制的意思

vi命令

# vi / vim是Unix的
	--Linux上最常用的文本编辑器而且功能非常强大

# 底线命令模式
	---------重点----------------
	:set nu   --显示行号
	:set nonu   --取消行号
	gg   --到文本的第一行(命令模式下)
	G   --到文本的最后一行(命令模式下)
	:n   --到文本的第n行
	---------重点----------------
	u   --undo,取消上一步操作
	Ctrl+r   --redo,返回到undo之前
	---------重点----------------
	Shift+zz   --保存退出,与":wq"作用相同
	:q   --退出不保存
	:q!   --强制退出不保存
	:wq   --保存退出
	:wq!   --强制保存退出

软件相关命令

RPM命令

RPMRedHat Package Manager的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放的,现在包括RedHat,CentOS,SUSE等Linux分发版本都有采用,可以算是公认的行业标准,RPM文件在Linux系统中的安装最为简便

# rpm 命令
- 安装 rpm -ivh xxx.rpm
- 卸载 rpm -evh xxx.rpm
- 查询 rpm -qa xxx.rpm
   	常用参数
   	   i:安装应用程序(install)
   	   e:卸载应用程序(erase)
   	   vh:显示安装进度(verbose hash)
   	   U:升级软件包(update)
   	   qa:显示所有已安装软件包(query all)
   	例如:rpm -ivh gcc-c++4.4.7-3.e16.x86_64.rpm  

YUM命令

YUM(全称为 Yellow dog Updater,Modified) 是一个在Fedora和RedHat以及SUSE,CentOS中的Shell前端软件包管理器,基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无需繁琐的一次次下载,安装

例子:
	yum install xxx
	yum remove xxx
	yum update xxx

使用YUM命令必须连接外部网络

用户和组相关命令

# whoami 查看当前用户
# who 查看登录用户
	-q或--count  只显示用户的登陆账号和登陆用户的数量
# exit 退出用户
# 添加/删除组账号:groupadd/groupdel
# 添加用户账号:useradd
	-g 指定组名称  说明:如果创建用户的时候,不指定组名,那么系统会自动创建一个和用户一样的组名
# passwd [用户名] 设置用户密码
# su 切换用户
	su root

权限相关命令

​ Linux文件有3种典型的权限,即 r 读权限, w 写权限,x 执行权限.在长格式输出中在文件类型的后面有9列权限位,实际上这是针对不同用户而设定的. r=4,w=2,x=1

# chmod
- chmod u+rwx,g+rwx,o+rwx  [文件名]
	    字母法:chmod u/g/o/a +/-/= rwx文件
	[u/g/o/a]含义
	    u user   --表示该文件的所有者
	    g group   --表示与该文件的所有者属于同一组(group)者,即用户组
	    o other   --表示其他以外的人
	    a all   --表示这三者都是
	[+-=]含义
		+   --增加权限
		-   --撤销权限
		=   --设定权限
	[r w x]含义
		r   --read,可读取,没有r权限,那么就不能通过ls查看这个目录的内容.
		w   --write,表示可写入,没有w权限,那么就不能在目录下创建新的文件.
		x   --excute,表示可执行,没有x权限,那么久不能通过cd进入这个目录
	[4 2 1]含义
		4   --read
		2   --write
		1   --excute
- chmod 777 [文件名]   --代表文件最高权限

linux安装tomcat

网址:https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz

通过finalShell上传到阿里云上

# 解压缩到 /user/目录中
	# tar -zxvf apache-tomcat-8.5.57.tar.gz -C /usr/
	-C /usr/指定解压缩目录
# 启动tomcat
	# ./bin/startup.sh
# 关闭网络防火墙
	systemctl stop firewalld   关闭网络防火墙
	systemctl disable firewalld   关闭开启自启动(永久关闭)
# 在windows中访问tomcat
	http://xx.yy.z.z:8080
# 关闭tomcat
	在tomcat的bin目录下面使用 ./shutdown.sh
# 修改端口
	在tomcat的conf目录下找到server.xml
	修改其中的端口号

springboot的jar包部署

直接打包运行

条件:安装jdk

  • 上传指定jar到服务器
  • 直接使用java -jar方式运行项目
    • java -jar 项目.jar
      • 这种方式启动项目名和端口都以配置文件中声明的为主

后台运行jar包时会出现nohup: 忽略输入并把输出追加到”nohup.out”或者nohup: 忽略输入重定向错误到标准输出端

解决

执行nohup java -jar do_iptable.jar & 运行jar会提示:nohup: 忽略输入并把输出追加到”nohup.out”

执行nohup java -jar do_iptable.jar >/dev/null & 运行jar会提示:nohup: 忽略输入重定向错误到标准输出端

修改运行方式为:

nohup java -jar 你的springboot工程名称.jar –server.port=端口号 do_iptable.jar >/dev/null 2>&1& 即可。

linux安装mysql

环境准备

# 1 卸载mariadb,否则安装mysql会出现冲突
# 2 执行命令 rpm -qa | grep mariadb
# 3 列出所有被安装的mariadb rpm 包
# 4 执行rpm -e --nodeps mariadb-lib-5.5.56-2.e17.x86_64

安装/改密/卸载具体参考这篇博客:https://www.cnblogs.com/wlwl/p/9686809.html

其中的mysql服务开启用systemctl start mysqld.

重启用systemctl restart mysqld

密码等级问题具体参考这篇博客:https://blog.csdn.net/Hello_World_QWP/article/details/79551789

之前不知道什么原因一直无法开启mysql服务,这回卸了重装之后终于成功了,哭泣..😭

mysql主从复制架构

# 现有架构存在问题
- 	1 单一架构
		整个系统有一个应用服务器和一个数据库服务器对外提供服务架构 称之为单一架构
	2 存在问题
		* 硬件出现问题-->数据全部丢失-->经济损失(至关重要)

# 1 修改mysql的配置文件
	# vim /etc/my.cnf

# 2 分别在配置文件中加入如下配置:
-	mysql(master):
	  	server-id=1 
	  	log-bin=mysql-bin   --开启日志
	  	log-slave-update   --当日志更新的时候,从节点进行更新
	  	slave-skip-errors=all   --当主节点操作有错误,从节点不进行更新
	
-	mysql(slave)
	  	server-id=1
	  	log-bin=mysql-bin
	  	log-slave-update
	  	slave-skip-errors=all
	  
:多个机器的server-id不能一致

# 3 重启mysql服务
	systemctl restart mysqld
# 4 登录mysql检测配置是否生效
	SHOW VARITABLES like 'server_id'
# 5 登录master查看master状态
	showmaster status;
# 6 登录从节点执行
	change master to
	master_host='xxx.yyy.z.w',   --主节点的主机名
	master_user='root',   --数据库的用户和密码
	master_password='123456',
	master_log_file='mysql-bin.000001',   --在第5步的时候查看到的File
	master_log_pos=xxx;   --在第5步的时候查看到的Position
# 7 开启从节点
	start slave;
	stop slave;   --停止从节点
# 8 查看从节点状态
	show slave status\G;
- 注意
	1 出现 Slave_IO_Running:Yes 和 Slave_SQL_Running: Yes 说明成功
	2 如果在搭建的过程中出现错误,可以查看错误日志文件 cat /var/log/mysqld.log

# 9 通过客户端工具进行测试

# 10 关闭主从复制
	stop slave;
  • 如果出现

    Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

    执行如下命令 rm -rf /var/lib/mysql/auto.cnf删除这个文件

    原因:是因为这个库主机是克隆的主库所在的主机,所以auto.cnf文件中保存的UUID会出现重复.


集群 Cluster

  • 什么是集群?

定义:使用一组服务节点同时对系统提供服务的过程称之为集群.

mysql集群之读写分离架构

# 主从复制架构存在的问题
	高并发-->需要多台服务器处理并发请求-->买更多更贵的高性能服务器-->成本太高

# 改进成读写分离架构
	读写分离:将项目中对数据库的 修改请求 和 查询请求 进行不同的数据库处理
	
	读的操作(查询)>>写的操作(增删改)
	
	改进:将读的操作访问从库,写的操作访问主库

mycat

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品

集群中使用mycat

# 1 官网下载mycat
	http://www.mycat.org.cn/
# 2 解压缩mycat压缩包
	tar -zxvf Mycat-server-1.6-release
# 3 配置schema.xml
	一主一从,如下
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/"> 
    <!--定义Mycat的逻辑库,dataNode代表映射真实数据节点-->  
    <schema name="mySchema" checkSQLschema="false" sqlMaxLimit="100" dataNode="myNode"></schema>
    <!--定义Mycat的数据节点  name:名字必须和上面的dataNode值一致  dataHost:映射的真实主机  database:映射的真实的库-->
    <dataNode name="myNode" dataHost="myDataHost" database="myDatabase" />
    <!--定义数据主机  name:名字必须和dataHost保持一致--> 
    <dataHost name="myDataHost" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"> 
        <!--心跳检测-->
        <heartbeat>select user()</heartbeat>
        <!--写节点-->
        <writeHost host="hostM1" url="主节点主机ip:3306" user="root" password="123456">
            <!--从节点1-->
        	<readHost host="hostS1" url="从节点主机一ip:3306" user="root" password="123456"/>
            <!--从节点可以配置多个..-->
			<!--从节点2-->
        	<!--
			<readHost host="hostS1" url="从节点主机二ip:3306" user="root" password="123456"/>
			-->
            <!--从节点3-->
        	<!--
			<readHost host="hostS1" url="从节点主机三ip:3306" user="root" password="123456"/>
			-->
        </writeHost>
    </dataHost>
</mycat:schema>
# 4 编辑server.xml
	修改成如下配置:
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
    <property name="defaultSqlParser">druidparser</property>
    <!--mysql8版本以后可使用utf8mb4,5.x版本必须是utf8-->
    <property name="charset">utf8mb4</property>
</system>
<!--配置用户信息  name:代表登录mycat用户名  password:代表登陆密码-->
<user name="root">
    <property name="password">123456</property>
    <!--指定可以操作的逻辑库-->
    <property name="schemas">mySchema</property>
</user>
</mycat:server>
# 5 启动服务
	进入mycat的bin目录: cd bin
	启动mycat: ./mycat console
	如果用  ./mycat start启动服务,那么日志就得到logs下看
	看到   MYCAT Server startup successfully   代表启动成功

# 测试mycat
	测试前记得关闭mycat服务器的防火墙,并且
	在application.properties修改一下datasource的配置
# 修改
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 改成mycat所在服务器的ip,数据库是mycat的逻辑库
spring.datasource.url=jdbc:mysql://mycat所在服务器ip:8066/mySchema?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# mycat中配置的登录名和密码
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.longda.entity
# 测试service如下
@Service
@Transactional
//如果开启了事务,mycat一定会走master数据库
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao userDao;
    //新增方法
    @Override
	public void save(User user){
        user.setId(23);
        userDao.save(user);
    }
    //查询方法
    @Override
    //所以这里就需要修改一下事务的传播属性位SUPPORTS
    //代表 支持事务 : 有则融入   没有则不开启
    @Transactional(propagation = Propagation.SUPPORTS)
	public List<User> findAll(){
        return userDao.findAll();
    }
}

应用服务集群

# 搭建应用服务器集群存在的问题
-	如何将某一时刻请求均分到后端服务集群中某一个节点?
		负载均衡  Load Balance  相对均衡
		HttpServer(性能低,稳定高)  Nginx(性能高,现在稳定性也不错)
		负载 -->Nginx 反向代理服务器/服务器 --均分-->服务器1/服务器2/服务器3
		Nginx 反向代理(核心) 解决负载均衡问题, 服务器 解决跨域问题/动态资源静态资源分离问题
-   如何实现在应用服务器集群环境中session共享问题
		用户 -->添加购物车请求 -->Nginx -->服务器1
		用户 -->购买请求 -->Nginx -->服务器2 -->重新登录
		用户 -->付款请求 -->Nginx -->服务器3 -->重新登录
		.....
		导致用户永远无法登录
# 解决	
-	  1 tomcat之间session同步
	  不足:
	  	1 技术复杂,必须在同一种中间件之间完成
	  	2 session复制带来的性能损失会快速增加,特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更显著,这使得web应用的水平拓展受限
	  	3 session内容序列化,会消耗系统性能
	  	4 session内容通过广播同步给成员,会造成网络流量瓶颈,即内网瓶颈
	  2 使用redis或cachedb之类的分布式缓存服务器实现session共享   推荐
	  MSM思想    Memcached session Manager
	  	应用服务器接受新请求,将session信息存在cache DB中,当服务器故障时,web服务器(Nginx)会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用.
	  不足:
	  	1 memcache支持的数据结构比较单一
	  	2 memcache的内存必须足够大,否则会出现用户session从Cache中被清楚
	  	3 需要定期的刷新缓存
	  	4 服务器故障时,存在于内存的memcache数据将会丢失
	  RSM思想    Redis session Manager
	  	 结合上面的 MSM 思想,由 redis负责 session 数据的存储,而我们自己实现的 session manager 将负责 session 生命周期的管理。

安装Nginx

# 1 下载Nginx
	http://nginx.org/en/download.html
# 2 安装必要依赖
	yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
# 3 将Nginx上传到linux中,并解压缩
	tar -zxvf nginx-1.11.1.tar.gz
# 4 校验依赖是否缺少
	进入Nginx目录下,执行: ./configure --prefix=/usr/nginx
# 5 编译并且安装到usr目录下面
	make && make install
# 6 启动nginx
	进入/usr/nginx/sbin下
	执行: ./nginx

-   防火墙记得关闭
# 7 测试
	访问主机ip,可以看到nginx欢迎页面
# 8 关闭nginx 
	进入nginx安装目录的sbin目录下执行:
	./nginx -s stop

tomcat伪分布式集群搭建

# 修改tomcat1端口号:(伪分布式)
	vim tomcat1/conf/server.xml,命令修改如下:
- 	<Server port="8001" shutdown="SHUTDOWN">   --关闭端口
-	<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>   --http协议端口
-	<Connector port="10010" protocol="AJP/1.3" redirectPort="8443"/>   --AJP协议端口
# 修改tomcat2端口号:(伪分布式)
	vim tomcat2/conf/server.xml,命令修改如下:
- 	<Server port="8002" shutdown="SHUTDOWN">   --关闭端口
-	<Connector port="8889" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>   --http协议端口
-	<Connector port="10011" protocol="AJP/1.3" redirectPort="8443"/>   --AJP协议端口
# 修改tomcat3端口号:(伪分布式)
	vim tomcat3/conf/server.xml,命令修改如下:
- 	<Server port="8003" shutdown="SHUTDOWN">   --关闭端口
-	<Connector port="8890" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>   --http协议端口
-	<Connector port="10012" protocol="AJP/1.3" redirectPort="8443"/>   --AJP协议端口
# 启动多个tomcat
	tom1/bin/startup.sh
	tom1/bin/startup.sh
	tom1/bin/startup.sh

# 在windows中分别访问tomcat,都看到主页代表启动成功:
	http://tom1Ip:8888/
	http://tom2Ip:8889/
	http://tom3Ip:8890/
# 将多个tomcat配置到nginx的配置文件中
	1. 在server标签上加入如下配置
	upstream tomcat servers {
		server tom1Ip:8888;
		server tom2Ip:8889;
		server tom3Ip:8890;
	}
	2. 将location / 替换成如下配置
	location / {
		proxy_redirect  off;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header Host $http_host;
		proxy_next_upstream http_502 http_504 error timeout invalid_header;
	}

# 启动nginx
	进入nginx目录下的sbin
	执行: ./nginx - c /usr/nginx/conf/nginx.conf(必须是绝对路径)

Nginx负载均衡策略

# 1 轮询
	说明:默认策略,每个请求会按时间顺序逐一分配到不同的后端服务器

# 2 weight 权重
	说明:weight参数用于指定轮询几率,weight的默认值位1,:weight的数值与访问比率成正比
		upstream tomcat servers {
		server tom1Ip:8888 weight=9;
		server tom2Ip:8889 weight=3;
		server tom3Ip:8890 weight=1;
	}	
 -  1 权重越大分配到的要处理的请求越多.2 此策略可以与least_conn和ip_hash结合使用主要用于后端服务器性能不均
 
# ip_hash
-	说明:指定负载均衡器按照基于客户端IP的分配方式,这个方法一定程度上确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题
		upstream tomcat servers {
		ip_hash;  #保证每个访客固定访问一个后端服务器
		server tom1IP:8080;
		......
	}

# 4 least_conn
- 	说明:把请求转发给连接数较少的后端服务器,轮询算法是把请求平均转发给每个后端,使他们的负载大致相同;但是,有些请求占用的时间很长,会导致其他所在的后端负载较高,这种情况下,least_conn这种方式就可以达到更好的负载均衡效果
		upstream tomcat servers {
		ip_hash;  #保证每个访客固定访问一个后端服务器
		server tom1IP:8080;
		......
	}

MSM配置

​ Memcached Session Manager基于memcache缓存的session共享.即 使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用

# 0 准备一个memcached服务

# 1 安装memcached
	yum install -y memcached
 
# 2 启动memcached   -vvv启动日志   --可以开启多个memcached服务
	memcached -p 11211 -vvv -u root
	memcached -p 11212 -vvv -u root
	......

# 3 memcache整合的jar包上传到服务器上并且放入tomcat的lib目录里
	cp *.jar tomcat1/lib
	cp *.jar tomcat2/lib
	cp *.jar tomcat3/lib

# 4 配置tomcat目录中的conf目录中的context.xml(所有tomcat均需配置)
-	<Context>
	<Manager className="de.javakaffee.web.msm.MemcacheBackupSessionManger"
    memcachedNodes="n1:memcached1所在服务器IP:11211,n2:memcached2所在服务器IP:11212,...."  --注意:可以配置多个节点
    sticky="false"
    sessionBackupAsync="false"
    requestUrlIgnorePatern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
	</Context>

# 5 测试
posted @ 2020-08-20 23:27  longda666  阅读(1)  评论(0)    收藏  举报