Nginx
Nginx 三大功能:
- 请求转发:
在大型的项目中,因为服务器在后端较多,访问端口不同,此时就会造成请求每个服务器路径的端口号不一致,这样不方便跳转增加代码整体复杂程度,此时就需要nginx,所有的访问路径使用一个请求端口,由nginx将请求转发到具体的服务器(根据地址中包含的唯一标识)
-
负载均衡
-
动静分离
一、Linux 安装Nginx
下载链接:
Index of /download/ (nginx.org)
下载 .tar.gz 的安装包即可
使用 xftp 将下载好的 tar 包,放到 nginx 目录下,并进行解压:
tar -xzvf nginx-1.21.6
解压好并进入到 nginx-1.21.6 目录 中,依次安装环境:
# 安装 gcc 环境,如果有可跳过
yum install -y gcc
# 安装 perl 库,如果有可跳过
yum install -y pcre pcre-devel
# 安装 zlib 库,如果有可跳过
yum install -y zlib zlib-devel
编译安装,同时也可以使用本命令检查需要哪些环境,也可以指定安装位置:
# 不指定安装位置
./configure
# 指定安装位置
./configure --prefix=/usr/local/nginx
进入到 nginx-1.21.6 目录中进行编译:
make #编译
make install #安装
启动关闭命令:
必须在 /usr/local/nginx/sbin
目录下
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
启动 nginx 后,浏览器输入 虚拟机IP地址即可:
如果出现以下内容,表示启动成功 :
如果访问失败,可能是你的防火墙没有关闭。
# 关闭防火墙
systemctl start firewalld.service
# 查询防火墙启动状态
systemctl status firewall.service
创建 Nginx 脚本设置成系统服务:
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
如果在启动失败,并提示 nginx.pid 没有,那么就在 /usr/local/nginx/logs/ 目录下创建一个 nginx.pid 就好了。
touch nginx.pid
设置开机自启动:
# 设置开机自启动
systemctl enabled nginx.service
# 查看开机自动状态
systemctl is-enabled nginx.service
二、Nginx 的基本使用
1、目录介绍
sbin
---- nginx : Nginx 的主程序
logs
---- nginx.pit : 记录 Nginx 的主进程号
---- error.log : 记录 Nginx 的错误信息
---- access.log : 记录访问信息
html ---- 用于存放静态资源
---- index.html : 浏览器访问 IP 地址时展现的静态欢迎页面,可以编辑修改
---- 50x.html : 错误页面
conf ---- 所有的 Nginx 配置文件
2、Nginx 进程原理图
Nginx 是多进程的,Master为主进程,Worker 为子进程
主进程只负责对所有的子进程协调工作,并不会参与到 请求处理中…
子进程负责 所有的请求处理,以及页面响应…
3、nginx.conf 配置文件详解
省略了注释部分
# 开启的进程数,默认就是 1
worker_processes 1;
events {
# 每个进程可以连接数
worker_connections 1024;
}
http {
# 引入外部配置文件
# mime.types 文件里,保存了文件后缀和类型的对应关系
# 其实在浏览器区分文件的类型,并不是根据后缀名来区分的
# 而是根据文件后缀对应的类型
include mime.types;
# mime中没有的类型。默认使用 application/octet-stream;
default_type application/octet-stream;
# Nginx 在进行数据传输时,会有更少的数据拷贝动作
sendfile on;
keepalive_timeout 65;
# 一个 server 代表一个虚拟主机
# 可以配置多个主机
server {
# 监听的端口
listen 80;
# 域名-主机名
server_name localhost;
# 访问路径 / 跳转的页面 html
location / {
# 根目录
root html;
# 默认页名称
index index.html index.htm;
}
# 服务器内部的错误,跳转到的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
对 sendfile on 的理解:
普通的数据传输方式:
- 调用read函数,文件数据拷贝到内核缓冲区
- read函数返回,数据从内核缓冲区拷贝到用户缓冲区
- 调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区
- 数据从内核socket缓冲区拷贝到协议引擎中
最终会通过网络接口响应给浏览器【互联网】,此过程经历了四次拷贝:
硬盘—>内核缓冲区—>用户缓冲区—>内核socket缓冲区—>协议引擎
开启 sendfile on 后:
sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后数据被拷贝到内核socket缓冲区中
DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中
<span style="color:red"> 硬盘—>内核缓冲区—>内核socket缓冲区—>协议引擎 </span>
没有用户缓冲区的切换,大大提升了传输性能。
三、实战篇
3.1、虚拟主机实战篇
HTTP 协议详解:
域名:
- 通常域名是指向 IP 地址,为了记忆方便,不需要在地址栏上输入访问的 IP 地址,因此出现了域名
域名由什么组成:
- 拿 baidu.com 来说,后边的 .com 就是域名【顶级域名】,常见的比如:.vn .org .net …等等
- taobao 是二级域名,如果 ju.taobao.com 那么,ju 就是 三级域名
- 域名的不同通常对应不同的业务模块,因为一个项目中,多个域名对应同一个 IP 地址是非常常见的。
- 如果需要别人从外网访问 自己的IP ,需要注册购买的 !
1、修改本机域名
找到本机上的 hosts 文件,这种方式外网访问不到
该域名对应我的虚拟机地址: 192.168.200.132
在本机上只需访问该域名就能映射到我的 IP 地址
2、阿里云购买域名
交易首页-域名交易首页-万网-阿里云旗下品牌 (aliyun.com)
通过购买对应的域名 映射到 具体的 IP 地址 !
购买跟着提示进行操作即可。
买完后,进行解析:
注意:
1、购买完的域名,需要进行解析才能使用
2、如果修改 DNS 域名解析器,需要等待 对多 48 小时,才能生效
3、或者手动设置本机 IPv4 的 DNS 为公用DNS 114.114.114.114
3、俩种方式配置虚拟主机
创建站点目录:
/
---- www
---- a
---- index.html
---- b
---- index.html
3.1 基于不同的端口的形式
修改 nginx.conf
# 第一个端口
server {
listen 80;
server_name localhost;
location /{
root /www/a;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 第二个端口
server {
listen 88;
server_name localhost;
location /{
# 站点的根目录
root /www/b;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
修改完重启 nginx 服务
systemctl reload nginx
这时通过访问不同的端口,就可以访问不同的 页面
3.2 基于不同的域名的形式
注意:
端口号 + 域名必须是唯一的 ,不能重复 !
server {
listen 80;
# 设置域名
server_name a.yzgcf.vip;
location / {
root /www/a;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
# 设置域名
server_name b.yzgcf.vip;
location / {
root /www/b;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3.2 server_name 匹配方式
server_name 域名/主机 匹配规则 :
完整匹配 :完整的域名,并且能匹配多个,中间用空格分开
server_name b.yzgcd.vip bbbbb.yzgcd.vip;
通配符匹配
server_name *.yzgcd.vip;
通配符结束匹配
server_name a.yzgcd.*;
正则匹配
server_name ~^[0-9]+\.yzgcf\.vip$;
注意:
如果所有的 server_name 都没有匹配上,默认匹配第一个 server!!
3.3 基于域名的几种互联网需求
1、多级域名
2、短网址
短网址顾名思义 将域名缩短,变成一个相对较短的网址,减少字节数
四、反向代理、负载均衡
反向代理
正向代理
可以这么理解:
正向代理 基于 客户端架构的,真正代理的是 客户端 ,向外网发送请求
反向代理 基于 服务器架构的,真正代理的是 服务器 ,代替服务器接受/发送 请求/数据
负载均衡
由 Nginx 将工作分步到多个服务器中, 来提高网站、应用、数据库或其他服务的性能和可靠性。
配置反向代理
server {
listen 80;
server_name *.yzgcf.vip;
location / {
# 访问根目录时,会自动代理到 百度
proxy_pass http://www.baidu.com;
# root /www/b;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
可以代理 IP 地址,或者多个 IP 地址
配置负载均衡
# 配置负载均衡
upstream httpds{
server 192.168.200.133;
server 192.168.200.134;
}
server {
listen 80;
server_name *.yzgcf.vip;
location / {
# httpds 是与 负载均衡设置的名字一致的
proxy_pass http://httpds;
# root /www/b;
# index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
如果有多台服务器 IP ,采用的是轮询的工作方式,一台服务器访问一次 !
负载均衡策略 — 权重 weight
默认为1,权重越高处理的数据就会越多!
# 配置负载均衡
upstream httpds{
server 192.168.200.133 weight=8;
server 192.168.200.134 weight=2;
}
负载均衡策略 — down
不参与负载均衡
# 配置负载均衡
upstream httpds{
server 192.168.200.133 weight=8 down;
server 192.168.200.134 weight=2;
}
负载均衡策略 — backup
指定备用服务器,当所有的服务器都down掉之后,启动备用服务器
# 配置负载均衡
upstream httpds{
server 192.168.200.133 weight=8 backup;
server 192.168.200.134 weight=2 down;
}
五、动静分离配置
动静分离其实就是将项目的静态资源全部交给 Nginx 来处理
将web项目项目放到 192.168.200.133 这台虚拟机的 Tomcat的 webapp的 ROOT 目录下:
1、通过 192.168.200.132 这台服务器反向代理到 192.168.200.133 服务器上
2、将 192.168.200.133 中项目的静态资源存放到192.168.200.132 的 Nginx 的 html 目录中。然后通过 配置 location 访问。
配置192.168.200.132的反向代理、location:
server { listen 80; server_name *.yzgcf.vip; location / { proxy_pass http://192.168.200.133:8080; } location /static/css{ root html; index index.html index.htm; } location /static/img{ root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
location 匹配规则:
/
通用匹配,任何请求都会匹配到。
=
精准匹配,不是以指定模式开头
~
正则匹配,区分大小写
~*
正则匹配,不区分大小写
通过正则表达式配置多个静态资源目录,不用写多个 location:
location ~*(/static/css|/static/img){
root html;
index index.html index.htm;
}
location 匹配顺序
多个正则 location 直接按书写顺序匹配,成功后就不会继续往后面匹配
普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
六、UrlRewrite 重写
语法:
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。
rewrite [flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字error_log不能改变
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
网关服务器
七、防盗链基本配置
Nginx 用于实现防盗链功能的模块为 **refer 模块 **, 其依据的原理是:
如果网站盗用了你的图片,那么用户在点击或者查看这个盗链内容时,发送 http 请求的头部中的 referer 字段将为该盗版网站的 url
配置在不想让别人访问的 location 地址中:
location ~*(/static/css|/static/img){
# 防盗链设置
valid_referers 192.168.200.132;
if ($invalid_referer) {
return 403;
}
root html;
index index.html index.htm;
}
none, 检测 Referer 头域不存在的情况。
blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以
“http://” 或 “https://” 开头。
server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
使用 Curl 测试:
安装 curl
yum install 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
防盗链配置返回错误页面
location ~*(/static/css|/static/img){
# 防盗链设置
valid_referers 192.168.200.132;
if ($invalid_referer) {
return 403;
}
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 跳转到自定义页面
error_page 403 /403.html;
location = /403.html {
root html;
}
防盗链配置返回错误图片
location ~*(/static/css|/static/img){
# 防盗链设置
valid_referers 192.168.200.132;
if ($invalid_referer) {
# 返回错误图片
rewrite ^/ /static/img/code.bmp break;
# return 403;
}
root html;
index index.html index.htm;
}
八、Keepalived 高可用
对 Nginx 进行一个备份,使用 keepalived 互相监测 是否还在正常运行
提供一个 Vip【虚拟 ip】与 正在运行的 Nginx 连接,如果该 Nginx 突然 down 掉,则与另一个 Nginx 相连
安装 Keepalived
yum install -y keepalived
简单配置 keepalived :
192.168.200.132
! Configuration File for keepalived
global_defs {
router_id lb132
}
vrrp_instance VI_1 {
state MASTER
# 网卡名
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# VIp 地址
virtual_ipaddress {
192.168.200.150
}
}
192.168.200.133
! Configuration File for keepalived
global_defs {
router_id lb133
}
vrrp_instance VI_1 {
# 备用机
state BACKUP
# 网卡名
interface ens33
virtual_router_id 51
# 优先级
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# VIp 地址
virtual_ipaddress {
192.168.200.150
}
}