1、Nginx基本概念
1.1、什么是Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
其特点是占有内存少,并发能力强。
1.2、正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
代理对象是客户端,不知道服务端是谁。
1.3、反向代理
客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。
代理对象是服务端,不知道客户端是谁。
1.4、负载均衡
客户端发送多个请求到服务器,服务器处理请求,有些可能要访问数据库,服务器处理完毕后再将结果返回客户端。
这种架构模式单一,适合并发请求少的情况,但并发量大的时候如何解决?
首先可能想到升级服务器配置,但硬件的性能提升不能满足日益增长的需求,此时想到服务器集群,增加服务器数量,然后将原先请求单个服务器的情况改为将请求分发到多个服务器上,将负载分发到多个服务器上,也就是我们讲的负载均衡。
1.5、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,减少服务器压力,加快解析速度。
2、Nginx安装
2.1进入Nginx官网下载安装包
nginx-1.21.3.tar.gz
需要安装依赖:pcre、openssl、zlib
2.2安装依赖
(1)安装pcre依赖
压缩文件解压后进入目录执行./configure
使用 make && make install 编译安装
安装后查看版本号:
pcre-config --version
(2)安装openssl
(3)安装zlib
#连网安装 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
2.3安装Nginx
压缩文件 nginx-1.21.3.tar.gz 解压后进入目录执行./configure
使用 make && make install 编译安装
tar -xvf nginx-1.21.3.tar.gz cd nginx-1.21.3 ./configure make && make install
安装成功后,会生成文件夹 /usr/local/nginx/ ,nginx的sbin文件夹里包含了启动脚本
cd /usr/local/nginx/sbin
./nginx
查看启动状态:
ps -ef|grep nginx
nginx默认监听80端口,浏览器访问IP显示
若访问不了,检查防火墙
查看开放端口号
firewall-cmd --list-all
设置开放端口号
firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
3、Nginx常用命令和配置
3.1、Nginx操作常用命令
(1)使用Nginx命令必须进入Nginx目录
cd /usr/local/nginx/sbin
(2)查看Nginx版本
./nginx -v
(3)启动Nginx
./nginx
(4)关闭Nginx
./nginx -s stop
(5)重新加载Nginx(修改配置文件后不重启更新)
./nginx -s reload
3.2、Nginx配置文件
(1)配置文件路径: /usr/local/nginx/conf/nginx.conf
(2)配置文件由三部分组成:全局块、events、http。
全局块:设置一些影响Nginx服务器整体运行的配置指令。比如worker_processes 1;worker_processes 值越大可以支持的并发数量越多。
events:涉及的指令主要影响Nginx服务器与用户的网络连接。比如worker_connections 1024;支持的最大连接数。
http:Nginx配置中最频繁的部分:代理、缓存、日志、负载均衡...
http块又包含http全局、server块。
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server块与虚拟主机有密切联系。http块可以包含多个server块,而每个server块相当于一个虚拟主机。
每个server块包含全局server块和location块。
全局server块:最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。
location块:一个server块可以配置多个location块。
location块主要作用是基于Nginx服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
4、Nginx配置实例-反向代理1
4.1实现效果
浏览器输入 www.123.com,跳转到linux系统tomcat主页
4.2准备工作
(1)linux系统安装tomcat使用默认端口8080,启动
(2)对外开放访问端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
(3)测试,浏览器访问tomcat
4.3访问过程分析
4.4具体配置
(1)在windows系统的hosts文件中进行域名和ip对应关系的配置
C:WindowsSystem32driversetchosts
添加:192.168.0.104 www.123.com
(2)在Nginx进行请求转发配置(反向代理配置)
(3)测试,浏览器访问www.123.com展示tomcat主页
5、Nginx配置实例-反向代理2
5.1实现效果
使用Nginx方向代理,根据不同的访问路径跳转到不同端口的服务中
Nginx监听端口为9001
访问http://192.168.0.104:9001/edu/ 直接跳转到 http://127.0.0.1:8080/
访问http://192.168.0.104:9001/vod/ 直接跳转到 http://127.0.0.1:8081/
5.2准备工作
(1)准备两个tomcat,端口分别是8080、8081
(2)创建文件夹和测试界面
8080端口tomcat/webapps/edu/a.html
<h1>8080</h1>
8081端口tomcat/webapps/vod/a.html
<h1>8081</h1>
5.3 具体配置
(1)Nginx配置文件:/usr/local/nginx/conf/nginx.conf
添加配置:
server { listen 9001; server_name 192.168.0.104; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } }
(2)防火墙开放端口 9001、8080、8081
firewall-cmd --add-port=9001/tcp --permanent
firewall-cmd --reload
(3)Nginx重新加载
5.4 测试
5.4 配置中location指令说明
- 以=开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
- ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
- ~ 开头表示区分大小写的正则匹配;
- ~* 开头表示不区分大小写的正则匹配
- / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
6、Nginx配置实例-负载均衡
6.1实现效果
(1)浏览器访问http://192.168.0.104/edu/a.html ,负载均衡使请求平均分发到8080和8081端口
6.2准备工作
(1)准备两个tomcat,端口分别是8080、8081
(2)创建文件夹和测试界面
8080端口tomcat/webapps/edu/a.html
<h1>8080</h1>
8081端口tomcat/webapps/edu/a.html
<h1>8081</h1>
6.3 负载均衡配置
(1)Nginx配置文件:/usr/local/nginx/conf/nginx.conf
配置:
http { ...... upstream myserver{ server 192.168.0.104:8080; server 192.168.0.104:8081; } .... server{ listen 80; server_name 192.168.0.104; location / { ..... proxy_pass http://myserver; proxy_connect_timeout 10; } .... } }
6.4 测试
浏览器访问http://192.168.0.104/edu/a.html
6.5 Nginx分配服务器策略
(1)轮询(默认)
每个请求按时间先后顺序分配到后端服务器,服务器down掉则删除。
(2)weight
权重默认为1,数值越大分配请求越多
upstream myserver{ server 192.168.0.104:8080 weight=5; server 192.168.0.104:8081 weight=10; }
(3)ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题。
upstream myserver{ ip_hash; server 192.168.0.104:8080; server 192.168.0.104:8081; }
(4)fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
server 192.168.0.104:8080;
server 192.168.0.104:8081;
fair;
}
7、Nginx配置实例-动静分离
7.1准备工作
(1)在linux系统中准备一些静态资源,用于访问
/data/file/a.html
/data/image/bg.jpg
7.2具体配置
server { listen 80; server_name 192.168.0.104; location /file/ { root /data/; index index.html index.htm; } location /image/ { root /data/; autoindex on; }
autoindex on;//列出文件目录
7.3具体配置
(1)浏览器访问 http://192.168.0.104/image/
(2)浏览器访问 http://192.168.0.104/file/a.html
8、Nginx配置实例-高可用
8.1实现效果
(1)主Nginx服务器宕机后自动切换到备用Nginx服务器
8.2配置高可用准备工作
(1)两台虚拟机环境 192.168.0.103、192.168.0.104,均需安装Nginx (可使用vware克隆功能)
(2)两台虚拟机安装 keepalived
yum install keepalived -y
rpm -q -a keepalived 查询安装结果
安装位置 /etc/keepalived 配置文件 keepalived.conf
#keepalived常用指令
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
8.3高可用配置(主从配置)
(1)修改/etc/keepalived/keepalived.conf
主要是配置这两个节点,下方其他的是配置的lvs,我们不需要修改。
修改如下:
global_defs { notification_email { # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个 acassen@firewall.loc # 收件人邮箱1 failover@firewall.loc # 收件人邮箱2 sysadmin@firewall.loc # 收件人邮箱3 } notification_email_from Alexandre.Cassen@firewall.loc #邮件发件人 smtp_server 192.168.200.1 # 邮件服务器地址 smtp_connect_timeout 30 # 超时时间 router_id LVS_DEVEL # 机器标识 局域网内唯一即可 vrrp_skip_check_adv_addr # 默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。 #vrrp_strict # 严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。 vrrp_garp_interval 0 # 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文 vrrp_gna_interval 0 # 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0 } # vrrp实例 我们集群设置 多机配置,除了state和priority不一样,其他都一样 vrrp_instance VI_1 { state MASTER # 服务器状态 MASTER是主服务器 BACKUP是备份服务器 主服务器的priority要比备份服务器大 interface ens33 # 通信端口 通过ip addr可以看到 根据自己的机器配置 virtual_router_id 51 # vrrp实例id keepalived集群,实例id必须一致 priority 100 # 权重比 主服务器的priority要比备份服务器大 advert_int 1 # 心跳间隔 单位秒 keepalived多机器集群 通过心跳检测,如果发送心跳没反应 就立刻接管; authentication { # 服务器之间通信密码 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 自定义虚拟IP 192.168.91.199 } }
把这个配置复制到从服务器上,state改为BACKUP,从服务器的priority改小
到这里我们高可用就初步完成了,可以开启nginx和keepalived测试了
(2)在 /sur/local/src目录下添加检测脚本,检测Nginx是否活着
- 上面的配置已经可以初步测试nginx的高可用,比如我们关掉主服务器的keepalived,从服务器的nginx就会替代主nginx。
- 但如果是我们的主nginx挂掉而主keepalived没挂,我们从nginx就不能替代主nginx,实际情况中nginx比keepalived更容易挂掉
- 我们可以在keepalived添加脚本,当检测到我们的nginx挂掉之后而keepalived没挂掉,我们可以让脚本主动尝试重启nginx服务,如果实在重启不了nginx,我们让脚本主动关闭keepalived好让从nginx替代上来
修改keepalived.conf
在这个位置添加脚本配置
vrrp_script chk_http_port { script "/home/nginx_check.sh" #脚本地址 interval 2 #检测脚本执行的间隔 weight 2 #比重 }
然后相对应的地址创建nginx_check.sh
#!/bin/bash echo 'xxxxxx' count_nginx=`ps -ef|grep -w nginx|grep -v grep|wc -l` echo $count_nginx if [ $count_nginx -eq 0 ];then systemctl start nginx.service sleep 2 if [ `ps -ef|grep -w nginx|grep -v grep|wc -l` -eq 0 ];then systemctl stop keepalived.service fi fi
(3)启动Nginx、keepalived
./nginc
systemctl star keepalived.service
8.4测试
(1)访问虚拟 ip,然后把主 Nginx 或者 keepalived 停掉,重新访问虚拟ip仍然可以访问
9、Nginx原理解析
marst&worker
master接收信号后将任务分配给worker进行执行,worker可有多个。
worker如何工作
客户端发送一个请求到master后,worker获取任务的机制不是直接分配也不是轮询,而是一种争抢的机制,“抢”到任务后再执行任务,即选择目标服务器tomcat等,然后返回结果。
worker_connection
发送请求占用了woker两个或四个连接数。
普通的静态访问最大并发数是:worker_connections *worker_processes/2
若是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *worker_processes/4。
当然了,worker数也不是越多越好,worker数和服务器的CPU数相等时最适宜的。
优点
- 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
- 每个 woker 是独立的进程,若其中一个woker出现问题,其他继续进行争抢,实现请求过程,不会造成服务中断