Nginx学习笔记 - 新

这篇具有很好参考价值的文章主要介绍了Nginx学习笔记 - 新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

跟着 https://www.bilibili.com/video/BV1yS4y1N76R 视频学的
安装教程 nginx环境搭建

通过不同域名相同端口访问不同页面

首先添加hosts,映射下域名到装nginx的主机IP地址,我这里是虚拟机,且没有买域名就自己本地这样玩
Nginx学习笔记 - 新

进入nginx安装目录,打开nginx.conf,添加俩虚拟主机server

	#代表如果是www.sb.com:81访问的,则会访问/usr/local/nginx/www/www/www.html页面
    server {
        listen       81; #监听81端口
        server_name  www.sb.com;#通过域名www.sb.com访问

        location / {
            root	www/www;#开头没斜杠,代表相对路径,即nginx根目录下的www/www目录
           	index	www.html;#index 的作用就是当没有访问任何文件时,则默认访问 index.html
        }

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

    }
    
	#代表如果是sss.sb.com:81访问的,则会访问/usr/local/nginx/www/sss/sss.html页面
    server {
        listen       81;
        server_name  sss.sb.com;

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

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

    }

配置完重启服务生效:systemctl reload nginx
访问,如果中文乱码按照这个来nginx乱码问题文章解决
Nginx学习笔记 - 新
Nginx学习笔记 - 新

反向代理 - 请求外网或内网主机

使用 proxy_pass 配置

到外网

比如访问nginx的ip:192.168.80.131,会重定向到百度,浏览器地址也会调到百度

location / {
                proxy_pass http://www.baidu.com/; 表示页面重定向到百度
                index  index.html index.htm;
}

到内网其他主机

比如又开了一台nginx,IP是192.168.80.132
我想从192.168.80.131访问到192.168.80.132

    location / {
                proxy_pass http://192.168.80.132;
                index  index.html index.htm;
            }

Nginx学习笔记 - 新

负载均衡

Nginx有两种负载均衡模块stream模块和http模块。它们分别用于不同的网络层协议,具有以下区别:
协议层面:stream模块用于TCP和UDP协议,可以负载均衡诸如SMTP、DNS、TCP代理等服务器;而http模块用于HTTP协议,可以负载均衡HTTP服务器。
协议解析:stream模块在传递数据时不会解析协议的内容,它仅仅将请求转发到后端服务器,整个数据流的内容保持原样不变;而http模块对HTTP协议有基本的解析,可以根据HTTP请求的头部、内容等信息进行更加细粒度的负载均衡操作。
配置方式:stream模块使用stream指令块进行配置,负载均衡基于IP和端口;http模块使用http指令块进行配置,负载均衡基于HTTP请求的URL、头部等信息。
综上所述,stream模块用于底层协议的负载均衡,适用于非HTTP的协议;http模块用于HTTP协议的负载均衡,适用于负载均衡HTTP服务器。选择适当的模块取决于你要负载均衡的具体协议和应用场景。

http负载示例

使用upstream + proxy_pass 配置组合,默认轮询配置的几个负载server

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
        
    keepalive_timeout  65;

    upstream myserver{
        server 192.168.80.132;
        server 192.168.80.133;
    }

    server {
        charset utf-8; #解决乱码,多个server每个都要加
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://myserver;
            index  index.html index.htm;
        }

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

TCP和UDP协议负载示例

stream {
    upstream peer{
        hash $remote_addr consistent;
        server 172.16.246.124:7051 weight=1  max_fails=1 fail_timeout=2s;
        server 172.16.246.125:7051 weight=1  max_fails=1 fail_timeout=2s;
        server 172.16.246.126:7051 weight=1  max_fails=1 fail_timeout=2s;
    }

    server {
        listen 8052;
        #建连后无数据时与后端服务器连接保持时间,默认75s
        proxy_timeout 600s;
        proxy_pass peer;
    }
}

以上配置为一个stream块的示例,用于配置TCP或UDP协议的负载均衡。

upstream peer定义了一个叫做"peer"的后端服务器组,其中包含了三个服务器节点。

hash $remote_addr consistent使用源IP地址进行哈希选择,确保相同IP的客户端每次请求都会被转发到同一个后端服务器。"consistent"关键字指定了一致性哈希算法。

每个server指令定义了一个后端服务器及其相应的配置参数,如IP地址、权重等。weight表示权重,决定了后端服务器被选中的概率。max_fails表示允许的最大失败次数,如果超过最大失败次数,则Nginx会把该服务器标记为不可用一段时间。fail_timeout表示失败超时时间,在该时间内服务器会被标记为不可用。

