nginx高级

一、 分布式与集群的区别

分布式:
	在互联网公司,把一个大的项目拆分成n个多个小项目,(模块化开发)
	如商城项目会拆分成会员系统、订单系统、支付系统等其他。
	在分布式中会涉及到
		面向接口开发、子项目进行通讯、RPC远程调用技术
		SpringCloude、Doubbo、HttpClient。
		最后分布式是将项目拆分成n个小项目,最后组合一个大项目。
集群:
	就是减去单台服务器的压力,将一个项目部署在多个不同服务器中,
	目标是共同完成一件事。减轻单台服务器的压力---解决了高并发问题。

二、nginx在linux下的安装

安装步骤:
	1、将nginx需要的依赖包上传到目录  /usr/local   下
	
	2、在/usr/local目录下先解压pcre库  命令      
	     tar -zxvf pcre-8.36.tar.gz
	 3、再进行编译:命令    ./configure
	     如果报这个错:说明这个缺少C++
		configure: error: You need a C++ compiler for C++ support.
		解决办法:
		yum install -y gcc gcc-c++  云编译一下
	  4、然后make 再make install 安装完成这个pcre 库
	  5、再安装zlib库:
	  		先解压zlib库: tar -zxvf zlib-1.2.8.tar.gz 
	  		然后再进入 zlib目录下:
			编译:输入命令  ./configure
					   再make
					   再make install
	    6、再安装ssl
	    	  先解压 openssl-1.0.1j.tar.gz文件
	    	   tar -zxvf openssl-1.0.1j.tar.gz
	    	  再进入 openssl-1.0.1j 目录输入命令
			  这里输入的是  ./config
			  					再 make
			  					再 make install
		7、安装nginx
			$ cd /usr/local/
			$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
			$ tar -zxvf nginx-1.8.0.tar.gz
			$ cd nginx-1.8.0  
			$ ./configure --prefix=/usr/local/nginx 
			$ make
			$ make install

安装常见错误:
Nginx启动提示找不到libpcre.so.1解决方法
如果是32位系统
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib
如果是64位系统
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib64
然后在启动nginx就OK了
[root@lee ~]# /usr/local/webserver/nginx/sbin/nginx

安装完成启动nginx后访问到界面说明启动成功

分布式nginx缓存配置优化 nginx分布式集群_redis

三、nginx和keepalived实现高可用

使用nginx搭建一主一备,多主多备,一主多备。
主nginx要与备机ngnix要在同一个局域网里面。

分布式nginx缓存配置优化 nginx分布式集群_spring_02

keepalived拥有故障转移和自动重启。
nginx如果宕机后的流程。

nginx和keepalived服务器高可用环境搭建

主和备都要安装keepalived才能共同虚拟出个ip出来

分布式nginx缓存配置优化 nginx分布式集群_redis_03

搭建keepalived步骤:
	1、先解压文件:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
	2、云安装一个包
	yum install -y openssl openssl-devel(需要安装一个软件包)
	3、进行编译
	cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
	4、安装
		make & make install
		
	5、将 keepalived安装成Linux系统服务
	首先创建文件夹,将keepalived配置文件进行复制:
	mkdir /etc/keepalived
	cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
	然后复制keepalived脚本文件:
	cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
	cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
	ln -s /usr/local/sbin/keepalived /usr/sbin/
	ln -s /usr/local/keepalived/sbin/keepalived /sbin/
	可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!

注意在配置keepalived每个虚拟路由的ip地址都是不同的。
将准备好的keepalived.conf文件和重启nginx脚本,放到目录
etc/keepalived下面。

分布式nginx缓存配置优化 nginx分布式集群_redis_04

查看当前的网段命令 ip a

分布式nginx缓存配置优化 nginx分布式集群_redis_05

分布式nginx缓存配置优化 nginx分布式集群_spring_06


分布式nginx缓存配置优化 nginx分布式集群_redis_07

分布式nginx缓存配置优化 nginx分布式集群_分布式nginx缓存配置优化_08

注意keepalived一主一备的节点id配置要是一样的才能成功。keepalived挂了自动转发到备机。

