Jitsi meet nginx负载均衡,踩坑笔记2

Go
之前配置Jitsi meet nginx负载均衡后,当用相同的房间名进入会议室时,有的能进入同一个会议室,有的没有进到同一个会议室。这个问题困扰了好久,为了解决这个问题,于是有了下面的配置
1. 后端Jitsi meet服务器配置
首先我们有两台运行Jitsi meet的服务器,ip为:
– ip1:443
– ip2:443
这两台服务器上已经部署运行Jitsi meet,并且打开了443端口。
2. Nginx负载均衡服务器
然后我们有一台运行Nginx的服务器,用来作为负载均衡器,流量入口。配置如下:
upstream meet_servers {
    server server1:443;
    server server2:443;
    hash $request_uri consistent;
}
 
server {
    listen 443 ssl;
    server_name meet.example.com;
 
    # ssl配置
    ssl_certificate /path/to/cert;
    ssl_certificate_key /path/to/key;
 
    location / {
        # 代理到Jitsi meet服务器列表
        proxy_pass https://jitsi_meet_server; 

        # 其他proxy设置
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    }
}
这是一个标准的Nginx反向代理和负载均衡配置,当客户端访问meet.example.com时,Nginx接收到请求,然后代理到upstream中配置的Jitsi meet服务器列表,并使用hash算法基于请求URL进行负载均衡,将同一个房间名的请求分发到同一台Jitsi meet服务器。
3. 客户端
客户端访问地址为`https://meet.example.com`就可以访问Jitsi meet会议室,当不同客户端使用相同房间名时,都会被分发到同一台Jitsi meet服务器,从而进入到同一个会议室。
问题1:需要所有的服务添加同一个A记录吗?
对于Nginx负载均衡Jitsi meet服务器,是不需要为每台服务器配置同一个A记录的。我们只需要为Nginx负载均衡器配置一个A记录,比如:meet.example.com    A     ip_nginx_lb
问题2:upstream jitsi_meet_server 可以用443端口吗?
在upstream中,后端服务器可以使用任意端口,不一定是443端口。
比如我们可以定义如下upstream:
upstream jitsi_meet_server{ 
    server ip1:8443;  # 使用8443端口
    server ip2:8444;  # 使用8444端口
    hash $request_uri consistent;  
}
这里我们使用8443和8444端口,这是没有问题的。那么对于Nginx来说,如何将请求代理到这些非标准端口(非80/443)的upstream呢?
这里就需要使用`proxy_pass`指令,语法如下:
server {
    listen 443 ssl;
    server_name meet.example.com;

    location / {
        proxy_pass https://jitsi_meet_server;  # 代理到8443和8444端口的upstream
    }
}

问题3:两台服务器都需要配置Nginx吗?

对于这个Jitsi meet负载均衡的场景,我们只需要在一台服务器上配置Nginx即可,其他的Jitsi meet服务器只需要正常运行Jitsi meet应用即可,不需要配置Nginx。我们的架构如下:
– Jitsi meet服务器1:ip1,运行Jitsi meet应用,443端口
– Jitsi meet服务器2:ip2,运行Jitsi meet应用,444端口
– Nginx负载均衡器:运行Nginx,配置负载均衡和反向代理当客户端访问时:
1. 客户端访问 Nginx负载均衡器,通过域名 meet.example.com
2. Nginx接收到请求,使用proxy_pass代理到upstream( containing ip1:8443和ip2:8444)
3. Nginx使用hash $request_uri对upstream进行负载均衡,将请求代理到其中一台服务器
4. 代理到的服务器直接处理请求,返回响应所以在这个架构下,我们只需要在Nginx负载均衡器上配置Nginx来实现反向代理和负载均衡。
其他Jitsi meet服务器只需要正常运行应用程序,不需要配置Nginx或者其他代理功能。
它们只负责处理Nginx反向代理过来的请求,返回响应即可。所以正确的说,我们只需要在一台服务器上配置Nginx来实现Jitsi meet负载均衡,其他Jitsi meet服务器不需要配置Nginx。
Nginx会代理接收到的所有请求到upstream中的Jitsi meet服务器,所以它们只需要运行应用程序,返回响应给Nginx即可。这种架构可以使我们的设置更加简单,只需要在Nginx负载均衡器上配置负载均衡功能,而不需要在每个应用服务器都配置Nginx。总之,对于这个Jitsi meet负载均衡场景,我们只需要在一台服务器配置Nginx,其他Jitsi meet服务器运行应用程序即可,不需要配置Nginx。

