跳转至

34 Nginx安装与直播配置:Nginx如何实现直播配置?

你好,我是Barry。

在上节课,我们一起梳理了直播系统需要开发的功能模块以及整体搭建方案。当时我们提到过,直播服务器会用到Nginx代理。接下来,我们就来学习如何用Nginx实现直播的服务配置和部署。

其实我们前面第三十一节课已经用过Nginx来实现后端部署。但那时候,我们并没全面了解过这个技术,也没了解过Nginx如何在直播系统发挥作用。这节课我们不妨带着这些问题做进一步探索。

Nginx详解

你可能听说过,Nginx是一个适合各种互联网应用场景的高性能Web服务器和反向代理服务器。不过你也许并没有全面思考过,它到底有哪些优势和功能特点,才能在众多代理服务器里脱颖而出。我们这就来详细聊聊这个问题。

Nginx由俄罗斯程序员Igor Sysoev开发。它有两个优势,第一个优势你安装的时候就会发现,Nginx占用内存非常少。另外,Nginx的并发能力也在同类型网页服务器里最为出色。

那Nginx的功能特点又有哪些呢?我归纳为四个特点。

第一,Nginx可以作为反向代理服务器使用,它可以将客户端的请求转发到后端的服务器处理。这么做能整合多个服务器的处理能力,实现负载均衡和高可用性,大大提高系统的整体性能和稳定性。

第二,Nginx可以通过多种方式将请求分配到不同的服务器上,如轮询、加权轮询、IP哈希等。把请求分散到多个服务器上,就能避免某一台服务器承受过多的请求压力,造成服务宕机等情况,保障服务高效稳定的运转。

第三就是它的安全性高。Nginx可以配置多种安全策略,如防止DDoS攻击、防止CSRF攻击、限制同时连接数、设置访问限制等。有了这些安全策略,就能有效地保护系统不受恶意攻击和非法访问。

第四点,Nginx具备高性能。这是因为Nginx使用了多路技术,如多线程、事件驱动等,可以处理大量的并发请求,并且具有较低的延迟。

认识代理服务器

代理服务器是一种网络服务,你可以把它理解成中转站。代理服务器的主要功能是接收客户端的请求,并将这些请求转发到真正的服务器上,然后将服务器的响应返回给客户端。代理服务器,能够帮助我们实现负载均衡和提高系统的安全性。

接下来,我们就来分别看看正向代理服务器和反向代理服务器的作用和使用场景。

正向代理服务器

正向代理服务器的作用是,按照预先的配置,将客户端发来的请求转发到目标服务器上。需要注意,正向代理服务器本身并不具有认证机制,它会将所有的请求都转发给目标服务器,由目标服务器认证请求。

接下来我就看看正向服务器的使用场景。

当我们访问内网或受限资源时候,可以通过Nginx正向代理服务器,把请求转发到目标服务器上,然后通过目标服务器完成认证和授权,最终返回给客户端。你可以结合文稿后面的示意图来加深理解。

Nginx正向代理服务器还可以实现访问加速。比方说原先当客户端和服务器之间是通过低速链路进行访问,但如果遇到整个网络连接响应较慢的情况,就可以通过正向代理服务器提供的高速链路,提高连接响应速度。

Nginx正向代理服务器还可以实现缓存加速,缓存从目标服务器返回的响应,这么做可以避免频繁的磁盘读写操作,有助于提高请求响应速度,并减轻目标服务器的负载压力。

不难发现,Nginx正向服务器主要作用于客户端,通过代理服务器请求原始服务器,然后将请求到资源内容返回给客户端。

反向代理服务器

Nginx的反向代理功能的作用是根据配置规则,将客户端的请求转发到后端的多个服务器上。与正向代理不同,它是在Nginx服务器上进行请求的认证和转发,而不是由原服务器完成认证和转发。

