nginx
nginx简介
Tomact:web应用服务器
Nginx:web服务器,性能高,并不是代替Tomact。其主要作用是:反向代理、负载均衡、动静分离。
安装
1、上传安装包到opt目录下
2、解压安装包
tar -zxvf zlib-1.2.8.tar.gz
tar -zxvf pcre-8.37.tar.gz
tar -zxvf openssl-1.0.1t.tar.gz
tar -zxvf nginx-1.17.1.tar.gz
3、安装zlib
cd zlib-1.2.8/
./configure
make && make install
4、安装pcre 正则解析模块
cd /opt/pcre-8.37/
./configure
make && make install
5、安装openssl 加密传输数据模块
cd /opt/openssl
./config
make && make install
6、安装nginx
cd /opt/nginx
./configure
make && make install
7、启动nginx
nginx安装后启动命令在:
/usr/local/nginx/sbin/nginx
查看是否启动成功:
```
ps -aux|grep nginx
```
8、在浏览器中访问nginx:
nginx启动时默认监听的端口号为80
注意关闭虚拟机防火墙。
systemctl stop firewalld.service
nginx的使用
nginx的命令:
启动: /usr/local/nginx/sbin/nginx
停止:/usr/local/nginx/sbin/nginx -s stop
重新加载nginx配置文件: /usr/local/nginx/sbin/nginx -s reload
修改nginx命令可以在任意位置直接执行:
方式1:在/etc/profile中的path变量后面拼接nginx的sbin目录到path中
方式2:可以将nginx的命令拷贝到现有的PATH变量的路径下
拷贝/usr/local/nginx/sbin/nginx到/usr/local/bin下
cp /usr/local/nginx/sbin/nginx /usr/local/bin/
启动
nginx
关闭
nginx -s stop
创建测试项目:
1、选择创建springboot项目:
2、创建完毕后的目录结构
3、在主程序的目录下创建子目录controller并创建HelloController
@Controller
public class HelloController {
// 如果配置文件中配置了端口号,可以通过@Value注解读取属性值
@Value("${server.port}")
Integer port;
// 处理/hello请求返回当前项目的端口号
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "hello,访问项目的端口号为:"+port;
}
}
4、在项目的resources目录下的application.properties文件中设置端口号参数
5、启动项目并访问
1. 反向代理
使用nginx服务器代理运行的tomcat服务器
用户访问nginx时,请求会被交给tomcat服务器处理
tomcat服务器:http://192.168.200.1:8081/hello
nginx服务器:http://192.168.200.130:80
修改nginx的配置:添加反向代理
vim /usr/local/nginx/conf/nginx.conf
# 如果访问的路径没有更合适的location块匹配,就会由当前配置匹配
# 如果浏览器访问 http://192.168.200.130:80/dsa,nginx当前location块会匹配处理
# nginx会将端口号后面的所有的字符串和 proxy_pass的值进行拼接 再访问
location / {
# 反向代理
proxy_pass http://192.168.200.1:8081;
proxy_connect_timeout 30;
}
重新加载nginx配置文件:
nginx -s reload
在浏览器中访问nginx+要访问项目的资源地址测试
请求是交给nginx的,但是最终是主机处理请求的。
location语法:
1、= :精确匹配
location = /a/b {
# 反向代理
proxy_pass http://192.168.1.1:8081;
proxy_connect_timeout 30;
}
当浏览器访问地址完全=location的表达式时,才会被匹配
http://192.168.1.168/a/b/c 不匹配
2、没有修饰符,必须以指定的模式开始才会被匹配
location /a/b {
# 反向代理
proxy_pass http://192.168.1.1:8081;
proxy_connect_timeout 30;
}
http://192.168.1.168/a/b> 匹配
http://192.168.1.168/a/B <http://192.168.1.168/a 不匹配
3、~ 必须和正则表达式匹配并区分大小写
location ~ ^/a/b$ {
# 反向代理
proxy_pass http://192.168.1.1:8081;
proxy_connect_timeout 30;
}
http://192.168.1.168/a/bc http://192.168.1.168/a/b/c 不匹配
http://192.168.1.168/a/b <http://192.168.1.168/a/b?id=1 匹配
4、~* 表达式有正则,不区分大小写匹配
location ~* ^/a/b$ {
# 反向代理
proxy_pass http://192.168.1.1:8081;
proxy_connect_timeout 30;
}
http://192.168.1.168/a/b> <http://192.168.1.168/a/b?id=1 匹配
http://192.168.1.168/A/B> <http://192.168.1.168/A/b?id=1 匹配
5、^~ 反正则,指定前面正则匹配到的某些特例路径不要被正则匹配到
2. 负载均衡
nginx配置负载均衡
# 声明负载均衡模块
upstream myservers{
server 192.168.1.1:8081;
server 192.168.1.1:8082;
server 192.168.1.1:8083;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 如果访问的路径没有更合适的location块匹配,就会由当前配置匹配
# 如果浏览器访问 http://192.168.1.168:80/dsa,nginx当前location块会匹配处理
# nginx会将端口号后面的所有的字符串和 proxy_pass的值进行拼接 再访问
location / {
# 反向代理
# 使用负载均衡模块
proxy_pass http://myservers;
proxy_connect_timeout 30;
}
配置springboot项目多实例启动
测试负载均衡
重启nginx
在浏览器中访问nginx时请求会以轮询的方式交给负载均衡模块的三个tomcat服务器处理
负载均衡的策略
默认:轮询
每个服务器处理一次
# 声明负载均衡模块
upstream myservers{
server 192.168.1.1:8081;
server 192.168.1.1:8082;
server 192.168.1.1:8083;
}
加权轮询
按照权重比例分配处理请求的次数
# 声明负载均衡模块
upstream myservers{
server 192.168.1.1:8081 weight=1;
server 192.168.1.1:8082 weight=2;
server 192.168.1.1:8083 weight=2;
}
备机模式backup
如果主机还在备机不会处理请求,如果主机宕机备机会自动上位
# 声明负载均衡模块
upstream myservers{
server 192.168.1.1:8081 weight=1;
server 192.168.1.1:8082 weight=2;
server 192.168.1.1:8083 backup;
}
hash模式
ip_hash:
根据请求用户的ip地址进行hash计算决定哪个服务器处理本次请求
url_hash
根据用户访问的url地址进行hash计算决定访问那个服务器
fair模式
nginx将请求交给目标服务器处理之前会ping所有的服务器,哪个响应快哪个处理本次请求
3. 动静分离
nginx处理请求的速度快,如果请求访问的是静态资源ngixn可以直接处理提高响应速度
nginx没有办法执行java程序。所以访问动态资源[jsp、需要权限验证的资源、controller…]必须交由tomcat处理
在虚拟机的nginx中准备静态资源:
打开finalshell,在虚拟机的/usr/local/nginx家目录下创建 static目录
再到static下创建 resources 目录用来存放所有的静态资源
在resources下创建imgs、css、js目录并在目录下准备对应的资源
静态资源都存在 nginx家目录/static/resources目录下
配置nginx实现静态资源的代理:
# 静态资源的匹配配置
# 当浏览器访问http://192.168.1.168:80/resources/xxxxx/xx时 nginx当前location会匹配到
# 然后使用基准地址 nginx家目录/static和 端口号后的字符串拼接查找该资源
# /usr/local/nginx/static/resources/xxxxx/xx
location /resources{
root static;
}
nginx-master-worker机制
nginx处理用户请求时采用了master-worker机制
master负责接收请求管理所有的worker
当有请求访问nginx时,nginxmaster接收到请求就通知所有的worker
worker们来争抢请求,抢到后处理该请求
worker出现异常退出也不会影响master,master会重新在启动一个worker来替代出异常停止的worker
配置文件
# 指定nginx启动时worker的数量
# worker类似redis,一个worker对应一个进程,进程中值运行了一个主线程用来通过异步非阻塞的方式处理请求,可以将一个CPU的性能发挥到极致,设置worker时最好数量和cpu的核心数一样
worker_processes 12;
events {
# 每个worker的最大连接数 ,连接指的是读写操作的连接,读对应一个连接,写对应一个连接
# 访问nginx代理的静态资源时,worker需要两个连接, 访问nginx代理的动态资源时,worker需要四个连接
# 最大连接数的值不是越大越好,硬盘的IO速度是有限,系统对硬盘的连接数也有限制,默认一个线程最多可以对硬盘建立1024个连接
worker_connections 1024;
}
# 计算nginx当前的最大的并发数量
# worker_processes*worker_connections/4 ~ worker_processes*worker_connections/2
nginx-keepalived高可用
1、克隆虚拟机准备一个master和backup
1.1 先克隆一个master:要修改ip地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADD="192.168.200.140"
service network restart
1.2 在master中安装nginx:
先上传课件中的nginx的压缩文件到虚拟机的/opt目录下
再解压缩nginx所有的安装包
tar -zxvf zlib-1.2.8.tar.gz 举个例子
逐个安装
cd zlib-1.2.8/
./configure
make && make install
如果报错:表示c语言和c++的环境没有安装,需要安装
可以在线安装:
yum install -y gcc
yum install -y gcc-c++
然后再参考nginx的安装步骤逐个安装
要想输入nginx直接启动,则应 cp /usr/local/nginx/sbin/nginx /usr/local/bin/
查看nginx是否启动: ps -aux|grep nginx
停止nginx:nginx -s stop
1.3 安装keepalived:参考课件,基本如下
1.3.0
tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src/
yum install -y openssl openssl-devel
cd /usr/local/src/keepalived-1.4.2/
./configure --prefix=/usr/local/keepalived
make && make install
1.3.1初始化配置及启动测试
1 配置:
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/local/bin/
cp /usr/local/src/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
2 启动、关闭、重启、查看状态
service keepalived start|stop|restart|status
1.3.2、准备备机
1 克隆 192.168.1.129 创建 backup备机
先停止129 master
2 重置网卡mac地址
3 关闭主机(避免ip冲突)并修改备机ip为: 192.168.200.141
1.3.3、主备模式:
1 主备配置文件修改
1、主服务器 vim /etc/keepalived/keepalived.conf
删除配置文件14行的严格模式:vrrp_strict:
20行的网卡绑定修改为ens33:interface ens33
21行定义了一组keepalived,22行决定了一组中master的优先级:master优先级一定要最大
28行VIP的配置,VIP地址一定要和网卡的网段一样:地址不可以和其他的虚拟机ip冲突
virtual_ipaddress {
192.168.200.111
}
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.140
smtp_connect_timeout 30
router_id nginx_master
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#检测脚本定义
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2 # 脚本执行的间隔
weight 2 # 权重等级
}
vrrp_instance VI_1 {
state MASTER # 主机master,备机backup
interface ens33
virtual_router_id 51 # master 和backup在同一个虚拟路由里,id 号必须相同
priority 100 # 主备级别,主机要比备机的值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111 # keepalived提供的虚拟地址供外界访问[必须和主备机网段相同,ip值不同]
}
}
2、从服务器 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.141
smtp_connect_timeout 30
router_id nginx_backup
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#检测脚本定义
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2 # 脚本执行的间隔
weight 2 # 权重等级
}
vrrp_instance VI_1 {
state BACKUP # 主机master,备机backup
interface ens33 #网卡名不能写错
virtual_router_id 51 # master 和backup在同一个虚拟路由里,id 号必须相同
priority 90 # 主备级别,主机要比备机的值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111 # keepalived提供的虚拟地址供外界访问[必须和主备机网段相同,ip值不同]
}
}
3、主备服务器创建相同的检查脚本文件
vim /etc/keepalived/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
给nginx_check脚本设置可执行的权限: chmod 777 /etc/keepalived/nginx_check.sh
4、配置完信息后在主备机中分别启动nginx 和 keepalived
/usr/local/nginx/sbin/nginx
service keepalived start
查看keepalived是否启动成功
service keepalived status
测试
修改主备nginx的index.html页面显示内容区分主备
vim /usr/local/nginx/html/index.html
访问keepalived地址:http://192.168.1.111:80
2、主备测试
当主服务器keepalived和nginx还正常运行时,主服务器的 ens33 网卡地址是VIP地址,从服务器不是
浏览器访问192.168.200.111,访问的是MASTER Nginx
当把主服务器的 nginx 和 keepalived 停止服务2秒钟后
从服务器ens33网卡地址是VIP地址
关闭master的keepalived+nginx之后,浏览器访问192.168.200.111,
同样,当主服务器再次打开时,再次访问同样的地址,主机ens网卡绑定VIP地址。
1.3.4、双主模式(了解)
1 主机配置文件
在keepalived.conf最后一行添加
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.112
}
}
2 备机配置文件
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 190
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.112
}
}
3 重启主备的keepalived
执行:ip addr
主备各有一个VIP
4 关闭主机keepalived+nginx测试高可用
5 测试双主模式
启动主备的keepalived和nginx
浏览器访问:
http://192.168.200.111