问题4:安装Jitsi meet时域名是填写Nginx的域名吗?

是的,在安装Jitsi meet时,域名应填写Nginx负载均衡器的域名meet.example.com。不应该填写后端Jitsi meet服务器的IP地址或者域名。因为:1. 客户端并不能直接访问后端Jitsi meet服务器,因为Nginx处于两者之间,作为反向代理。2. 如果填写后端Jitsi meet服务器的域名,当Nginx代理请求到其他服务器时,会由于域名/IP不匹配而无法正常工作。3. 我们希望后端Jitsi meet服务器的细节被隐藏在Nginx后,对外只暴露Nginx的域名,实现透明代理。所以,总结来说,在配置Jitsi meet时,要填写Nginx负载均衡器的域名(即客户端访问的域名),而不是后端Jitsi meet服务器自己的域名或IP。
问题5:安装Jitsi meet时ssl证书的路径怎么填写?
在Jitsi meet安装时,ssl证书的路径也应该填写Nginx负载均衡器上的证书路径,而不是后端Jitsi meet服务器的证书路径。
因为Jitsi meet服务器收到的不是客户端的SSL请求,而是来自Nginx的HTTP请求,所以其不会也不需要校验SSL证书。而客户端到Nginx之间的通信使用HTTPS,客户端会校验Nginx的证书。所以Nginx需要配置证书来对外提供HTTPS服务。这种架构可以使我们只需要在Nginx上配置证书,而不需要在每个后端服务器上都配置证书,实现一个简单的架构。
问题6:Nginx 在哪个文件中配置
Nginx的配置文件主要有两个:1. nginx.conf: 这是Nginx的主配置文件,定义了Nginx全局的配置,包括工作进程数,缓存配置,日志配置等。2. server配置文件:这是定义HTTP服务或反向代理服务的配置文件,我们可以拥有多个server配置文件。
我们的Jitsi meet负载均衡场景,主要的配置文件包括:**nginx.conf**这个文件定义Nginx的全局配置,我们可能需要在这里配置:- 工作进程数和用户:Nginx工作进程数和用哪个用户运行进程
– 代理缓冲区大小:当Nginx作为反向代理时,需要定义缓存区大小
user  nginx;
worker_processes  auto;

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=proxy_cache:200m max_size=10g; 
**meet.example.com.conf**这个是我们的server配置文件,用来配置对外提供HTTPS服务和代理到Jitsi meet服务器:
server {
    listen 443 ssl; 
    server_name meet.example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key  /path/to/cert.key; 
    
    location / {
        proxy_pass https://jitsi_meet_server;  # 代理到后端upstream

        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    } 
}
所以,在Nignx上,我们主要修改`nginx.conf`和各个server的配置文件来配置不同的服务。
对于我们的Jitsi meet负载均衡场景,会在`meet.example.com.conf`这个server配置文件中配置HTTPS服务和代理到后端Jitsi meet服务器。在`nginx.conf`中配置的全局选项也同样适用,所以我们可以在两个配置文件中进行配置,以实现Jitsi meet的负载均衡。
问题7:需要打开哪些端口?
对于这个Jitsi meet负载均衡架构,我们需要打开的端口主要有:
1. Nginx负载均衡器:
– 端口443: 用于对外提供HTTPS服务,客户端访问meet.example.com的端口
– 端口80: 可选,用于HTTP跳转到HTTPS
2. 后端Jitsi meet服务器:
– 端口443: Jitsi meet应用的默认HTTPS端口
– 端口10000-20000: Jitsi meet视频会议使用的UDP端口范围
所以,各个组件需要打开的端口为:
Nginx负载均衡器:
– 443: HTTPS
– 80:  可选,HTTP跳转
Jitsi meet服务器1:
– 443: Jitsi meet HTTP
– 10000-20000: Jitsi meet视频会议UDP端口范围
Jitsi meet服务器2:
– 444: Jitsi meet HTTP
– 10000-20000: Jitsi meet视频会议UDP端口范围
问题8:提示“The bridge channel has been disconnected and thus video quality is limited to its lowest setting”
WebSocket代理:Jitsi Meet使用WebSocket与服务器通信,所以需要配置nginx对WebSocket的识别和正确代理。配置示例:
location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade"; 
    proxy_pass http://jitsi_meet_servers;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注