一.linux 安装 Nginx
安装nginx 前依赖环境
yum -y install gcc 安装gcc,编译依赖gcc环境,已存在可跳过
yum install -y pcre pcre-devel 安装.pcre、pcre-devel,安装nginx需要此库,已存在可跳过
yum install -y zlib zlib-devel nginx使用zlib对http包的内容进行gzip,已存在可跳过
yum install -y openssl openssl-devel openssl安装,,已存在可跳过
安装nginx
wget http://nginx.org/download/nginx-1.9.9.tar.gz 下载nginx压缩包
tar -zxvf nginx-1.9.9.tar.gz 解压缩
cd nginx-1.9.9 进入压缩目录
./configure 配置属性: 如需ssl模块执行 --> ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make & make install 编译 安装
cd /usr/local/nginx 进入安装目录,默认安装到此目录
cd sbin 进入sbin目录
./nginx 启动nginx,浏览器直接输入ip 出现Nginx欢迎页安装完成
如果访问不了,开放防火墙端口
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/rc.d/init.d/iptables save
浏览器输入 ip地址 ,出现如下界面表示配置正常。
安装原参考地址: https://blog.csdn.net/xukongjing1/article/details/83824219
如果安装是使用的 ./configure ,后需要ssl 模块(https:// wss://
),重新执行命令如下,在重新编译安装
安装nginx如需ssl 模块,替换安装nginx 的 ./configure 命令如下
http 配置属性
./configure
ssl 模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
二.Nginx 命令
命令无法运行加 ./ 如:./nginx -s stop
安装目录下的 sbin 目录运行, 如默认地址:cd /usr/local/nginx/sbin
./nginx -h 查看帮助信息
./nginx -v 查看Nginx版本
./nginx 启动 Nginx || start nginx
./nginx -s stop 停用 Nginx
./nginx -s quit 优雅的停用Nginx(处理完正在进行中请求后停用)
./nginx -s reload 重新加载配置,并优雅的重启进程
./nginx -s reopen 重启日志文件
1、Stop 和 quit 停用Nginx的区别
如果一个进程需要10秒钟才能处理完成,直接 stop 可能会造成数据丢失,错误等,而quit 会等待进程处理完成在关闭nginx
2、reload 重新加载配置,无需重新启动nginx
原理:nginx下有多个进程,每当一个进程处理完请求后,
会重新创建一个进程并杀死该进程,重新创建的
进程使用的就是修改过后的配置的。
三.高可用 keepalived
1. 下载keepalived-1.2.18
添加链接描述
提取码:5snn
2. 解压安装
# 1、安装
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ // 解压到 /usr/local/
yum install -y openssl openssl-devel // 需要安装一个软件包,安装nginx已安装过,可跳过
cd /usr/local/keepalived-1.2.18/ // 进入解压目录
./configure --prefix=/usr/local/keepalived // 配置属性
make & make install // 编译安装
# 2、配置为系统服务
# 将keepalived安装成Linux系统服务,
# 因为没有使用keepalived的默认安装路径(默认路径:/usr/local)
# 创建文件夹,将keepalived配置文件进行复制到 **/etc/keepalived/** 下
mkdir /etc/keepalived // 创建目录
cp /usr/local/keepalived-1.2.18/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ // 复制到 /etc/keepalived/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ // 复制到 /etc/keepalived/
ln -s /usr/local/sbin/keepalived /usr/sbin/ // 添加软连接
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
chkconfig keepalived on //可以设置开机启动
到此我们安装keepalived完毕!
3、keepalived 启动停止命令
service keepalived start
service keepalived stop
四. keepalived 配置 Nginx 宕机自启用
1 、创建 Nginx 重启脚本
/etc/keepalived/ 目录下 创建 nginx_check.sh, 并 修改为可写读 权限
在 nginx_check.sh 添加内容
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
脚本说明:
1、检查nginx 是否正常运行,非正常运行则重启,可保证Nginx 永不断线…
2、/usr/local/nginx/sbin/nginx 为 nginx 安装目录下的 /sbin/nginx
2、修改keepalived.conf 配置
目录: /etc/keepalived/ 下修改 keepalived.conf
配置步骤如下:
- 1、 替换为下方脚本内容
- 2、 interface --> 绑定虚拟 IP 的网络接口类型,填写为自己的机器, 如何查看看 4.3 步骤
- 3、 mcast_src_ip --> 主机ip地址, 填写本机ip, 如何查看看 4.3 步骤
- 4、 state --> 决定主从,主节点填写 MASTER,备份节点填写BACKUP(可不编辑)
- 5、配置完成后先执行停止命令, 在执行 启动命令, 可通过 4.4 步骤查看是否配置成功
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #运行脚本,就是nginx宕机以后,自动重启nginx
interval 2 #检测nginx宕机时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER # 需配置 - 决定主从,主节点为MASTER,备份节点为BACKUP
interface eth0 # 需配置 - 绑定虚拟 IP 的网络接口,根据自己的机器填写(一般情况下都是eth0)
mcast_src_ip 172.16.63.255 # 需配置 - 填写本机ip
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
priority 100 # 节点优先级,主节点比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS # 默认账号密码
auth_pass 1111
}
track_script { # 将 track_script 块加入 instance 配置块
chk_nginx # 执行Nginx 监控的服务
}
virtual_ipaddress {
192.168.110.110 # 虚拟ip,也就是最后浏览器服务的ip,也可扩展,用途广泛。可配置多个。
}
}
其他配置说明:
- 检测Nginx是否菪机,是立即重启改节点的Nginx
- 虚拟ip 等于外网映射的内网 Ip,
如 www.ryao.work (域名)–> 47.128.17.66 (外网ip) --> 192.168.110.110(虚拟ip= 原内网ip) - 访问虚拟 ip 如上配置的,访问192.168.110.110 ,自动访问到访问主节点Ip 的80 端口
- 多台 Linux 服务器配置了 keepalived,如果主节点80 端口的Nginx’菪机了,自动访问从节点对应 Ip 80端口的Nginx 服务器
- keepalived 的配置必须在一个路由下才有效
- 80 端口不一定非是Nginx ,也可以配置Tomcat等
3、 linux命令查看网络接口和ip
执行命令
ip a
下方图片-----第一个箭头的地方对应填写 mcast_src_ip
下方图片-----第二个箭头的地方对应填写 interface
4、查询 keepalived 日志, 查看是否监听 nginx 成功
keepalived 的启动和停止都可以在日志中查看到,
如下启动成功会隔断时间一直打印 Apr 1 12:59:44 iz2vcdenuia3gqp8gs4q5wz Keepalived_vrrp[16833]: Process [23236] didn't respond to SIGTERM
,表示正在正常运行和监听 nginx
tail -f /var/log/messages
5、虚拟ip 配置成功查看
配置完成启动 ,执行 ip a
发现除了原有的Ip,另外在出现配置的一条虚拟Ip 的数据
那么 virtual_ipaddress 的虚拟ip就配置成功了, 该 ip 可以提供给别人使用
五. session 共享解决方案
0、session说明
-----Nginx 轮训两个不同Ip的 tomcat服务器,sessionId 是不一样的,
-----每次getSession ,获取不到sessionId 会创建新的session,
-----两台服务器轮训,会导致两台服务器都取不到session里面的值
-----把 getSession 设置成false ,会发现每台tomcat 服务器有自己的session,a服务器和b服务器的session不共享
1、session 解决方案1,ip绑定,不建议
配置说明:一个用户服务第一次访问到的是a服务器,那么它的后续访问就一直是a 服务器了,session 不存在跨服务器问题,但 ip 绑定对集群就没太大意义了,不建议使用
2、session 解决方案2,数据库备份,不建议
session 放数据库一份,session找不到就去数据库找,不建议使用
3、session 解决方案3,cooket,不建议
缺点:安全性差、http请求都需要带参数增加了带宽消耗,不建议
4、session 解决方案4,使用redis 重写session,使用spring-session
-----------session,key放入redis 保存,服务器中取不到session,自动从redis 中取
springboot 集成
pom.xml
<!--spring boot 与redis应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
SessionConfig
配置redis服务器的连接
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:localhost}")
String HostName;
@Value("${redis.port:6379}")
int Port;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
connection.setPort(Port);
connection.setHostName(HostName);
return connection;
}
}
重写session
//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
public SessionInitializer() {
super(SessionConfig.class);
}
}
ok!