listen 8052指定了stream块监听的端口号为8052。

proxy_timeout 600s设置了与后端服务器建立连接后,在无数据传输时保持连接的时间为600秒。

proxy_pass peer将请求代理转发到名为"peer"的upstream后端服务器组。

总体而言,上述配置实现了一个TCP或UDP协议的负载均衡服务,通过源IP哈希选择后端服务器,并对后端服务器的可用性进行检测和管理。

权重

权重数值可以是
任意正整数,Nginx会根据给定的权重数值将请求分配给后端服务器

    upstream myserver{
        server 192.168.80.132 weight=2;#2/17概率
        server 192.168.80.133 weight=10;10/17概率
	    server 192.168.80.134 weight=5;5/17概率
    }

真实案例:在java集群服务下载文件,自动负载到有文件的服务器上

需求:用户在页面上点击导出按钮,然后生成文件,下面的代码就是提供下载的接口
问题:由于服务部署在多台(集群),生成的文件只会在其中一台,这时候,前端想要下载就没办法知道是哪一台
解决办法(不完美):通过nginx去负载每一台服务器,如果后端返回404或者其他错误,就会轮训到下一台服务器,前端通过nginx所属的服务器IP去访问,如http://172.0.0.3/waterDataRaw/download/test.zip,实际会转发到http://172.0.0.1:81/waterDataRaw/download/test.ziphttp://172.0.0.2:81/waterDataRaw/download/test.zip
问题:由于前端访问后端的接口是通过域名访问,域名又转发到任意一台网关上,所以这个upstream我写的是服务的所属IP和端口,并没有走网关,前端要写死nginx服务器的IP,无法统一用域名访问,主要我也不知道如何写这个配置转发,转发又转发?

    @ApiOperation(value = "下载导出的压缩包")
    @GetMapping(value = "/download/{zipFileName}")
    public void download(@PathVariable String zipFileName, HttpServletResponse response) {
        String zipFilePath = waterDataRawExcelDownloadPath + zipFileName;
        if (!FileUtil.exist(zipFilePath)) {
            log.info("文件不存在");
            response.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404 Not Found
            return;
        }
        try (OutputStream outputStream = response.getOutputStream();
             FileInputStream fis = new FileInputStream(zipFilePath);
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFileName, StandardCharsets.UTF_8.toString()));

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = bis.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            log.error("下载失败", e);
        } finally {
            FileUtil.del(zipFilePath);
            waterDataRawExportRecordService.deleteByFilename(zipFileName);
        }
    }
http {
    # 定义一个名为 waterDataRawExcelDownload 的负载均衡组
    upstream waterDataRawExcelDownload {
        server 172.0.0.1:81;
        server 172.0.0.2:81;
    }

    server {
        listen 80;  # 监听端口 80

        location /waterDataRaw/download {
            # 配置代理请求,将请求转发给 waterDataRawExcelDownload 负载均衡组
            proxy_pass http://waterDataRawExcelDownload;

            # 配置 Nginx 在与后端服务器通信时遇到错误、超时、无效头和 HTTP 404 时尝试下一个后端服务器
            proxy_next_upstream error timeout invalid_header http_404;
        }
    }
}

动静分离 – 访问静态文件

/usr/webTest下创建static.html文件
配置location

 location /webTest/ {
            root /usr/;
            index  index.html index.htm;
 }

访问 http://192.168.80.131/webTest/static.html
Nginx学习笔记 - 新
解析过程:解析到url中的/webTest/和/webTest/匹配,url中的/webTest/被替换成root的/usr/+location的/webTest/即/usr/webTest/,最后成http://192.168.80.131/usr/webTest/static.html

Keepalived

一文带你浅入浅出Keepalived
一句话就是,为了nginx集群用的,一个主节点,剩下都是从节点,分配一个虚拟IP到各个节点上,每个节点的虚拟IP都是一致的,用户访问这个虚拟IP(浮动IP),就是访问主nginx,当主nginx挂了,从节点就会升级成主节点,保证不会挂,用户也不用换IP访问,当然这个需要写个脚本赖判断主节点nginx是否挂了
Nginx学习笔记 - 新

Nginx+Keepalived案例

我这里不知道为什么nginx挂了,脚本没执行导致无法杀死Keepalived没法切换到其他节点,但是手动杀死Keepalived可以切换到另一台
yum安装Keepalived

yum install keepalived

配置
使用yum安装后配置文件在

/etc/keepalived/keepalived.conf

