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和keepalived实现高可用
使用nginx搭建一主一备,多主多备,一主多备。
主nginx要与备机ngnix要在同一个局域网里面。
keepalived拥有故障转移和自动重启。
nginx如果宕机后的流程。
nginx和keepalived服务器高可用环境搭建
主和备都要安装keepalived才能共同虚拟出个ip出来
搭建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下面。
查看当前的网段命令 ip a
注意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共享问题示例:
这就是session共享问题,因为session只会存放在JVM内存中,
集群的话多个JVM之间不会共享
HttpSession session = request.getSession(true) 代码问题:
要设置成false,表示没有也不会新创建
使用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、垃圾回收机制有哪些算法。
项目采用微服务和分布式架构