使用反向代理服务器时,客户端并不知道自己真实访问的服务器是哪一个,因为客户端是与代理服务器做交互。这也是反向代理服务器与正向代理服务器的不同之处——正向服务器作用在客户端,反向代理服务器则作用在服务端

那反向代理服务器有哪些用途呢?

首先,通过反向代理服务器可以实现分布式路由。Nginx反向代理服务器通常会配置多个上游服务器,这些上游服务器是内部网络的入口点。反向代理服务器会根据配置规则,将来自客户端的请求转发到不同的上游服务器上。这个过程你可以结合后面的流程图看一下。

其次,Nginx反向代理器可以实现负载均衡。负载均衡是一种常见的网络架构,它可以将网络流量分发到多个服务器上,从而避免单台服务器成为性能瓶颈,提高系统的可用性和可靠性。我们通过负载均衡可以提高服务器的性能,避免服务器单点故障,提升服务器的扩展性和安全性。

后面这张图是结合我们视频平台需求梳理的示意图,描述了Nginx反向代理器的请求处理流程,你可以参考一下。

接下来我们看看Nginx实现负载均衡的三种方式。

第一种方法是配置轮询算法,将请求依次分发到不同的后端服务器上。这种负载均衡方式可以实现基本的请求分配,但并不考虑每台后端服务器的实际负载情况。

第二种方法就是配置每台后端服务器的权重值,根据不同的权重值来分配请求,权重值越高的服务器将会收到更多的请求。

第三种方法就是配置IP Hash算法,根据客户端的IP地址分发请求。这种负载均衡方式可以将同一客户端的请求始终分发到同一台后端服务器上。

同时,我们还可以通过Nginx反向代理服务器实现缓存。这么做能够减少后端服务器的压力,提升响应效率。

说了这么多,相信你对Nginx的威力有了全新的认识。在直播系统里选用Nginx,我们看重的就是它在高并发、热部署、高可用方面的出色能力,具体功能优势我给你整理在下面,你可以参考后面的表格。

应用实战

前面的课程我们已经学习过Nginx的安装,这部分你可以回顾第31节课。所以,这里我们从如何配置Nginx防火墙开始说起。

配置防火墙

配置防火墙的目的是提高服务器的安全性和稳定性。另外,它也能监控和控制网络流量和带宽,方便我们检测系统运行情况。

我们打开nginx.conf文件,找到http部分的配置段,添加后面的内容。

# 禁止未经授权的访问  
location / {  
    deny all;  
    allow 127.0.0.1;  
    # 添加允许访问的IP地址  
    # ...  
}  

# 禁止不安全的HTTP方法  
if ($request_method !~ ^(GET|HEAD|POST)$) {  
    return 403;  
}
     
# 防止SQL注入攻击
    location ~ inj/ {
        deny all;
    }  

# 禁止爬虫  
if ($http_user_agent ~* (Baiduspider|Googlebot|Yandex|Sogou)) {  
    return 403;  
}

刚才这段配置是什么意思呢?deny all表示拒绝所有未经授权的访问。而allow 127.0.0.1 表示允许本地回环地址(127.0.0.1)的访问,这是为了方便测试和开发时使用。当然,我们可以在注释中添加允许访问的IP地址,以允许特定IP地址的访问权限。

第10行的代码表示如果请求方法不是GET、HEAD或POST,则返回403禁止访问。这样设置可以防止恶意用户使用不安全的HTTP方法攻击服务器。

之后我们还设置了防止SQL注入攻击。SQL注入攻击是一种常见的网络攻击,通过注入恶意代码来执行非法操作。在Nginx中,我们可以使用正则表达式匹配特定的请求路径,来识别并防止SQL注入攻击。相关配置的含义你可以参考后面的表格。

图片

在第19行禁止爬虫的访问设置中,我们设置来一些请求方法控制。if ($http_user_agent ~* (Baiduspider|Googlebot|Yandex|Sogou)) 表示如果User-Agent字段匹配BaiduSpider、Googlebot、Yandex或Sogou等爬虫标识,则返回403禁止访问。这样我们就可以防止网络爬虫抓取网站内容,保护网站数据的版权和安全性。