keepalived中vrrp_script,track_script,notify的使用方法

第一台机子(主)

keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LB_200 #运行 keepalived 服务器的标识,集群的用同一个
 script_user root                #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
    enable_script_security                        #如过路径为非root可写,不要配置脚本为root用户执行。
}

vrrp_instance VI_200 {
    state MASTER #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写
    interface ens33 #网卡名称,使用命令ip addr 查出第二个的网卡名
    virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
    priority 100 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup
    advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
	nopreempt
    authentication { #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_type PASS
        auth_pass 1111 
    }
    virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个
        192.168.80.200
    }
    track_script {  #添加跟踪(执行脚本)
    	nginx_check
    }
}

vrrp_script nginx_check 
{#括号得另起一行否则报错
  script "/etc/keepalived/nginx_check.sh" #心跳执行的脚本,检测nginx是否启动
  interval 5 #检测脚本执行的间隔,单位是)
}


}


配置完执行systemctl start keepalived启动
然后查看状态如下

[root@admin conf]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2023-04-24 22:52:33 CST; 34s ago
  Process: 1433 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 1434 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─1434 /usr/sbin/keepalived -D
           ├─1435 /usr/sbin/keepalived -D
           └─1436 /usr/sbin/keepalived -D

424 22:52:41 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:41 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:41 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:41 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: VRRP_Instance(VI_200) Sending/queueing gratuitous ARPs on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200
424 22:52:46 admin Keepalived_vrrp[1436]: Sending gratuitous ARP on ens33 for 192.168.80.200

第二台机子(备)

keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LB_200 #运行 keepalived 服务器的标识,集群的用同一个
    script_user root                #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
    enable_script_security                        #如过路径为非root可写,不要配置脚本为root用户执行。
}

vrrp_instance VI_200 {
    state BACKUP #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写
    interface ens33 #网卡名称,使用命令ip addr 查出第二个的网卡名
    virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
    priority 99 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup
    advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
nopreempt
mcast_src_ip 192.168.80.132
    authentication { #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_type PASS
        auth_pass 1111 
    }
    virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个
        192.168.80.200
    }
    track_script {  #添加跟踪(执行脚本)
    	nginx_check
    }
}
vrrp_script nginx_check 
{#括号得另起一行否则报错
  script "/etc/keepalived/nginx_check.sh" #心跳执行的脚本,检测nginx是否启动
  interval 5 #检测脚本执行的间隔,单位是)
}


配置完执行systemctl start keepalived启动
然后查看状态如下

[root@admin conf]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2023-04-25 22:45:57 CST; 2s ago
  Process: 1177 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 1178 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─1178 /usr/sbin/keepalived -D
           ├─1179 /usr/sbin/keepalived -D
           └─1180 /usr/sbin/keepalived -D

425 22:45:57 admin Keepalived_vrrp[1180]: Registering Kernel netlink reflector
425 22:45:57 admin Keepalived_vrrp[1180]: Registering Kernel netlink command channel
425 22:45:57 admin Keepalived_vrrp[1180]: Registering gratuitous ARP shared channel
425 22:45:57 admin Keepalived_vrrp[1180]: Opening file '/etc/keepalived/keepalived.conf'.
425 22:45:57 admin Keepalived_vrrp[1180]: VRRP_Instance(VI_200) removing protocol VIPs.
425 22:45:57 admin Keepalived_vrrp[1180]: Using LinkWatch kernel netlink reflector...
425 22:45:57 admin Keepalived_vrrp[1180]: VRRP_Instance(VI_200) Entering BACKUP STATE
425 22:45:57 admin Keepalived_vrrp[1180]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
425 22:45:57 admin Keepalived_vrrp[1180]: VRRP_Script(nginx_check) succeeded
425 22:45:57 admin Keepalived_healthcheckers[1179]: Opening file '/etc/keepalived/keepalived.conf'.

两台都配置的nginx脚本nginx_check.sh,在/etc/keepalived

#!/bin/bash
#上面这句注释不可删除
#检查是否有nginx相关的进程
A=`ps -C nginx --no-header |wc -l`
#如果没有
if [ $A -eq 0 ];then
# 重启nginx,延迟2秒
	systemctl start nginx
	sleep 2
	# 重新检查是否有nginx相关的进程
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	# 仍然没有nginx相关的进程,杀死当前keepalived,切换到备用机
	systemctl stop keepalived
    fi
fi

写完,手动执行下,看看有没有报错sh nginx_check.sh

手动杀死主keepalived,自动切换到备keepalived