如果当前的keepalived挂了,就会自动转到备的keepalived连的nginx上面去。
如果当前的nginx挂了 keeplived没有挂,是不会转到备机上面去。
因为keepalived只是重启挂的的服务,nginx挂了,没有重启成功,
keepalived就会发送报警邮件给运维人员了。而不是转到备机上去

如果当前nginx挂了,keepalived就会进行重启,同时用户如果访问当前网站,
就会自动转发到备nginx上去,
直到主keepalived重启nginx成功的时候才会转到主上去。

所以说keepalived作用:故障转移,重启的作用。

注意如果不能执行脚本文件,说明脚本文件没有授权:
命令:
chmod 777 *.sh /etc/keepalived/nginx_check.sh

四、Session共享问题解决方案

session共享有哪些解决方案?
答:1、使用spring-session+redis解决(最好的解决方案)
		2、使用负载均衡策略ip绑定 (就失去了做集群的意义)
		3、使用cookie (不安全)
		4、使用数据库存放 (对数据库压力大)
		5、tomcat配置session共享(占用内存)

sesssion共享问题示例:

分布式nginx缓存配置优化 nginx分布式集群_redis_09


分布式nginx缓存配置优化 nginx分布式集群_分布式nginx缓存配置优化_10

这就是session共享问题,因为session只会存放在JVM内存中,
集群的话多个JVM之间不会共享

HttpSession session = request.getSession(true) 代码问题:
要设置成false,表示没有也不会新创建

分布式nginx缓存配置优化 nginx分布式集群_redis_11

使用redis解决session共享问题:
key=sessionKey
value = sessionValue
如果访问到某个服务器就会自动从session取出当前存放的sessionId

使用框架spring-session+redis解决session共享问题。原理就跟redis解决方案
一样,框架都封转好了。
<!-- 使用spring-session+redis 解决session共享问题 -->
		<!--spring boot 与redis应用基本环境配置 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-data-redis</artifactId>
		</dependency>
application.properties文件:
#设定端口号
server.port: 8080

#redis 定义的变量
redis.hostname=127.0.0.1
redis.port=6379
redis.password=123456
#redis配置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=5000

SessionConfig.java

package com.leeue.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

//这个类用配置redis服务器的连接
//maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {

	// 冒号后的值为没有配置文件时,制动装载的默认值
	@Value("${redis.hostname}")
	String HostName;
	@Value("${redis.port}")
	int Port;
	@Value("${redis.password}")
	String password;

	@Bean
	public JedisConnectionFactory connectionFactory() {
		JedisConnectionFactory connection = new JedisConnectionFactory();
		connection.setPort(Port);
		connection.setHostName(HostName);
		connection.setPassword(password);
		return connection;
	}
}

初始化这个框架SessionInitializer.java

package com.leeue.controller;

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
    public SessionInitializer() {
        super(SessionConfig.class);
    }
}
这样一配置就会自动的去加载文件。然后加载spring-session框架和连接redis

怎么解决服务器重启后,session失效的问题?
答:使用redis持久化,存放在本地。

五、高并发解决方案总结

吞吐量:什么时间返回结果。
高并发解决方案:想到高可用 
从:
	数据库方面
		1、慢查询定位sql语句
		2、sql语句优化
		3、减少全表扫描
		4、使用索引(注意索引事项)
		5、分表分库(水平+垂直分割)
		6、水平分割、取模算法
		7、主从复制、mysql集群。
				要谈主从复制原理是通过二进制日志文件来实现的
		8、读写分离  使用mycat
	缓存机制:
		1、使用redis,缓存数据库的内容
		2、使用主从复制,做redis的集群
		3、使用redis的哨兵机制监听
		4、使用redis的读写分离
	服务器
		1、反向代理、配置负载均衡、集群、CDN加速。
	客户端:
		1、减少请求,用户体验好最好使用ajax异步加载、动静分离
		
	项目环境
		1、代码重构
		2、jvm调优:垃圾回收机制、老年代、新生代。配置jvm参数配置
		3、垃圾回收机制有哪些算法。
	项目采用微服务和分布式架构