文章目录
一、基础概念
- nginx:高性能的HTTP和反向代理服务器、支持
热部署
、高并发
、反向代理
、负载均衡
、动静分离
- 正向代理:客户端配置一个代理服务器,从而直接访问浏览器,这种方式即称为正向代理。
- 反向代理:客户端访问代理服务器,代理服务器直接去目标服务器访问获取数据后,访问给客户端。即客户端间接访问目标服务器,这种方式称为反向代理。
- 负载均衡:将集中访问单个服务器的请求,分发到不同的服务器上,即负载均衡。
- 动静分离:将动态资源(如jsp/servlet)和静态资源(css、htms、js)分开部署,即为动静分离。
- 简单架构图:
二、nginx安装、常用命令和配置文件
参考https://blog.csdn.net/weixin_40496191/article/details/121028500
三、常用命令
- 查看版本:
./nginx -v
- 启动:
./nginx
- 关闭:
./nginx -s stop
- 重新加载:
./nginx -s reload
四、nginx配置文件
- 查看配置文件路径:
whereis nginx.conf
-->/usr/local/nginx/conf nginx
的配置文件组成
(1)全局块:nginx运行的配置参数,如并发量worker_processes
(2)events块:nginx与用户的网络连接,如支持的连接数worker_connections
(3)http块:文件引入、MINE-TYPE定义、日志自定义、连接超时时间、单链接请求上限等
(4)server块:一个http块可以有多个server块,每个server相当于同一台虚拟主机。
五、nginx配置反向代理
- 准备一个简单的springboot项目并且部署,默认端口8081。推荐使用docker,因为不需要配置环境变量。可参考:https://blog.csdn.net/weixin_40496191/article/details/122714245
- 简单配置反向代理,将请求80端口地址做一个转发(ip:192.168.248.10)
访问:http://192.168.248.10:80
结果:http://192.168.248.10:8081 - 实现端口不同路径,转发不同地址
访问:http://192.168.248.10:801/test01/index/index、http://192.168.248.10:801/test02/index/index
结果:http://192.168.248.10:8081/index/index、http://192.168.248.10:8082/index/index - 地址匹配分析(80端口)
location /js/ {
proxy_pass 192.168.248.10:8081/;
}
访问:http://192.168.248.10:80/js/index
结果:http://192.168.248.10:8081/index
location /js/ {
proxy_pass 192.168.248.10:8081;
}
访问:http://192.168.248.10:80/js/index
结果:http://192.168.248.10:8081/js/index
location /js/ {
proxy_pass 192.168.248.10:8081/js/;
}
访问:http://192.168.248.10:80/js/index
结果:http://192.168.248.10:8081/js/index
location /js/ {
proxy_pass 192.168.248.10:8081/js;
}
访问:http://192.168.248.10:80/js/index
结果:http://192.168.248.10:8081/jsindex
六、nginx配置负载均衡
- 配置
访问:http://192.168.248.10:80/index/index
结果:http://192.168.248.10:8081/index/index、http://192.168.248.10:8082/index/index轮询 - 分配服务器策略
(1)简单轮询(默认):即轮流平均分配,某个服务宕机,则自动剔除。如上
(2)balance权重:即可以自己配置每台服务器的分配权重,即效率性能好的服务器分配的权重越高,则被访问的次数也会越多
(3)ip_hash方式:每个请求按照ip分配,即每个ip只会固定的访问一个后端服务,可以解决session问题。
(4)upstream-fair方式:按照时间响应长短的方式进行分配,响应时间越短,则分配越多。(未调通,尴尬)
(5)url_hash方式:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。(未调通,尴尬)
六、nginx配置动静分离
- 静态文件配置:新建文件夹mkdir /data/js,然后放入jquery.min.js,配置文件
访问:http://192.168.248.10:803/js/jquery.min.js
结果:http://192.168.248.10:803/data/js/jquery.min.js - 动静分离实例:正常我们会将静态资源后缀的文件统一进行转发,如下
访问:http://192.168.248.10:804/jquery.min.js
结果:http://192.168.248.10:804/data/js/jquery.min.js - 静态文件下载(可用于不上传只下载的附件)
location /upload {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
try_files $uri $uri/ /index.html;
root /file/;
index index.html index.htm;
}
下载实例:http://192.168.248.10:804/upload/file/下载文件
七、nginx配置高可用集群
ps:这种集群方式不建议话太多时间学习。因为集群有成熟的技术栈,如Nacos
、Eureka
、Zookeep
等。
- 准备两台虚拟机:直接克隆第一台虚拟机 (
192.168.248.10
,192.168.248.11
) - 两台虚拟机都安装keepalived:yum install keepalived -y。
- 验证:rpm -q -a keepalived监测是否成功安装
- 修改配置: vi /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.1
smtp_connect_timeout 30
router_id LVS_DEVEL10
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx
{
script "/etc/keepalived/keepalived_check.sh"
interval 3 #监测脚本时间间隔
weight -20
}
#虚拟ip配置
vrrp_instance VI_1 {
state MASTER #//主备配置为MASTER----BACKUP
interface ens33 #网卡eth0
virtual_router_id 51 #主备的virtual_router_id必须相同
priority 100 #主备取不同优先级,主比备大
advert_int 1 #主服务器组播包发送间隔时间
authentication { #主备主机之间的认证表示信息
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx #监控脚本
}
virtual_ipaddress { #设置虚拟ip地址信息
192.168.248.100
}
}
}
从服务器:
! 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.1
smtp_connect_timeout 30
router_id LVS_DEVEL11
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx
{
script "/etc/keepalived/keepalived_check.sh"
interval 3 #监测脚本时间间隔
weight -20
}
#虚拟ip配置
vrrp_instance VI_1 {
state BACKUP #//主备配置为MASTER----BACKUP
interface ens33 #网卡eth0
virtual_router_id 51 #主备的virtual_router_id必须相同
priority 90 #主备取不同优先级,主比备大
advert_int 1 #主服务器组播包发送间隔时间
authentication { #主备主机之间的认证表示信息
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx #监控脚本
}
virtual_ipaddress { #设置虚拟ip地址信息
192.168.248.100
}
}
}
keepalived_check.sh
脚本
#! /bin/bash
# 统计nginx 进程是否存在
A=`ps -C nginx --no-header|wc -l`
# 为0 表示nginx 停止来
if [ $A -eq 0 ];then
# 尝试重启nginx
/usr/local/nginx/sbin/nginx
sleep 1
# nginx 重启失败,则keepalived自杀,进行vip转移
A=`ps -C nginx --no-header|wc -l`
# 为0 表示nginx 停止来
if [ $A -eq 0 ];then
# 杀死keepalived,vip转移到另一台机器
killall keepalived
fi
fi
- 将
keepalived_check.sh
脚本放入/etc/keepalived/
目录下,添加权限:chmod u+x keepalived_check.sh
ps:如果是window编辑的脚本,需要处理下,否则会报错–>坏的解释器: 没有那个文件或目录
处理:sed -i 's/\r$//' keepalived_check.sh
(两台都要) - 启动
nginx
和keppalived
:cd /usr/local/nginx/sbin
-->./nginx
-->systemctl start keepalived.service
(两台都要) - 查看主服务器:
ip a
。(192.168.248.10
)
- 访问虚拟ip:http://192.168.248.100:802/index/index
- 停止主服务器的
nginx
:cd /usr/local/nginx/sbin
-->./nginx stop
- 查看从服务器:
ip a
(192.168.248.11
)
- 访问虚拟ip:http://192.168.248.100:802/index/index成功
- 恢复主服务器的nginx,则虚拟ip将会跳回到主服务器。