尚硅谷nginx基础

news2024/11/24 20:30:41

nginx

  • 1. nginx安装
    • 1.1版本区别
    • 1.2安装步骤
    • 1.3 启动nginx
    • 1.4关于防火墙
    • 1.5 安装成系统服务
    • 1.6 配置nginx环境变量
  • 2. nginx基本使用
    • 2.1 基本运行原理
    • 2.2 nginx配置文件
      • 2.2.1 最小配置
        • 2.2.1.1 基本配置说明
    • 2.3 虚拟主机
      • 2.3.1域名、dns、ip地址的关系
      • 2.3.2IP地址和DNS地址的区别
      • 2.3.3IP地址
      • 2.3.4 DNS是什么?
      • 2.3.5虚拟主机原理
    • 2.4 域名解析
      • 2.4.1 vhost文件进行域名解析
      • 2.4.2 公网域名配置
      • 2.4.3Nginx虚拟主机域名配置
        • 2.4.3.1 不同端口号的虚拟主机
        • 2.4.3.2 域名不一致的虚拟主机
    • 2.5 namespace匹配规则
  • 3.反向代理
    • 3.1 网关、正向代理、反向代理
    • 3.2反向代理的配置
    • 3.3 nginx负载均衡
  • 4.动静分离
    • 4.1什么是动静分离
    • 4.2动静分离的原理
    • 4.3使用正则配置动静分离
    • 4.4 URLRewrite
    • 4.5 负载均衡+URLRewrite实战
    • 4.5 防盗链
      • 4.5.1 配置
    • 4.6高可用
      • 4.6.1为什么要使用nginx高可用
      • 4.6.2 什么是高可用
      • 4.6.3高可用的原理
      • 4.6.4 keepalived安装及配置

1. nginx安装

1.1版本区别

常用版本分为四大阵营

  1. Nginx开源版:http://nginx.org/
  2. Nginx plus 商业版:https://www.nginx.com
  3. openresty:http://openresty.org/cn/
  4. Tengine:http://tengine.taobao.org/

1.2安装步骤

  1. 将nginx的安装包拖入服务器并解压
  2. 进入nginx目录
  3. ./configure进行安装
  4. 如果发现下面报错
checking for OS 
  + Linux 3.10.0-693.el7.x86_64 x86_64 
checking for C compiler ... not found 

./configure: error: C compiler cc is not found

安装gcc

yum install -y gcc
  1. 如果报以下错误
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

安装perl库

yum install -y pcre pcre-devel
  1. 如果报以下错误
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

安装zlib库

yum install -y zlib zlib-devel
  1. 安装
./configure --prefix=/usr/local/nginx
  1. 接下来执行
make
make install

1.3 启动nginx

启动Nginx
进入安装好的目录 /usr/local/nginx/sbin

  1. ./nginx启动
  2. ./nginx -s stop快速停止
  3. ./nginx -s quit优雅关闭,在退出前完成已经接受的连接请求
  4. ./nginx -s reload重新加载配置

1.4关于防火墙

  1. 关闭防火墙
    systemctl stop firewalld.service
  2. 禁止防火墙开机启动
    systemctl disable firewalld.service
  3. 放行端口
    firewall-cmd --zone=public --add-port=80/tcp --permanent
  4. 重启防火墙
    firewall-cmd --reload

1.5 安装成系统服务

  1. 创建服务脚本
    vi /usr/lib/systemd/system/nginx.service
  2. 脚本内容
[Unit] 
Description=nginx - web server 
After=network.target remote-fs.target nss-lookup.target 

[Service] 
Type=forking 
PIDFile=/usr/local/nginx/logs/nginx.pid 
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 
ExecReload=/usr/local/nginx/sbin/nginx -s reload 
ExecStop=/usr/local/nginx/sbin/nginx -s stop 
ExecQuit=/usr/local/nginx/sbin/nginx -s quit 
PrivateTmp=true 

[Install] 
WantedBy=multi-user.target
  1. 重新加载系统服务
    systemctl daemon-reload
  2. 启动服务
    systemctl start nginx.service
  3. 开机启动
    systemctl enable nginx.service

1.6 配置nginx环境变量

  1. 编辑环境变量配置文件/etc/profile,命令:
vi /etc/profile
  1. 添加nginx配置:
#nginx bin目录配置
export NGINX_PATH=/opt/nginx/sbin
export PATH=$PATH:$NGINX_PATH
  1. 使配置生效,命令
