一、nginx功能
1.nginx 是什么
高性能的Http和反向代理的服务器,占用内存少,处理并发能力强
特点:支持热部署,启动容易并且可以长时间不间断运行,在不间断服务时可以进行版本升级
2. 反向代理
正向代理: 客户访问服务器通过代理服务器,就是正向代理(在客户端配置代理服务器)
反向代理:客户端不需要任何配置,将请求发送到代理服务器,然后代理服务器选择目标服务器获取数据之后,在返回给客户端,这个时候代理服务器和服务器就是一个整体,暴露的是代理服务器地址,隐藏了服务器地址同时客户端对代理是无感知的。
总结:
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
3. 负载均衡
增加服务器的数量,将之前向一个服务器发送多个请求的过程改进为将多个请求分发到多个服务器上
总结:通过nginx或者代理服务器将请求分发到多个服务器上
4. 动静分离
为了加快网站的解析速度,将原来的动态资源和静态资源分别发到不同的服务器上来解析,降低服务器的压力
二、nginx安装,命令和配置文件
1. 在 Linux 的安装
一键安装依赖:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
安装nginx:
//进入目录
cd nginx-1.13.7
//执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
//执行make命令
make
//执行make install命令
make install
安装完成之后,自动生成一个文件夹:
在/usr/local/nginx/sbin/nginx
命令: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
或者进入/usr/local/nginx/sbin目录,使用./nginx
配置配置文件:
/usr/local/nginx/conf 下的nginx.conf
默认端口是80
2.nginx 常用命令
查看版本号: 进入安装目录 usr/local ./nginx -v
启动:./nginx
关闭:./nginx -s stop
查看启动:ps -ef | grep nginx
重新加载nginx:./nginx -s reload
3.nginx 配置文件
在usr/local/nginx/conf/ 下的nginx.conf
1)全局块 设置一些影响nginx服务器整体运行的配置指令
如:第一行的 worker_processes 1; --值越大,处理并发量越大,但受到设备限制
2)events块 影响nginx服务器与用户的网络的链接
如:
events {
worker_connections 1024; ---表示支持的最大连接数
}
3)http块
a.http全局块
包括文件引入,日志自定义,链接超时时间,单链接请求书上限,MIME-TYPE定义等等
b.server块
和虚拟主机密切相关,每个server块相当于一个虚拟主机
包含全局server块和location块
举例:前后端分离项目,用nginx部署:
后端配置文件:
#服务端口号
server.port=8001
#服务环境上下文路径
server.servlet.context-path=/ybgpt
xcom.servlet.url-patterns=/api/*
3、nginx配置实例1-反向代理
该实例要实现的效果:
输入www.123.com 跳转到linux上面的tomcat启动页
具体配置:
1.在windows的host文件配置:
文件路径: C:\Windows\System32\drivers\etc\hosts
添加:
192.168.223.129 www.123.com
2.在nginx的配置文件中修改配置:
当我们访问192.168.223.129:80 时,++++会(请求转发)跳转到location 127.0.0.1:8080++++
3.测试
浏览器输入
界面:
反向代理实例二:
使用反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口9001
访问http://192.168.223.129:9001/edu/a.html 跳转到127.0.0.1:8081
这里,将tomcat的端口改为8081,同时在tomcat的webapp目录下添加文件夹edu ,在其中添加a.html文件
然后再nginx的配置文件中设置监听的端口为9001,当我们在浏览器访问192.168.223.129:9001时,
就会跳转到tomcat的8081端口的页面,如果访问路径中添加文件名,就会访问放置在tomcat服务器上的
相应的文件。
修改nginx的配制文件:
server {
listen 9001;
server_name 192.168.223.129;
location ~/edu/ {
proxy_pass http://127.0.0.1:8081;
}
}
location的配置:
参见 https://zhuanlan.zhihu.com/p/137146854
4、nginx配置实例2-负载均衡
浏览器输入 http://192.168.223.129/test/a.html ,负载均衡,平均到8080,8081两个服务器。
配置两台服务器,分别在两个服务器的webapps文件夹下添加文件夹test,下面添加文件a.html
然后,
修改配置文件:
在http块添加:
upstream myserver{
server 192.168.223.129:8080;
server 192.168.223.129:8081;
}
修改server:
server{
listen 80;
server_name 192.168.223.129;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
解释:http://192.168.223.129/test/a.html 这个请求具体含义是
访问192.168.223.129 的80 端口,然后由于在nginx的监听端口为80,同时访问该端口会转发到
配置文件中设置好的tomcat的ip地址和端口去,该请求后边的文件访问路径就是部署在tomcat上的文件及其路径
这样,从浏览器访问到nginx服务器的80端口,然后该端口转发到tomcat1的8080端口,tomcat2的8081
端口,然后分别访问这两个服务器的test/html 文件,如果有多个请求发送过来,就可以由这两个服务器分担请求,实现负载均衡
nginx服务提供的负载均衡的分配策略:
1.默认-轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.weight
weight和访问比率成正比,用于后端服务器性能不均的情况,权重越高,请求访问的几率就越高
3.ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4.fair(第三方
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。
5、nginx配置实例3-动静分离
严格意义上说,动静分离就是把动态请求和静态请求分离,Tomcat处理动态请求,Nginx处理静态请求。
而不是简单的把动态资源和静态资源分离开
处理方法:
1.将静态资源单独放在静态资源服务器中(常见),有独立的域名。
2.动态,静态文件混合,通过nginx来区分。
具体:通过location 指定不同的后缀名实现不同的请求转发
注意: 设置expires参数来设置浏览器缓存过期时间
也就是可以让该文件缓存在浏览器,在缓存过期时间内,访问特定的URL就不会再去访问服务器,直接访问缓存,如果文件有更新就会从服务器重新下载,(不适用于经常修改的文件),例子如下:
6、nginx配置高可用集群
问题:当nginx宕机之后,请求无法实现
解决:配置处Nginx的高可用主备模式:
产生一个虚拟IP,使用一个软件keepalived检测MASTER是否宕机 ,主服务器可以用就将虚拟IP绑定在MASTER上。
如果MASTER宕机,就将虚拟IP绑定在 BACKUP上。
具体配置高可用:
两台服务器分别安装nginx和keepalived
三、nginx的keepalived
1. 安装 keepalived :
yum -y install keepalived
若出现缺少依赖,使用下面两条命令下载并安装相关依赖:
rpm -vih mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm
查看keepalived的安装版本:
rpm -q -a keepalived
2. 安装之后
在 etc 里面生成 keepalived/keepalived.conf 配置文件
3. 修改配置文件:(主备服务器都需要修改,只需要修改下面的红色部分)
! 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.223.129 #发送邮件通知的SMTP服务器,不用管
smtp_connect_timeout 30
router_id LVS_DEVEL #在etc/hosts 文件中修改主机的名称,后边的是标识主机的字符串,可以不是主机
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port{
scripts "/usr/local/src/nginx_check.sh" #检测的脚本的路径
interval 2 #检测脚本执行间隔,s为单位
weight 2 #权重
}
vrrp_instance VI_1 {
state MASTER #备份服务器改为BACKUP
interface ens33 #网卡
virtual_router_id 51 #主机和备份机的虚拟id必须一致
priority 100 #主备机去不同的优先级,主机值较大,备份机值小
advert_int 1 #隔一秒发送一个心跳,检测主服务器还存活
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.223.50 #虚拟IP地址
}
}
4. 添加 keepalived 的检测脚本,要放到下面路径:(主备服务器都需要脚本)
#!/bin/bash
run=`ps -C nginx --no-header | wc -l`
if [ $run -eq 0 ];then
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header | wc -l` ];then
Kill all keepalived
fi
fi
//默认每隔3秒钟执行一次检测脚本,检查nginx服务是否启动,如果没启动就把nginx服务启动起来,如果启动不成功,就把keepalived服务down掉,让漂浮到备keepalived上
5. 启动 keepalived :
systemctl start keepalived.service
查看是否启动:
ps -ef | grep keepalived
6. 效果:
访问配置的虚拟IP,可以实现,关闭主服务器的nginx,仍然可以访问到我们的虚拟IP地址,这表示,我们写的keepalived脚本文件起作用,检测到主服务器宕机之后,自动将虚拟IP地址绑定到备份服务器上,仍然可以访问到。
四、nginx执行原理
1.nginx中两个进程:
master,worker
2.worker怎么工作:
master首先收到请求,然后worker进行争抢请求,在通过反向代理,借助tomcat等其他服务器实现请求。
3.一个master和多个worker的好处:
可以使用 nginx -s reload 热部署
每个worker都是独立的,不需要加锁,节省开销,并且能够保证服务不会中断,降低风险
4.如何合理设置worker的数量:
Nginx同redis使用了多路IO复用机制,每个进程中只有一个主线程,通过异步非阻塞方式实现,每个worker都可以把cpu发挥到极致,因此,worker和cpu的数量相等是最合适的。
5.连接数 work_connection
1) 发送一个请求,占用几个worker的连接数? 2/4个
请求传到worker,如果是静态请求,worker之间返回值,两个连接数,如果是动态请求,在前边的基础上还要访问tomcat和从tomcat中获取值 ,共四个连接数
2) 一个nginx,四个worker,每个worker支持最大的连接数是1024,支持的最大并发数是多少?
1024*4 总的worker的最大连接数
最大并发数 1024*4 /2 或者 4
普通静态访问,最大并发数:work_connection * work_processes/2
做HTTP反向代理,最大并发数:work_connection * work_processes /4