Nginx

Nginx

Nginx 三大功能:

  1. 请求转发:

在大型的项目中,因为服务器在后端较多,访问端口不同,此时就会造成请求每个服务器路径的端口号不一致,这样不方便跳转增加代码整体复杂程度,此时就需要nginx,所有的访问路径使用一个请求端口,由nginx将请求转发到具体的服务器(根据地址中包含的唯一标识)

  1. 负载均衡

  2. 动静分离

一、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地址即可:

如果出现以下内容,表示启动成功 :

1652349456561

如果访问失败,可能是你的防火墙没有关闭。

# 关闭防火墙
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 进程原理图

1652350880900

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 的理解:

普通的数据传输方式:

  1. 调用read函数,文件数据拷贝到内核缓冲区
  2. read函数返回,数据从内核缓冲区拷贝到用户缓冲区
  3. 调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区
  4. 数据从内核socket缓冲区拷贝到协议引擎中

最终会通过网络接口响应给浏览器【互联网】,此过程经历了四次拷贝:

​ 硬盘—>内核缓冲区—>用户缓冲区—>内核socket缓冲区—>协议引擎

开启 sendfile on 后:

  1. sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后数据被拷贝到内核socket缓冲区中

  2. DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中

       <span style="color:red"> 硬盘—>内核缓冲区—>内核socket缓冲区—>协议引擎  </span>
    

没有用户缓冲区的切换,大大提升了传输性能。

1652352169724

三、实战篇

3.1、虚拟主机实战篇

HTTP 协议详解:

(35条消息) HTTP 协议_2022加油呀的博客-CSDN博客

域名:

  • 通常域名是指向 IP 地址,为了记忆方便,不需要在地址栏上输入访问的 IP 地址,因此出现了域名

域名由什么组成:

  • 拿 baidu.com 来说,后边的 .com 就是域名【顶级域名】,常见的比如:.vn .org .net …等等
    • taobao 是二级域名,如果 ju.taobao.com 那么,ju 就是 三级域名
  • 域名的不同通常对应不同的业务模块,因为一个项目中,多个域名对应同一个 IP 地址是非常常见的。
  • 如果需要别人从外网访问 自己的IP ,需要注册购买的 !

1、修改本机域名

找到本机上的 hosts 文件,这种方式外网访问不到

1652433436328

该域名对应我的虚拟机地址: 192.168.200.132

在本机上只需访问该域名就能映射到我的 IP 地址

2、阿里云购买域名

交易首页-域名交易首页-万网-阿里云旗下品牌 (aliyun.com)

通过购买对应的域名 映射到 具体的 IP 地址 !

购买跟着提示进行操作即可。

买完后,进行解析:

1652438150945

注意:

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

这时通过访问不同的端口,就可以访问不同的 页面

192.168.200.132:88

192.168.200.132:80

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、多级域名

1652513429750

2、短网址

短网址顾名思义 将域名缩短,变成一个相对较短的网址,减少字节数

1652513745787

1652514070887

四、反向代理、负载均衡

反向代理

1652514865902

正向代理

1652515759350

可以这么理解:

正向代理 基于 客户端架构的,真正代理的是 客户端 ,向外网发送请求

反向代理 基于 服务器架构的,真正代理的是 服务器 ,代替服务器接受/发送 请求/数据

负载均衡

由 Nginx 将工作分步到多个服务器中, 来提高网站、应用、数据库或其他服务的性能和可靠性。

1652517042693

配置反向代理

    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 访问。

1652526317959

配置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地址 

网关服务器

1652614698644

七、防盗链基本配置

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 相连

1652618683813

安装 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
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨瓜2号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值