完成配置后,需要通过后面的命令重新加载Nginx配置,这样配置文件才会生效。对应的操作命令如下所示。

$ sudo systemctl restart nginx

配置服务器

接下来,就是配置服务器的环节。首先,我们需要找到Nginx服务器上的nginx.conf文件,对应的目录在/etc/nginx/,你会在这个目录下面看到配置文件。

图片

对应的配置文件内容是后面这样,你可以先整体看看,然后再听我详细讲解,重点还是了解每个参数的含义和使用方法。

#user  nobody;
worker_processes  1; #指令用于指定Nginx工作进程的数量
#指令用于指定Nginx的事件处理配置
events {  
    worker_connections  1024;
}
#指令用于指定HTTP服务器的配置
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    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;
        }
    }
}

前面的配置中,events块是Nginx服务器中用于指定事件处理的相关配置的模块。在这个模块中,我们可以设置一些与服务器事件处理相关的参数。worker_connections 指令用于指定Nginx服务器可以同时建立的连接数,其中1024表示每个 worker 进程可以同时处理的最大连接数为1024个。

第8行代码中,http指令用于指定HTTP服务器的配置。在这里包含了 MIME 类型配置、文件传输和连接保持等配置。你可以参考后面的表格,了解每个参数的作用。这里不需要你死记硬背,可以课后对照表格和我提供的代码实操演练一下,这样更容易理解记忆。

到这里我们就完成了服务器的配置,恭喜你坚持到这里。稍微总结一下,前面这段配置文件设置了一个基本的HTTP服务器,可以处理根目录下的请求,并提供默认的索引文件和错误页。

总结

又到了课程的尾声,我们一起来回顾一下这节课学了什么。

Nginx可以作为Web服务器和反向代理服务器,它具备安全性、高性能等特点,很多场景上都有用武之地。

然后,我们学习了正向和反向代理服务器。正向代理服务器作用于客户端,可解决访问内网或受限资源问题、实现访问加速或者缓存加速。

不同于正向代理服务器,反向代理服务器作用于服务端。 作为反向代理服务器,Nginx可以实现分布式路由、负载均衡、实现缓存等能力,在大大减轻服务器的压力的同时,还能保证系统的高效访问和稳定运行。

Nginx出色高并发能力(高达5万到10万)、强大的热部署能力,还有高可用能力都能为系统保驾护航,这也是我们在直播系统里选用Nginx的原因。

最后的实战环节中,我们先设置了Nginx的防火墙,目的是提高服务器的安全性和稳定性。之后还完成了配置服务器的工作,这部分的参数同样有很多。这些参数和配置项你需要熟练掌握,尤其是弄清楚它们的用途,所以也建议你课后多多练习,锻炼自己的服务器部署能力。

思考题

在使用Nginx时,如果因为配置不当或者出现错误时,我们该如何进行排查?

欢迎你在留言区和我交流互动,如果这节课对你有启发,也推荐你把它分享给身边更多朋友。

精选留言(2)
  • kenan 👍(0) 💬(2)

    老师好,想请教一个问题:通过nginx -s reload 重新启动之后,还是会有接口报错,如何解决呢?

    2023-07-12

  • peter 👍(0) 💬(1)

    请教老师几个问题: Q1:Nginx正向代理作用于客户端,什么意思? 感觉正向和反向都是代表后端的服务器啊,好像没有什么区别啊。 Q2:线上应用中,正常应该是是”多数允许,少数禁止”,此时应该怎么配置? Allow:all; deny: 192.168.3.2,这样吗? Q3:worker_processor是进程吗? 可以配置为大于1的数字吗? Nginx不就是一个进程吗? 怎么可能有多个进程? Q4:MIME是具体的类型吗? 设置这个代表了哪些类型?

    2023-07-11