source /etc/profile
  • nginx常用命令
命令说明
nginx -v显示版本信息并退出
nginx -V示版本和配置选项信息,然后退出
nginx -t检查配置文件nginx.conf
nginx -c conf文件的目录(/opt/nginx/conf/nginx.conf)启动nginx服务
nginx -s reopen重启Nginx
nginx -s reload重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop强制停止Nginx服务
nginx -s quit优雅地停止Nginx服务

2. nginx基本使用

2.1 基本运行原理

在这里插入图片描述
在nginx的sbin目录先启动nginx后,会启动一个主线程master和多个子线程worker,主进程主要用于读取并校验配置文件,worker主要用于接收请求,解析请求读取配置文件

2.2 nginx配置文件

2.2.1 最小配置

2.2.1.1 基本配置说明

  1. worker_processes
    worker_processes 1; 默认为1,表示开启一个业务进程,一般一个CPU对应一个

  2. worker_connections
    worker_connections 1024; 单个业务进程可接受连接数

  3. include mime.types;
    include mime.types; 引入http mime类型

  4. default_type application/octet-stream;
    default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。

  5. sendfile on;
    sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
    未开启sendfile(需要进行数据的拷贝)
    在这里插入图片描述
    开启后
    在这里插入图片描述

  6. keepalive_timeout 65;
    keepalive_timeout 65;

  7. server
    一个serve代表一个主机,可以配置多个serve

server {
	listen 80; #监听端口号 
	server_name localhost; #主机名或主机名 
	location / { #uri 匹配路径 
		root html;# 文件根目录 
		index index.html index.htm; #默认页名称 
	}
	error_page 500 502 503 504 /50x.html; #报错编码对应页面 
	location = /50x.html { 
			root html; 
		}
}

2.3 虚拟主机

虚拟主机使用特殊的软硬件技术,把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名,具有完整的Internet服务器(WWW、FTP、Email等)功能,虚拟主机之间完全独立,并可由用户自行管理,在外界看来,每一台虚拟主机和一台独立的主机完全一样。

域名解析就是域名到IP地址的转换过程,IP地址是网路上标识站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址,。域名的解析工作由DNS服务器完成。

2.3.1域名、dns、ip地址的关系

  • 域名是相对网站来说的,IP是相对网络来说的。当输入一个域名的时候,网页是如何做出反应的?
    输入域名---->域名解析服务器(dns)解析成ip地址—>访问IP地址—>完成访问的内容—>返回信息。

  • Internet上的计算机IP是唯一的,一个IP地址对应一个计算机。
    一台计算机上面可以有很多个服务,也就是一个ip地址对应了很多个域名,即一个计算机上有很多网站。

2.3.2IP地址和DNS地址的区别

IP地址是指单个主机的唯一IP地址,而DNS服务器地址是用于域名解析的地址。
一个是私网地址,一个是公网地址;
一个作为主机的逻辑标志,一个作为域名解析服务器的访问地址。
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

2.3.3IP地址

IP,就是Internet Protocol的缩写,是一种通信协议,我们用的因特网基本是IP网组成的。
IP地址就是因特网上的某个设备的一个编号。
IP地址一般由网络号,主机号,掩码来组成。
IP网络上有很多路由器,路由器之间转发、通信都是只认这个IP地址,类似什么哪?就好像你寄包裹,你的写上发件人地址,你的姓名,收件人地址,收件人姓名。
这个发件人地址就是你电脑的IP的网络号,你的姓名就是你的主机号。
收件人的地址就是你要访问的IP的网络号,收件人的姓名就是访问IP的主机号。
现在还有了更复杂的IPV6,还有IPV9。

2.3.4 DNS是什么?

我们访问因特网必须知道对端的IP地址,可是我们访问网站一般只知道域名啊,怎么办?
这时候DNS就有用处了,电脑先访问DNS服务器,查找域名对应的IP,于是,你的电脑就知道要发包到IP地址了。

2.3.5虚拟主机原理