systemctl stop keepalived

杀死后在访问vip 192.168.80.200,就会发现访问的是备的nginx

出现的问题

Unsafe permissions found for script ‘/etc/keepalived/bin/recover.sh’.文章来源地址https://www.toymoban.com/news/detail-419997.html

chmod 744 /etc/keepalived/nginx_check.sh

到了这里,关于Nginx学习笔记 - 新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习】https://gitee.com/DingJiaxiong

    【学习】https://gitee.com/DingJiaxiong 0 前言 事情是这样,我准备把之前所有的笔记都放到Gitee 上了 不用GitHub … 就别问原因了。【方便大家自取】 OK,这几个月多多少少也写了2000 + 篇Markdown 笔记了,有些现在还没发出博客,因为一天只能发20 篇。 这些笔记都是自己看B站视频做的

    2024年02月01日
    浏览(49)
  • 【HTML 往日冒险 09】多媒体 插件 音频audio 视频video iframe YouTube iframe bilibili

    HTML 多媒体 Web 上的多媒体指的是音效、音乐、视频和动画 不同的浏览器以不同的方式处理音效、动画和视频 某些元素能够以内联的方式处理,而某些则需要额外的插件 多媒体元素(比如视频和音频)存储于媒体文件中 确定媒体类型的最常用的方法是查看文件扩展名 多媒体

    2024年02月07日
    浏览(45)
  • Docker未授权访问漏洞(www.hetianlab.com)

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。 产生原因 如果在docker上配置了远程访问,d

    2024年02月04日
    浏览(58)
  • wwwxxx域名选择(www.xxx.com或者.cn)

    域名就是网站的网址,就跟家庭住址一样,那么域名就是我们网站的地址,我们使用方便记忆的域名(字母/数字+.COM等域名后缀:www.xxx.com)。 按所属机构分 常见后缀形式: COM:商业性的机构/公司/个人,因为COM这个后缀公信度高,所以用得比较多 ORG :非盈利的组织、团体

    2024年02月05日
    浏览(67)
  • 实例35---字符串反转,如将字符串 “www.runoob.com“ 反转为 “moc.boonur.www“。

    本系列为C语言菜鸟100道基础经典例题详解刷题系列。点滴成长,一起逆袭。 实例35—字符串反转( 字符串数组逆序输出 ),如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。 对c语言的字符串进行反转,将abcdef反转为fedcba的办法有很多,而我所使用的方法是 for循环来将字

    2024年02月04日
    浏览(47)
  • 虚拟机 ping: www.baidu.com:未知的名称或服务

    1、打开ifcfg-ens33文件 2、如下,加上网关和dns就行了,紫色部分,也就是 DNS1=“114.114.114.114” 2.1、 注释: 2.2、网关怎么看,静态IP地址如何确定? 第一步:网关确定,打开虚拟机网络编辑器,找到vmnet8,里面就有个网关,自动获取的: 这个网关,就是我们要填的。 第二部:

    2024年02月06日
    浏览(55)
  • ubuntu网络连接不上,ping: www.baidu.com: 域名解析暂时失败

    有一次意外打断了某个包的下载,然后在网上捣腾杀死进程时可能错误重置一些配置,导致两个虚拟机都连不上网,时隔两个星期被逼无奈寻找联网方法。 具体情况: 右上角网络透明出现了个问号(图为正常情况) 先是试了ping www.baidu.com,结果报错 网上说是dns解析错误 解

    2024年01月18日
    浏览(49)
  • Restclient-cpp库介绍和实际应用:爬取www.sohu.com

    Restclient-cpp是一个用C++编写的简单而优雅的RESTful客户端库,它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp,支持GET, POST, PUT, PATCH, DELETE, HEAD等方法,以及自定义HTTP头部,超时设置,代理服务器等功能。 本文将介绍如何使用Restclient-cpp库来实现一个简单的爬虫程序

    2024年02月07日
    浏览(37)
  • 配置hosts文件,输入某域名(www.XXX.com)时出现自己的页面

    1、以管理员身份运行记事本。 2、打开C:WindowsSystem32driversetc路径下的hosts文件 3、如果页面没有任何文件,点击如图的所有文件即可    4、打开文件,在最下面写上自己的ip和所用的域名即可。 (注意 :如果配置完之后依然没用,可以尝试清除浏览器本地缓存) 原理:    

    2024年02月13日
    浏览(49)
  • 解决ping: www.baidu.com: Name or service not known

    修改你所用的网卡的配置信息:主要配置红框的内容 修改: vi /etc/resolv.conf

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包