目录
1 简介
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
2 安装
(1)必须先安装nginx需要的依赖环境
yum -y install gcc-c++ pcre-devel zlib-devel openssl openssl-devel
2)官网下载nginx压缩包 nginx-1.18.0.tar.gz
(3)把下载的nginx上传到linux系统
(4)创建一个目录作为nginx的安装目录
mkdir /usr/soft/nginx
(5)解压nginx源码文件
tar -zxvf nginx-1.18.0.tar.gz
(6)进入解压后的目录nginx-1.18.0 去指定nginx安装的目录
./configure --prefix=/usr/soft/nginx
(7)编译并执行安装
make # 编译
make install # 安装
(8)启动nginx
/usr/soft/nginx/sbin/nginx # 启动nginx
/usr/soft/nginx/sbin/nginx -s stop # 关闭nginx
/usr/soft/nginx/sbin/nginx -s reload # 重新加载nginx配置 修改了配置文件,就需要重新加载。
/usr/soft/nginx/sbin/nginx -s quit #安全退出
(9)访问 虚拟机ip:80
192.168.187.165:80
出现此界面说明nginx启动成功
2.1 环境变量
①编辑配置文件
vim /etc/profile
②最后一行加入
export NGINX_HOME=/usr/soft/nginx/
export PATH=$PATH:$NGINX_HOME/sbin
③重新加载配置文件
source /etc/profile
④查看是否配置成功
nginx -v
出现 nginx version: nginx/1.18.0 版本信息就是配置成功了
3 反向代理
3.1 正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
3.2 反向代理
其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
3.3 简单实现
(1)准备一台服务器
(2)启动项目
1.编辑nginx.conf配置文件
vim nginx.conf
2. 添加下面内容
server {
listen 82;
server_name localhost;
location /{
#反向代理的服务器ip和端口号
proxy_pass http://192.168.187.165:8080;
}
}
此时访问nginx的82端口就会被反向代理到 http://192.168.187.165:8080;
3.4 区别
正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果实在服务器用,我们用户无感知,就是反向代理。
4 负载均衡
4.1 简单实现
(1)准备两台或以上服务器 (ip地址各不相同)
(2)部署并启动相同的项目
(3)编辑 nginx.conf 配置文件
# 负载均衡配置 集群服务器的ip和端口 weight=2 设置为权重策略
upstream wjq{
server 192.168.187.165:8080 weight=4;
server 192.168.187.100:8080 weight=1;
server 192.168.187.101:8080 weight=2;
}
server {
listen 83;
server_name localhost;
location /{
#反向代理的服务器ip和端口号
proxy_pass http://wjq;
}
}
(4)此时访问nginx的 83 端口并添加项目的访问路径就能实现负载均衡
4.2 负载均衡策略
-
轮询
-
在轮询中,如果服务器down掉了,会自动剔除该服务器。
-
缺省配置就是轮询策略。
-
此策略适合服务器配置相当,无状态且短平快的服务使用。
-
-
权重
-
权重越高分配到需要处理的请求越多。
-
此策略比较适合服务器的硬件配置差别比较大的情况。
-
-
ip_hash
-
依据发出请求的客户端 IP 的 hash 值来分配服务器
-
5 动静分离
5.1 基本介绍
Nginx
动静分离,简单来说,就是动态请求和静态请求分开,也可以理解成使用Nginx
处理静态页面,Tomcat
处理动态页面,动静分离从目前实现角度来讲大致分为两种:
-
纯粹把静态文件独立成单独的域名,放在独立的服务器上(主流推崇的方案)
-
动态跟静态文件混合在一起发布,通过
Nginx
来分开
5.2 动静分离目的
为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,来加快解析速度,提高请求的访问效率,降低原来单个服务器的压力。
5.3 配置
找到Nginx
安装目录,打开/conf/nginx.conf
配置文件
http {
……
server {
listen 80;
server_name 192.168.17.129;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on; // 列出访问目录
}
}
}
上面的配置,就是当请求是以
/www/
开始的,则进入/www/data/
目录下找资源,如果是以/image/
开始的,则进入/image/data/
目录下找资源,同时该路径下配置了一个autoindex on
,当访问/image/
目录时,会列出该目录下的所有文件
5.4 location
location
前缀可以使用正则表达式:
-
/
通用匹配,任何请求都会匹配到 -
=
精准匹配,不是以指定模式开头 -
~
正则匹配,区分大小写 -
~*
正则匹配,不区分大小写 -
^~
非正则匹配,匹配以指定模式开头的location
location前缀可以使用正则表达式:
/通用匹配,任何请求都会匹配到
=精准匹配,不是以指定模式开头
~正则匹配,区分大小写
~*正则匹配,不区分大小写
^~非正则匹配,匹配以指定模式开头的location
location匹配顺序:
-
多个正则,
location
直接按书写顺序匹配,成功后就不会继续往后面匹配 -
普通(非正则)
location
会一直往下,直到找到匹配度最高的(最大前缀匹配) -
当普通
location
与正则location
同时存在,如果正则匹配成功,则不会再执行普通匹配 -
所有类型
location
存在时,=
匹配 >^~
匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
6 高可用
思考:如果nginx服务器突然宕机了怎么办?备用服务器就不失为一个很好的解决办法
在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。
6.1 keepalived
我们可以通过 keepalived 来实现 Nginx 的高可用,keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。Keepalived的作用是检测 web 服务器的状态,如果有一台 web 服务器死机或工作出现故障,Keepalived 将能检测到,并将有故障的 web 服务器从系统中剔除,当web服务器工作正常后 Keepalived 会自动将该 web 服务器加入到服务器群中。这些工作全部都会自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。keepalived 可以理解为一个健康检查的软件。
高可用至少需要 2 台服务器,主备都得装上keepalived,当请求访问主服务器时,备份服务器会一直检查主服务器的状态。
6.2 安装
(1)在线安装
yum install -y keepalived
(2)进入根目录
cd /etc/keepaliced/
vi keepaliced.conf
(3)主服务器和备份服务器的 keepalived 配置文件有一点不同。
下面是主服务器的 keepalived.conf 文件内容,直接替代默认的 keepalived.conf 配置文件即可。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.187.165 #代理的ip地址 主服务器的ip地址。邮件服务器地址
smtp_connect_timeout 30 #超时时间
router_id 192.168.187.165 #代理的ip地址
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #检测脚本存放的路径
interval 2 # 检测脚本执行的间隔,即检测脚本每隔2s会自动执行一次
weight 2 # 权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将 MASTER 改为BACKUP
interface ens33 # 通信端口 通过ip addr可以看到,根据自己的机器配置
virtual_router_id 51
priority 100 #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #心跳间隔,默认为1s。keepalived多机器集群 通过心跳检测当前服务器是否还正常工作,如果发送心跳没反应,备份服务器就会立刻接管
authentication { #服务器之间通信密码
auth type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth pass 1111
}
virtual_ipaddress { # 自定义虚拟IP。自定义的虚拟ip得根据真实ip设置。比如真实ip是192.168.91.138,那么虚拟ip可以设置为192.168.91.139~255,前面三个数得一致
192.168.187.50 # 定义虚拟ip(VIP),可多设,每行一个
}
}
两台nginx服务器都要安装keepalived 并分别配置ip 和 state SLAVE | MASTER
备份服务器的 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.187.166 #备份服务器的ip地址
smtp_connect_timeout 30
router_id 192.168.187.166 #代理的ip地址
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #检测脚本
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 51 # 虚拟路由编号,主、备机的virtual_router_id必须相同
priority 90 #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数),每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.187.50 # 定义虚拟ip(VIP),可多设,每行一个
}
}
创建nginx_check.sh 脚本文件放入 /usr/local/src/
#! /bin/bash
#检测nginx是否启动了
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then #如果nginx没有启动就启动nginx
/usr/soft/nginx/sbin/nginx #通过Nginx的启动脚本来重启nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then #如果nginx重启失败,则下面就会停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
(4)两台nginx
服务器都启动nginx
和 keepalived.service
nginx #启动nginx
systemctl start keepalived.service
(5)访问keepalived的虚拟ip地址192.168.187.50可以看到MASTER节点的欢迎信息
(6)测试MASTER服务器宕机
关闭MASTER节点中的nginx和keepalived
nginx -s stop
systemctl stop keepalived.service
再次访问192.168.187.50地址可以看到SLAVE节点的欢迎信息 说明配置成功