虚拟主机是为了在同一台物理机器上运行多个不同的网站,提高资源利用率引入的技术。
一般的web服务器一个ip地址的80端口只能正确对应一个网站。web服务器在不使用多个ip地址和端口的情况下,如果需要支持多个相对独立的网站就需要一种机制来分辨同一个ip地址上的不同网站的请求,这就出现了主机头绑定的方法。简单的说就是,将不同的网站空间对应不同的域名,以连接请求中的域名字段来分发和应答正确的对应空间的文件执行结果。举个例子来说,一台服务器ip地址为192.168.8.101,有两个域名和对应的空间在这台服务器上,使用的都是192.168.8.101的80端口来提供服务。如果只是简单的将两个域名A和B的域名记录解析到这个ip地址,那么web服务器在收到任何请求时反馈的都会是同一个网站的信息,这显然达不到要求。接下来我们使用主机头绑定域名A和B到他们对应的空间文件夹C和D。当含有域名A的web请求信息到达192.168.8.101时,web服务器将执行它对应的空间C中的首页文件,并返回给客户端,含有域名B的web请求信息同理,web服务器将执行它对应的空间D中的首页文件,并返回给客户端,所以在使用主机头绑定功能后就不能使用ip地址访问其上的任何网站了,因为请求信息中不存在域名信息,所以会出错。

2.4 域名解析

2.4.1 vhost文件进行域名解析

  1. 修改C:\Windows\System32\drivers\etc目录下的hosts文件
    在这里插入图片描述
  2. 在浏览器中输入s.com会出现以下效果
    在这里插入图片描述

2.4.2 公网域名配置

使用阿里云的域名进行配置

  1. 进入自己购买的域名列表
    在这里插入图片描述
  2. 添加域名解析
    在这里插入图片描述
  3. 测试
    在这里插入图片描述

2.4.3Nginx虚拟主机域名配置

  1. 创建/www/www和/www/vod两个目录
  2. 在/www/www目录下创建index.html
this is index.html
  1. 在/www/vod目录下创建index.html
this is vod.html

2.4.3.1 不同端口号的虚拟主机

