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版本区别
常用版本分为四大阵营
- Nginx开源版:http://nginx.org/
- Nginx plus 商业版:https://www.nginx.com
- openresty:http://openresty.org/cn/
- Tengine:http://tengine.taobao.org/
1.2安装步骤
- 将nginx的安装包拖入服务器并解压
- 进入nginx目录
./configure
进行安装- 如果发现下面报错
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
- 如果报以下错误
./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
- 如果报以下错误
./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
- 安装
./configure --prefix=/usr/local/nginx
- 接下来执行
make
make install
1.3 启动nginx
启动Nginx
进入安装好的目录 /usr/local/nginx/sbin
./nginx
启动./nginx -s stop
快速停止./nginx -s quit
优雅关闭,在退出前完成已经接受的连接请求./nginx -s reload
重新加载配置
1.4关于防火墙
- 关闭防火墙
systemctl stop firewalld.service
- 禁止防火墙开机启动
systemctl disable firewalld.service
- 放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
- 重启防火墙
firewall-cmd --reload
1.5 安装成系统服务
- 创建服务脚本
vi /usr/lib/systemd/system/nginx.service
- 脚本内容
[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
- 重新加载系统服务
systemctl daemon-reload
- 启动服务
systemctl start nginx.service
- 开机启动
systemctl enable nginx.service
1.6 配置nginx环境变量
- 编辑环境变量配置文件/etc/profile,命令:
vi /etc/profile
- 添加nginx配置:
#nginx bin目录配置
export NGINX_PATH=/opt/nginx/sbin
export PATH=$PATH:$NGINX_PATH
- 使配置生效,命令
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 基本配置说明
-
worker_processes
worker_processes 1; 默认为1,表示开启一个业务进程,一般一个CPU对应一个 -
worker_connections
worker_connections 1024; 单个业务进程可接受连接数 -
include mime.types;
include mime.types; 引入http mime类型 -
default_type application/octet-stream;
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。 -
sendfile on;
sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
未开启sendfile(需要进行数据的拷贝)
开启后
-
keepalive_timeout 65;
keepalive_timeout 65; -
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文件进行域名解析
- 修改C:\Windows\System32\drivers\etc目录下的hosts文件
- 在浏览器中输入s.com会出现以下效果
2.4.2 公网域名配置
使用阿里云的域名进行配置
- 进入自己购买的域名列表
- 添加域名解析
- 测试
2.4.3Nginx虚拟主机域名配置
- 创建/www/www和/www/vod两个目录
- 在/www/www目录下创建index.html
this is index.html
- 在/www/vod目录下创建index.html
this is vod.html
2.4.3.1 不同端口号的虚拟主机
要求当访问80端口时请求到/www/www/indedx.html,当访问88端口时访问请求到/www/vod/index.html
- 修改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;
}
}
}
- 访问80端口
- 访问88端口
2.4.3.2 域名不一致的虚拟主机
要求当访问www.smilecb.cn时请求到/www/www/indedx.html,当访问vod.smilecb.cn时访问请求到/www/vod/index.html
- 修改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;
}
}
}
- 访问www.smilecb.cn
- 访问vod.smilecb.cn
2.5 namespace匹配规则
我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
- 完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.smilecb.cn www.smilecb.cn;
- 通配符匹配
server_name *.mmban.com
- 通配符结束匹配
server_name vod.*; - 正则表达式匹配
server_name ~^[0-9]+\.mmban\.com$;
匹配的优先级:完全匹配、通配符在前的,如*.test.com、通配在后的,如www.test.*、正则匹配,如~^.www.test.com$
3.反向代理
3.1 网关、正向代理、反向代理
- 网关
网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器,与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。网关(Gateway)就是一个网络连接到另一个网络的“关口”。也就是网络关卡。Gate在英文中就是大门的意思。 - 正向代理
正向代理:是指用户利用代理服务器访问目标服务器。也就是说,代理服务器的代理对象是用户。如下图所示。
- 反向代理
反向代理的对象则是 目标服务器。是指服务端利用代理服务器给用户提供服务。
和正向代理相比,二者都是利用代理服务器实现的,不过反向代理的主语是服务端,所以说反向代理对于用户来说是透明的,在用户的视野里,代理服务器便是目标服务器。
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负载均衡
-
什么是负载均衡
当一台服务器的访问量越大时,服务器所承受的压力也就越大,超出自身所指定的访问压力就会崩掉,避免发生此类事情的发生,因此也就有了负载均衡来分担服务器的压力。
那么究竟什么是负载均衡呢
?通俗些讲,就是我们有几十台、几百台甚至更多服务器,将这些服务器组成一个服务器集群,当客户端访问某台设备的数据时,首先发送的请求先到一台中间服务器,并通过中间服务器在服务器集群中平均分摊到其他服务器
中,因此,当用户每次所发送的请求都将会保证服务器集群中的设备均与平摊
,以此来分担服务器的压力,从而保持服务器集群的整理性能最优,避免出现有崩溃的现象。 -
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;
}
}
}
常见的几种策略
- 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机器。
- ip_hash
根据客户端的ip地址转发同一台服务器,可以保持回话。 - least_conn
最少连接访问 - url_hash
根据用户访问的url定向转发请求,根据url的hash值定向转发到特定的服务器(使用场景:固定资源不在统一服务器) - fair
根据后端服务器响应时间转发请求(有流量去倾斜的风险)
4.动静分离
4.1什么是动静分离
为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片、js、css等文件,可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。对于用户请求的动态文件,如servlet、jsp,则转发给Tomcat,Jboss服务器处理,这就是动静分离。即动态文件与静态文件的分离。
4.2动静分离的原理
动静分离可通过location对请求url进行匹配,将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。通常将静态资源放到nginx中,动态资源转发到tomcat服务器中。
4.3使用正则配置动静分离
- 常见的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)
- 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 /)
实际网站使用中,至少有三个匹配规则定义:
- 第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
proxy_pass http://127.0.0.1:8080/;
}
- 第二个必选规则
处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
- 第三个规则
通用规则,用来转发动态请求到后端应用服务器
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实战
- 开启防火墙
systemctl start firewalld
- 重启防火墙
systemctl restart firewalld
- 重载规则
firewall-cmd --reload
- 查看已配置规则
firewall-cmd --list-all
- 指定端口和ip访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
- 移除规则
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地址
同理修改备用机并启动