一、Nginx 基本介绍
1、什么是Nginx?
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
- Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
以上信息摘自百度百科
杀死nginx进程
taskkill /f /t /im nginx.exe
2、DNS 域名解析的大概过程
假设某个用户在浏览器输入 www.abc.com 回车后,这时的DNS解析过程如下所示:
- 本机查询:浏览器检查本身缓存中是否存在这个域名的解析结果(即这个域名对应的IP地址),如果缓存中存在,则解析到此为止。如果浏览器缓存中没有,则浏览器会查找操作系统的缓存中是否存在这个这个域名对应的DNS解析结果,如果存在,则解析结束。否则,在
C:\Windows\System32\drivers\etc\hosts
文件中查询该域名对应的IP地址,存在则解析结束,并将该结果缓存在操作系统中。
- 在
Linux
中通过修改/etc/hosts
文件配置域名和IP的对应关系 - 域名缓存的时间受域名的失效时间和缓存空间大小限制。
- 域名被缓存的时间可以通过TTL属性设置
- LDNS(本地区域名服务器)查询:这个域名服务器一般都是运营商提供的。这个专门的域名解析服务器性能否会很好,它们一般会缓存域名解析结果,当然,缓存的时间是由域名失效时间控制的。一般情况下,大多数的域名解析都到此为止了。
- Windows下可以通过
ipconfig
查询 - Linux下通过
cat /etc/resolv.conf
查询
- 如果 LDNS 仍然没有找到,就直接到 **根(Root Server) 域名服务器(.)**请求解析
- 根域名服务器会给本地域名服务器返回所查询域名对应的主域名服务器(gTLD Server)地址。gTLD 代表国际顶级域名服务器,如:.com、.cn、.org等,全球大概13台左右。
- 本地域名服务器(LDNS)向返回的顶级域名服务器发送请求
- 顶级域名服务器查找并返回该域名对应的 Name Server 域名服务器地址,这个 Name Server 通常就是我们注册的域名服务器,例如是在阿里买的域名,那么这个域名解析的任务就由阿里提供的服务器来完成。
- Name Server 域名服务器查询存储的域名和IP的映射关系表,在正常情况下都会找到目标域名对应的IP记录,然后连同一个 TTl 值返回给 LDNS
- LDNS 缓存这个域名和IP的对应关系,缓存时间由返回的TTL值控制
- 把解析结果返回给用户,用户根据TTL值把结果缓存在本机缓存中,到此域名解析结束。
在实际的 DNS 解析过程中,可能还不只这些步骤,Name Server 可能存在级,或者有一个 GTM 来进行负载均衡,这些都可能影响域名解析的结果
可通过 nslookup 查询域名解析结果 nslookup + 域名。Linux 和 Windows 都行。
Linux 也可通过 dig + 域名 查询 DNS 解析过程
3、正向代理和反向代理的区别?
- 正向代理:隐藏客户端的真实行为。例如VPN
- 反向代理:隐藏真实服务器地址,客户端的请求通过代理服务器转发到真实服务器
二、Nginx 应用场景
- HttpWeb服务器
- 构建静态Web站点
- 做虚拟主机
- 展示html、css等静态资源
- 做CDN资源服务器
- 支持rtmp协议,直播推流
- 使用使用http协议作为短视频、多媒体资源服务器(优酷、抖音)
- 做文件下载服务器(rar、exe文件)
- 高性能网关、反向代理服务器
- 内网服务器和外网服务器隔离
- 通过隧道模式完成请求转发
- 支持HTTP的7层或TCP/UDP的4层请求转发
- 日志采集
- 供大数据分析
- 使用 http 协议,接收用户请求
- 返回简单报文
- 收集用户访问日志(京东、淘宝)
- 应用服务器
- 整合PHP、Perl、Python、Lua等语言
- 内存缓存
- 可以连接其它中间件
- 负载均衡器
- 内置轮询、权重、ip-hash等算法
- 可自定义负载均衡算法
- Cookies的会话保持问题
- 软防火墙
- 使用 Lua 等语言在 Nginx 的基础上进行二次开发
- 请求规则匹配
- 过滤非法请求达到流量清洗的作用
三、Nginx 基础使用
1、Nginx 的目录结构
conf、contrib、docs、html、logs、temp、nginx.exe
conf:存放配置文件 (核心配置文件:nginx.conf)
contrib:存放一些实用工具
docs:文档目录
html:网页文件目录
logs:存放 nginx 运行过程中的日志
temp:临时文件目录
nginx.exe:nginx 的启动程序
2、基于 Nginx 的web服务器
- 配置虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
server {
listen 80; 监听端口号
server_name localhost; 主机名
location / { 匹配路径
root html; 文件根目录
index index.html index.htm; 默认页名称
}
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root html;
}
}
# 解释:访问端口为80 location为/ 访问的 html 文件目录,找到 index.html 页面访问,出错则根据错误码返回 html 目录下对应的页面
- server_name 匹配规则
servername 匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
- 完整匹配:可以在同一 servername 中匹配多个域名
server_name:aa.com、bb.com、cc.com;
- 通配符匹配
server_name:*.abc.com;
- 通配符结束匹配
server_name:abc.*;
- 正则匹配
server_name:~^[0-9]+\.mmban\.com$;
- location 匹配规则
通过指定模式来与客户端请求的URI相匹配,基本语法:
location [=|~|~\*|^~|@] pattern{……}
- 通用匹配,任何请求都会匹配到:
/
- 普通字符精确匹配:
=
- 普通字符匹配:
^~
- 区分大小写的正则匹配:
~
- 不区分大小写的正则匹配:
~*
- location匹配顺序
-
多个正则 location 直接按书写顺序匹配,成功后就不会继续往后面匹配
-
普通(非正则)location 会一直往下,直到找到匹配度最高的(最大前缀匹配)
-
当普通 location 与正则 location 同时存在,如果正则匹配成功,则不会再执行
-
普通匹配 所有类型 location 存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) { root /usr/local/nginx/static; index index.html index.htm; }
3、基于 Nginx 实现反向代理
- 配置虚拟主机
server {
listen 80; #监听端口号
server_name test.local.com; #主机名
location / { #匹配路径
proxy_pass http://127.0.0.1:8081;
}
error_page 500 502 503 504 /50x.html; #报错编码对应页面
location = /50x.html {
root html;
}
}
proxy_pass末尾带斜杠/和不带的区别
- 如果proxy_pass末尾有斜杠/,proxy_pass不拼接location的路径
- 如果proxy_pass末尾无斜杠/,proxy_pass会拼接location的路径
4、基于 Nginx 实现负载均衡
注意:负载均衡效果谷歌浏览器需要直接从浏览器中访问才可以生效
- 配置虚拟主机
# 定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server test.local.com:8081 weight=1;
server test.local.com:8082 weight=2;
server test.local.com:8083 weight=3;
}
# 测试配置
server {
listen 80;
server_name test.local.com;
location / {
proxy_pass http://backServer; # 指定上游服务器的负载均衡服务器
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2yClHZxv-1684925224244)(E:\study\Nginx\图片\nginx的负载均衡)]
- 负载均衡策略
- 轮训:默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。
- 权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash:根据客户端的ip地址转发同一台服务器,可以保持会话。
- least_conn:最少连接访问
- url_hash:根据用户访问的url定向转发请求,后端服务作缓存时比较有效。
- fair:根据用户访问的url定向转发请求,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- 服务集群化的问题:
- 分布式事务
- 分布式 session
- 分布式日志
- 分布式任务调度
- …
- upstream 的配置
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:表示当前的 serve r暂时不参与负载
# weight:默认为1 weight 越大,负载的权重就越大。
# backup: 其它所有的非 backup 机器 down 或者忙的时候,请求backup机器。
- 负载与硬负载区别
- 软负载是基于服务器上安装的特定软件比如 Nginx 实现负载均衡
- 硬负载均衡是基于固定的硬件实现负载均衡比如 F5
5、基于 Nginx 实现动静分离
前后分离: 将前端业务逻辑与后端完全分开 比如 vue+SpringBoot架构
动静分离: 将静态资源资源与动态资源分开部署;
-
配置虚拟主机
server { listen 80; #监听端口号 server_name test.local.com; #主机名 location / { #匹配路径 proxy_pass http://127.0.0.1:8081; root html; index index.html index.htm; } location /css { root /usr/local/nginx/static; index index.html index.htm; } location /images { root /usr/local/nginx/static; index index.html index.htm; } location /js { root /usr/local/nginx/static; index index.html index.htm; } error_page 500 502 503 504 /50x.html; #报错编码对应页面 location = /50x.html { root html; } }
-
alias与root
location /css {
alias /usr/local/nginx/static/css;
index index.html index.htm;
}
- root 用来设置根目录会加上 location,而 alias 在接受请求的时候在路径上不会加上 location。
- root 指定的目录是 location 匹配访问的 path 目录的上一级目录,这个 path 目录一定要是真实存在 root 指定目录下的;
- root 目录配置 中,location 匹配的 path 目录后面带不带"/",都不会影响访问。
- alias 指定的目录是准确的,即 location 匹配访问的 path 目录下的文件直接是在 alias 目录下查找的;
- 使用 alias 标签的目录块中不能使用 rewrite 的break(具体原因不明);
- alias 指定的目录后面必须要加上"/"符 号!! (没测试出来)
- alias 虚拟目录配置中,location 匹配的 path 目录如果后面不带"/“,那么访问的 url 地址中这个 path 目录后面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果 location 匹配的 path 目录后面加上”/“,那么访问的 url 地址中这个 path 目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/",访问就会失败!
- alias 示例
server {
listen 8888;
server_name test.local.com;
location /html {
alias D:/DeveloperTools/nginx/nginx-1.19.2/html/java_web;
index index.html index.htm;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GFljVqYa-1684925224246)(E:\study\Nginx\图片\nginx的alias)]
-
root 示例
server { listen 9999; server_name test.local.com; location /html { root D:/DeveloperTools/nginx/nginx-1.19.2; index index.html index.htm; }
6、基于 Nginx 解决跨域问题
基本概念
- 跨域:浏览器对于 javascript 的同源策略的限制,例如 a.cn下面的 js 不能调用 b.cn 中的 js,对象或数据(因为 a.cn 和 b.cn 是不同域),所以跨域就出现了.
- 同源策略:请求的 url 地址,必须与浏览器上的 url 地址处于同域上,也就是域名,端口,协议相同.
- 请求能够正常到达服务器端,但是无法获取响应结果。
解决方案
-
服务器端设置响应头,允许跨域
response.setHeader("Access-Control-Allow-Origin", "*");
-
使用jsonp解决网站跨域问题 缺点:只能支持 Get 请求 原理:模拟脚本提交。
-
使用 Nginx 搭建API网关保持域名、端口和协议一致。重点:Location
-
使用微服务中的 Zuul 网关
-
HttpClient 实现转发 缺点:重复发送两次请求
server {
listen 80;
server_name test.local.com;
location / {
proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
UrlRewrite
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容, 重定向到replacement,结尾是flag标记。
rewrite语法格式及参数语法:rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
- rewrite:关键字,其中关键字error_log不能改变
- 正则:perl兼容正则表达式语句进行规则匹配
- 替代内容:将正则匹配的内容替换成replacement
- flag标记:rewrite支持的flag标记
rewrite参数的标签段位置: server,location,if
flag标记说明:
-
last:本条规则匹配完成后,继续向下匹配新的location URI规则
-
break:本条规则匹配完成即终止,不再匹配后面的任何规则
-
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
-
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
应用服务器防火墙配置
- 开启防火墙:
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 ;
}
防盗链配置
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;
}
- 使用curl测试:
curl -I http://192.168.44.101/img/logo.png
- 带引用:
curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
7、Nginx 的高可用配置
本质:搭建 nginx 集群,利用 lvs 的虚拟 vip 功能 ,所有 nginx 都配置相同的虚拟 vip,实现 nginx 的负载均衡,通过 keepAlived 对 nginx 进程进行监控,一旦发现某台机器的 nginx 宕机就通过脚本自动重启。
基于 Nginx + Lvs + keepAlived 实现 Nginx 的高可用
Lvs 介绍:
- LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。(百度百科)
- LVS 的核心可以实现虚拟 vip,实现对 Nginx 负载均衡功能
- LVS 已经在虚拟机中集成了,不需要手动安装
keepAlived 介绍:
- keepAlived 对服务器状态检测并且进行故障隔离
- 如果有一台 服务器死机,或工作出现故障将有故障的服务器从系统中剔除,当服务器工作正常后 Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
- 类似于心跳机制,主动发起请求监测
- keepAlived 对 lvs 的功能进行了扩展,也可以配置虚拟 vip
lvs 与 Nginx 的区别
- Lvs 是四层负载均衡基于 ip+端口 实现负载均衡
- Nginx 是基于应用层 Http 层实现的七层负载均衡
- Lvs 相比 Nginx 实现负载均衡抗负载能力更加强、稳定
安装 Keepalived
-
下载keepalived
#网址: https://www.keepalived.org/download.html# #例如: wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz #如过安全证书过期则通过不安全方式下载: wget --no-check-certificate http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
-
解压
#-C /usr/local/ 代表解压到 /usr/local/ 这个路径下
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
- 编译安装
#进入 /usr/local/keepalived-1.2.18 目录,执行如下命令
./configure --prefix=/usr/local/keepalived
#如果报如下错误
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/usr/local/keepalived-1.2.18':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
#执行如下命令
yum install gcc
#如果执行 yum install 出错:File contains no section headers.
解决方案:
步骤1:删除yum.repos.d目录下所有文件
rm -f /etc/yum.repos.d/*
步骤2:然后重新下载阿里的镜像
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
步骤3:清理缓存
yum clean all
步骤4:测试下载安装
yum install gcc
#然后再次执行
./configure --prefix=/usr/local/keepalived
#如果在报如下错误
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
#执行如下命令
yum install openssl-devel
#然后再次执行
./configure --prefix=/usr/local/keepalived
#编译成功后,出现类似内容,就算成功
Keepalived configuration
------------------------
Keepalived version : 1.2.18
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No
#最后进行安装
make && make install
Keepalived 安装成 Linux 系统服务
将 keepalived 安装成 Linux 系统服务,因为没有使用 keepalived 的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:
-
首先创建文件夹,将 keepalived 配置文件进行复制:
mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
-
然后复制 keepalived 脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s /usr/local/sbin/keepalived /usr/sbin/ ln -s /usr/local/keepalived/sbin/keepalived /sbin/
-
设置开机启动:
chkconfig keepalived on
Keepalived 常用的命令
- 启动:
service keepalived start
- 停止:
service keepalived stop
启动报错Starting keepalived (via systemctl): Job for keepalived.service failed. See 'systemctl status keepalived.service' and 'journalctl -xn' for details.
解决办法
[root@edu-proxy-01 sbin]# cd /usr/sbin/
[root@edu-proxy-01 sbin]# rm -f keepalived
[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
配置虚拟 vip
vi /etc/keepalived/keepalived.conf
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER #来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.212.140 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.110.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
nginx 重启脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
nginx 集群搭建
每台服务器都安装 keepalived 配置一个虚拟 vip ,配置主从关系,当主挂了,直接走备机。
注意:阿里云默认不支持虚拟VIP技术