要求当访问80端口时请求到/www/www/indedx.html,当访问88端口时访问请求到/www/vod/index.html

  1. 修改nginx.conf文件
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	# 虚拟主机vhost	
    server {
        listen       80;
		# 域名 主机名
        server_name  localhost;

        location / {
            root   /www/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
	# 虚拟主机vhost	
    server {
        listen       88;
		# 域名 主机名
        server_name  localhost;

        location / {
            root   /www/vod;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}
  1. 访问80端口
    在这里插入图片描述
  2. 访问88端口
    在这里插入图片描述

2.4.3.2 域名不一致的虚拟主机

要求当访问www.smilecb.cn时请求到/www/www/indedx.html,当访问vod.smilecb.cn时访问请求到/www/vod/index.html

  1. 修改nginx.conf文件
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	# 虚拟主机vhost	
    server {
        listen       80;
		# 域名 主机名
        server_name  www.smilecb.cn;

        location / {
            root   /www/www;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
	# 虚拟主机vhost	
    server {
        listen       80;
		# 域名 主机名
        server_name  vod.smilecb.cn;

        location / {
            root   /www/vod;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

  1. 访问www.smilecb.cn
    在这里插入图片描述
  2. 访问vod.smilecb.cn
    在这里插入图片描述

2.5 namespace匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

  1. 完整匹配
    我们可以在同一servername中匹配多个域名
    server_name vod.smilecb.cn www.smilecb.cn;
  2. 通配符匹配
    server_name *.mmban.com
  3. 通配符结束匹配
    server_name vod.*;
  4. 正则表达式匹配
    server_name ~^[0-9]+\.mmban\.com$;

匹配的优先级:完全匹配、通配符在前的,如*.test.com、通配在后的,如www.test.*、正则匹配,如~^.www.test.com$

3.反向代理

在这里插入图片描述

3.1 网关、正向代理、反向代理

  1. 网关
    网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器,与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。网关(Gateway)就是一个网络连接到另一个网络的“关口”。也就是网络关卡。Gate在英文中就是大门的意思。
  2. 正向代理
    正向代理:是指用户利用代理服务器访问目标服务器。也就是说,代理服务器的代理对象是用户。如下图所示。
    在这里插入图片描述
  3. 反向代理
    在这里插入图片描述

反向代理的对象则是 目标服务器。是指服务端利用代理服务器给用户提供服务。
和正向代理相比,二者都是利用代理服务器实现的,不过反向代理的主语是服务端,所以说反向代理对于用户来说是透明的,在用户的视野里,代理服务器便是目标服务器。

3.2反向代理的配置

proxy_pass http://baidu.com;

nginx配置示例

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	# 虚拟主机vhost	
    server {
        listen       80;
		# 域名 主机名
        server_name  z;

        location / {
			proxy_pass http://www.atguigu.com;
          #  root   /www/www;
          #  index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

3.3 nginx负载均衡

  1. 什么是负载均衡
    当一台服务器的访问量越大时,服务器所承受的压力也就越大,超出自身所指定的访问压力就会崩掉,避免发生此类事情的发生,因此也就有了负载均衡来分担服务器的压力。
    那么究竟什么是负载均衡呢?通俗些讲,就是我们有几十台、几百台甚至更多服务器,将这些服务器组成一个服务器集群,当客户端访问某台设备的数据时,首先发送的请求先到一台中间服务器,并通过中间服务器在服务器集群中平均分摊到其他服务器中,因此,当用户每次所发送的请求都将会保证服务器集群中的设备均与平摊,以此来分担服务器的压力,从而保持服务器集群的整理性能最优,避免出现有崩溃的现象。

  2. Nginx负载均衡的作用

  • 转发功能:Nginx 会按照一定的算法轮询、权重将客户端发来的请求转发至不同的应用服务器上,同时减轻单台服务器的压力,提高服务器的并发量;
  • 故障迁移:当一台服务器出现了故障时,客户端发来的请求将自动发送到其他服务器; * 添加恢复:当故障服务器恢复正常工作时,将自动添加到处理用户请求中;
    nginx负载均衡配置示例
    将请求转发到192.168.44.112和192.168.44.113两台服务器上
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	# 虚拟主机vhost	
	upstream httpds{
	server 192.168.44.112:80;
	server 192.168.44.113:80;
	}
	
    server {
        listen       80;
		# 域名 主机名
        server_name  z;

        location / {
			proxy_pass http://httpds;
          #  root   /www/www;
          #  index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

常见的几种策略

  1. weight(权重)
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream httpd {
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
  1. ip_hash
    根据客户端的ip地址转发同一台服务器,可以保持回话。
  2. least_conn
    最少连接访问
  3. url_hash
    根据用户访问的url定向转发请求,根据url的hash值定向转发到特定的服务器(使用场景:固定资源不在统一服务器)
  4. fair
    根据后端服务器响应时间转发请求(有流量去倾斜的风险)

4.动静分离

4.1什么是动静分离

为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片、js、css等文件,可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。对于用户请求的动态文件,如servlet、jsp,则转发给Tomcat,Jboss服务器处理,这就是动静分离。即动态文件与静态文件的分离。

4.2动静分离的原理

在这里插入图片描述

动静分离可通过location对请求url进行匹配,将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。通常将静态资源放到nginx中,动态资源转发到tomcat服务器中。

4.3使用正则配置动静分离

  1. 常见的Nginx正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符  //例(js|img|css)

  1. location正则
//location大致可以分为三类
精准匹配:location = /{}
一般匹配:location /{}
正则匹配:location ~/{}
//location常用的匹配规则:
= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示前缀字符串匹配(不是正则匹配,需要使用字符串),如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配(需要使用正则表达式)。
~* :不区分大小写的匹配(需要使用正则表达式)。
!~ :区分大小写的匹配取非(需要使用正则表达式)。
!~* :不区分大小写的匹配取非(需要使用正则表达式)。
//优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

注意:

  • 精确匹配: = , 后面的表达式中写的是纯字符串
  • 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串
  • 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式

location的说明

 (1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

实际网站使用中,至少有三个匹配规则定义:

  1. 第一个必选规则
    直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
    proxy_pass http://127.0.0.1:8080/; 
}
  1. 第二个必选规则
    处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
  1. 第三个规则
    通用规则,用来转发动态请求到后端应用服务器
location /api/ {
    proxy_pass http://127.0.0.1:3000/api/
}

4.4 URLRewrite

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到repacement,结尾是flag标记。
rewrite语法格式及参数语法:

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。

rewrite< regex >< replacement >[flag];
关键字正则替代内容flag标记
  • 关键字:其中关键字error_log不能改变
  • 正则:perl兼容正则表达式语句进行规则匹配
  • 替代内容:将正则匹配的内容替换成replacement
  • flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:

  • server,location,if

flag标记说明:

  • last #本条规则匹配完成后,继续向下匹配新的location URI规则
  • break #本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

实例

rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;

4.5 负载均衡+URLRewrite实战

  1. 开启防火墙
    systemctl start firewalld
  2. 重启防火墙
    systemctl restart firewalld
  3. 重载规则
    firewall-cmd --reload
  4. 查看已配置规则
    firewall-cmd --list-all
  5. 指定端口和ip访问
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
  6. 移除规则
    firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.44.101" port port="8080" protocol="tcp" accept"

网关配置

upstream httpds {
server 192.168.44.102 weight=8 down;
server 192.168.44.103:8080 weight=2;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
proxy_pass http://httpds ;
}

4.5 防盗链

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

4.5.1 配置

valid_referers none | blocked | server_names | strings ....;

  • none, 检测 Referer 头域不存在的情况。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以
    “http://” 或 “https://” 开头。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

在需要防盗链的location中配置

valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}

4.6高可用

4.6.1为什么要使用nginx高可用

因为nginx作为反向代理服务器时,有可能出现宕机的情况,而由于其反向代理的特性,就会导致其他服务器(tomcat等)无法被访问,这样项目就停止工作了。但是使用了高可用后,就可以避免这种现象出现。

4.6.2 什么是高可用

nginx的高可用简单来说就是配置了两台(或更多)的nginx服务器,当主服务器宕机时,就会自动切换到备用服务器,从而保证项目的持续运行。

4.6.3高可用的原理

nginx的实现需要借助其他工具(keepalived)来实现。在keepalived中配置一个虚拟IP(VIP),同时keepalived会定时检查主服务器的工作状态(通过脚本实现)。在主服务器正常工作时,VIP就会映射到主服务器的IP,此时,虚拟ip对应的物理地址和主服务器IP对应的物理地址是相同的,所以访问虚拟IP即访问主服务器。当主服务器失效时,脚本就会监测到,从而根据预先的配置,找到优先级最高的备用服务器,并将虚拟IP映射到该备用服务器的ip,此时,这两个ip对应的物理地址时相同的。再主服务器回复正常时,又会被检测到,又会自动切换到主服务器。这样就实现了nginx的高可用。
在这里插入图片描述

4.6.4 keepalived安装及配置

1. 使用yum源安装
yum install keepalived
2. 配置
使用yum安装后配置文件在/etc/keepalived/keepalived.conf

  • 修改主服务器的配置
! Configuration File for keepalived

global_defs {
   router_id lb111
}

vrrp_instance VI_1 {  #VI_1实例的名称
    state MASTER  #主服务器 备份服务器上将MASTER改成BACKUP
    interface ens33 #网卡的名称
    virtual_router_id 51 
    priority 100 #优先级 优先级高的为master
    advert_int 1 # 间隔检测的时间
    authentication { #认证配置 同一组保持一致即可
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #虚拟的ip地址
        192.168.44.200
    }
}

启动systemctl start keepalived

查看ip地址在这里插入图片描述
同理修改备用机并启动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2 组件基础使用、父子组件之间的传值

一、什么是组件如画红框的这些区域都是由vue里的各种组件组成、提高复用信通常一个应用会以一棵嵌套的组件树的形式来组织&#xff1a;例如&#xff0c;你可能会有页头、侧边栏、内容区等组件&#xff0c;每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用…

Mybatis中添加、查询、修改、删除

在Mybatis中添加数据的操作 编写相对应的SQL语句&#xff0c;并完成相关数据的对应关系 编写测试用例 需要提交事务 sqlSession commit() 这里需要注意的是mybatis是默认的是手动提交事务&#xff0c;如果不写的话会进行回滚&#xff0c;添加操作就不会被执行 或者在 如果…

15- TensorFlow基础 (TensorFlow系列) (深度学习)

知识要点 TensorFlow是深度学习领域使用最为广泛的一个Google的开源软件库 .TensorFlow中定义的数据叫做Tensor(张量), Tensor又分为常量和变量. 常量一旦定义值不能改变. 定义常量: t tf.constant([[1., 2., 3.], [4., 5., 6.]])定义变量: v tf.Variable([[1., 2., 3.], [4…

黑盒测试用例设计方法-边界值分析法

一、边界值定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 长期的测试工作经验告诉我们&#xff0c;大量的错误是发生在输入或输出范围…

Vision Transformer(ViT)

1. 概述 Transformer[1]是Google在2017年提出的一种Seq2Seq结构的语言模型&#xff0c;在Transformer中首次使用Self-Atttention机制完全代替了基于RNN的模型结构&#xff0c;使得模型可以并行化训练&#xff0c;同时解决了在基于RNN模型中出现了长距离依赖问题&#xff0c;因…

TDG code

部分 数据集 参数设置 def setup_args(args None):args.algorithm_name TDG# args.algorithm_name HDGargs.user_num 1000000args.attribute_num 6args.domain_size 64args.epsilon 0.2args.dimension_query_volume 0.5args.query_num 20args.query_dimension 3运行…

leetcode 41~50 学习经历

leetcode 41~50 学习经历41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)小结41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的…

C语言数据结构(二)—— 受限线性表 【栈(Stack)、队列(Queue)】

在数据结构逻辑层次上细分&#xff0c;线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”&#xff0c;可以自由的删除或添加结点。受限线性表主要包括栈和队列&#xff0c;受限表示对结点的操作受限制。一般线性表详解&#xff0c;请参考文章&…

数据结构基础之栈和队列

目录​​​​​​​ 前言 1、栈 2、队列 2.1、实现队列 2.2、循环队列 前言 上一篇中我们介绍了数据结构基础中的《动态数组》&#xff0c;本篇我们继续来学习两种基本的数据结构——栈和队列。 1、栈 特点&#xff1a;栈也是一种线性结构&#xff0c;相比数组&#xff…

(汇总记录)电机控制算法

1.S曲线应用电机加减速 电机控制 | S曲线加减速 - Tuple - 博客园 (cnblogs.com) 如要将S型曲线应用到电机的加减速控制上&#xff0c;需要将方程在X、Y坐标系进行平移&#xff0c;同时对曲线进行拉升变化&#xff1a;即 Y A B / ( 1 exp( -ax b ) ) &#xff0c;则根据该…

Pandas怎么添加数据列删除列

Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…

Java异常架构与异常关键字

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离&#xff0c;保证程序代码更加优雅&#xff0c;并提高程序健壮性。在有效使用异常的情况下&#xff0c;异常能清晰的回答what, where, why这3个问…

【编程入门】N种编程语言做个应用市场(appstore)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 本系列做了个应用市场&#xff0c;支持下载安装安卓…

Bootstrap系列之导航

Bootstrap导航 可以在 ul 元素上添加 .nav类&#xff0c;在每个 li 选项上添加 .nav-item 类&#xff0c;在每个链接上添加 .nav-link 类: 基本的导航 <div class"container mt-3"><h2>导航</h2><p>简单的水平导航:</p><ul class&…

基于yolov5与改进VGGNet的车辆多标签实时识别算法

摘 要 为了能快速、有效地识别视频中的车辆信息&#xff0c;文中结合YOLOv3算法和CNN算法的优点&#xff0c;设计了一种能实时识别车辆多标签信息的算法。首先&#xff0c;利用具有较高识别速度和准确率的YOLOv3实现对视频流中车辆的实时监测和定位。在获得车辆的位置信息后…

《亚马逊逆向工作法》读书笔记

文章目录书籍信息构件&#xff1a;领导力准则与机制亚马逊领导力准则机制&#xff1a;强化领导力准则年度计划&#xff1a;OP1与OP2S-Team目标亚马逊的薪酬制度&#xff1a;强化长期思维招聘&#xff1a;亚马逊独特的抬杆者流程抬杆者招聘流程组织&#xff1a;独立单线程领导模…

Redis-Java代码使用示例

在我之前的项目中&#xff0c;使用Redis是我们团队自己封装了一个Redis操作类&#xff0c;但是这只是在Spring提供的RedisTemplate上做了一层封装而已&#xff0c;当时使用不是很熟练&#xff0c;都是一边在网上查资料&#xff0c;一边使用&#xff1b;这篇文章会介绍两种使用方…

分布式一致性算法——Paxos 和 Raft 算法

写在前面 本文隶属于专栏《100个问题搞定大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见100个问题搞定大数据理论体系 I. 简介 介绍Paxos…

局域网实现PC、Pad、Android互联

文章目录局域网实现PC、Pad、Android互联一、网络邻居1、 Windows 配置1.1 开启共享功能1.2 设置用户1.3 共享文件夹2、 Pad 连接二、 FTP & HTTP1、 电脑配置1.1 HTTP 服务1.2 FTP 服务2、 连接3、 电脑连接 FTP三、 其他方式局域网实现PC、Pad、Android互联 在我们使用多…

【micropython】SPI触摸屏开发

背景&#xff1a;最近买了几块ESP32模块&#xff0c;看了下mircopython支持还不错&#xff0c;所以买了个SPI触摸屏试试水&#xff0c;记录一下使用过程。硬件相关&#xff1a;SPI触摸屏使用2.4寸屏幕&#xff0c;常见淘宝均可买到&#xff0c;驱动为ILI9341&#xff0c;具体参…