Udostępnij za pośrednictwem


Wymuszanie wywołania ruchu, który ma być kierowany przez własny serwer

Z tego samouczka dowiesz się, jak za pomocą serwera proxy usługi Azure Communication Services wywoływać ruch między własnymi serwerami.

W niektórych sytuacjach może być przydatne, aby cały ruch klienta był kierowany do serwera, który można kontrolować. Podczas inicjowania zestawu SDK można podać szczegóły serwerów, do których ma być kierowany ruch. Po włączeniu cały ruch multimedialny (udostępnianie audio/wideo/ekranu) jest przesyłany przez podane serwery TURN zamiast domyślnych usług Azure Communication Services.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Konfigurowanie serwera TURN.
  • Skonfiguruj serwer proxy sygnalizujący.

Wymagania wstępne

Brak

Funkcja serwera proxy jest ogólnie dostępna, począwszy od publicznej wersji 1.25.1 zestawu Azure Communication Services Calling SDK. Podczas próby użycia tej funkcji upewnij się, że używasz tego zestawu SDK lub nowszej wersji zestawu SDK. W tym samouczku jest używana wersja zestawu Calling SDK 1.13.0-beta.1, w której ta funkcja została po raz pierwszy udostępniona w publicznej wersji zapoznawczej.

Serwer proxy wywołujący ruch multimedialny

W poniższych sekcjach opisano sposób wywoływania ruchu multimediów przez serwer proxy.

Co to jest serwer TURN?

Wiele razy nawiązywanie połączenia sieciowego między dwoma elementami równorzędnymi nie jest proste. Bezpośrednie połączenie może nie działać z następujących powodów:

  • Zapory z rygorystycznymi regułami.
  • Równorzędni siedzą za siecią prywatną.
  • Komputery działające w środowisku translatora adresów sieciowych (NAT).

Aby rozwiązać te problemy z połączeniem sieciowym, można użyć serwera korzystającego z protokołu Traversal using Relay NAT (TURN) na potrzeby przekazywania ruchu sieciowego. Narzędzia przechodzenia sesji dla serwerów NAT (STUN) i TURN to serwery przekaźnika.

Podaj szczegóły serwera TURN dla zestawu SDK

Aby podać szczegóły serwerów TURN, należy przekazać szczegóły dotyczące serwera TURN, który ma być używany w ramach inicjowania CallClientOptions CallClientprogramu . Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw SDK sieci Web usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania połączeń głosowych i wideo.

import { CallClient } from '@azure/communication-calling'; 

const myTurn1 = {
    urls: [
        'turn:turn.azure.com:3478?transport=udp',
        'turn:turn1.azure.com:3478?transport=udp',
    ],
    username: 'turnserver1username',
    credential: 'turnserver1credentialorpass'
};

const myTurn2 = {
    urls: [
        'turn:20.202.255.255:3478',
        'turn:20.202.255.255:3478?transport=tcp',
    ],
    username: 'turnserver2username',
    credential: 'turnserver2credentialorpass'
};

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        turn: {
            iceServers: [
                myTurn1,
                myTurn2
            ]
        }
    }
});




// ...continue normally with your SDK setup and usage.

Ważne

Jeśli podczas inicjowania CallClientpodano szczegóły serwera TURN, cały ruch multimedialny przepływa wyłącznie przez te serwery TURN. Każdy inny kandydat ICE, który jest zwykle generowany podczas tworzenia wywołania, nie będzie brany pod uwagę podczas próby nawiązania łączności między elementami równorzędnymi. Oznacza to, że rozważane są tylko relay kandydaci. Aby dowiedzieć się więcej o różnych typach kandydatów do lodu, zobacz RTCIceCandidate: właściwość typu.

?transport Jeśli parametr zapytania nie jest obecny jako część adresu URL turn lub nie jest jedną z udpwartości , tcplub tls wartości, domyślne zachowanie to UDP.

Jeśli którykolwiek z podanych adresów URL jest nieprawidłowy lub nie ma jednego ze turn:schematów CallClient , turns:, stun: inicjowanie kończy się niepowodzeniem i zgłasza błędy odpowiednio. Zgłaszane komunikaty o błędach powinny pomóc w rozwiązywaniu problemów w przypadku wystąpienia problemów.

Aby zapoznać się z dokumentacją interfejsu CallClientOptions API dla obiektu i networkConfiguration jej właściwością, zobacz CallClientOptions.

Konfigurowanie serwera TURN na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal. Aby wdrożyć serwer TURN, użyj polecenia coturn. Coturn to bezpłatna i open source implementacja serwera TURN i STUN dla voIP i WebRTC.

Po skonfigurowaniu serwera TURN można go przetestować, korzystając z instrukcji na stronie internetowej WebRTC Trickle ICE .

Ruch sygnalizujący serwer proxy

Aby podać adres URL serwera proxy, należy przekazać go jako część CallClientOptions podczas inicjowania CallClient. Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw SDK sieci Web usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania połączeń głosowych i wideo.

import { CallClient } from '@azure/communication-calling'; 

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        proxy: {
            url: 'https://myproxyserver.com'
        }
    }
});

// ...continue normally with your SDK setup and usage.

Uwaga

Jeśli podany adres URL serwera proxy jest nieprawidłowym adresem URL, CallClient inicjowanie zakończy się niepowodzeniem i odpowiednio zgłosi błędy. Komunikaty o błędach, które są zgłaszane, ułatwiają rozwiązywanie problemów w przypadku wystąpienia problemów.

Aby zapoznać się z dokumentacją interfejsu CallClientOptions API dla obiektu i networkConfiguration jej właściwością, zobacz CallClientOptions.

Konfigurowanie oprogramowania pośredniczącego serwera proxy sygnału w Express.js

Możesz również utworzyć oprogramowanie pośredniczące serwera proxy w konfiguracji serwera Express.js, aby wszystkie adresy URL zostały przekierowane za jego pośrednictwem przy użyciu pakietu npm oprogramowania pośredniczącego http-proxy.. Funkcja createProxyMiddleware z tego pakietu powinna obejmować elementy potrzebne do prostej konfiguracji serwera proxy przekierowania. Oto przykład użycia go z niektórymi ustawieniami opcji, których potrzebuje zestaw SDK, aby wszystkie nasze adresy URL działały zgodnie z oczekiwaniami:

const proxyRouter = (req) => {
    // Your router function if you don't intend to set up a direct target

    // An example:
    if (!req.originalUrl && !req.url) {
        return '';
    }

    const incomingUrl = req.originalUrl || req.url;
    if (incomingUrl.includes('/proxy')) {
        return 'https://microsoft.com/forwarder/';
    }
    
    return incomingUrl;
}

const myProxyMiddleware = createProxyMiddleware({
    target: 'https://microsoft.com', // This will be ignored if a router function is provided, but createProxyMiddleware still requires this to be passed in (see its official docs on the npm page for the most recent changes)
    router: proxyRouter,
    changeOrigin: true,
    secure: false, // If you have proper SSL setup, set this accordingly
    followRedirects: true,
    ignorePath: true,
    ws: true,
    logLevel: 'debug'
});

// And finally pass in your proxy middleware to your express app depending on your URL/host setup
app.use('/proxy', myProxyMiddleware);

Napiwek

Jeśli masz problemy z protokołem SSL, zobacz pakiet cors .

Konfigurowanie serwera proxy sygnału na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal i wdrożyć na nim serwer NGINX. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal.

Oto konfiguracja serwera NGINX, której można użyć jako przykładu:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

Funkcja serwera proxy nie będzie dostępna dla tożsamości usługi Teams i akcji współdziałania usługi Azure Communication Services Teams.

Serwer proxy wywołujący ruch multimedialny

W poniższych sekcjach opisano sposób wywoływania ruchu multimediów przez serwer proxy.

Co to jest serwer TURN?

Wiele razy nawiązywanie połączenia sieciowego między dwoma elementami równorzędnymi nie jest proste. Bezpośrednie połączenie może nie działać z następujących powodów:

  • Zapory z rygorystycznymi regułami.
  • Równorzędni siedzą za siecią prywatną.
  • Komputery działające w środowisku translatora adresów sieciowych (NAT).

Aby rozwiązać te problemy z połączeniem sieciowym, można użyć serwera korzystającego z protokołu Traversal using Relay NAT (TURN) na potrzeby przekazywania ruchu sieciowego. Narzędzia przechodzenia sesji dla serwerów NAT (STUN) i TURN to serwery przekaźnika.

Podaj szczegóły serwera TURN za pomocą zestawu SDK

Aby podać szczegóły serwerów TURN, należy przekazać szczegóły dotyczące serwera TURN, który ma być używany w ramach inicjowania CallClientOptions CallClientprogramu . Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw SDK usług Azure Communication Services dla systemu iOS, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania głosu i wideo.

let callClientOptions = new CallClientOptions()
let callNetworkOptions = new CallNetworkOptions()

let iceServer = IceServer()
iceServer.urls = ["turn:20.202.255.255"]
iceServer.udpPort = 3478
iceServer.realm = "turn.azure.com"
iceServer.username = "turnserver1username"
iceServer.password = "turnserver1password"

callNetworkOptions.iceServers = [iceServer]

// Supply the network options when creating an instance of the CallClient
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions);

Ważne

Jeśli podczas inicjowania CallClientpodano szczegóły serwera TURN, cały ruch multimedialny przepływa wyłącznie przez te serwery TURN. Każdy inny kandydat ICE, który jest zwykle generowany podczas tworzenia wywołania, nie będzie brany pod uwagę podczas próby nawiązania łączności między elementami równorzędnymi. Oznacza to, że rozważane są tylko relay kandydaci. Aby dowiedzieć się więcej o różnych typach kandydatów na lód, zobacz RTCIceCandidate: właściwość typu.

Obecnie zestaw SDK systemu Android obsługuje tylko jeden adres IPv4 i protokół UDP dla serwera proxy multimediów. Jeśli nie podano portu UDP, jest używany domyślny port UDP 3478. Zestaw SDK zgłosi Failed to set media proxy błąd podczas wywoływania setIceServer z nieobsługiwanymi danymi wejściowymi w następujący sposób:

  • Na liście IceServers znajduje się więcej niż jeden serwer ICE.
  • Więcej niż jeden adres URL znajduje się na liście adresów URL serwera IceServer.
  • Adres URL protokołu IPv6 znajduje się na liście adresów URL.
  • Dostępny jest tylko port TCP.
  • Nie podano informacji o obszarze.

Jeśli podane informacje o serwerze ICE są nieprawidłowe, CallClient inicjowanie kończy się niepowodzeniem i odpowiednio zgłasza błędy.

Konfigurowanie serwera TURN na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal. Aby wdrożyć serwer TURN, użyj polecenia coturn. Coturn to bezpłatna i open source implementacja serwera TURN i STUN dla voIP i WebRTC.

Po skonfigurowaniu serwera TURN można go przetestować, korzystając z instrukcji na stronie internetowej WebRTC Trickle ICE .

Ruch sygnalizujący serwer proxy

Aby podać adres URL serwera proxy, należy przekazać go w ramach CallClientOptions jego właściwości Network podczas inicjowania CallClient. Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw SDK usług Azure Communication Services dla systemu iOS, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania głosu i wideo.

let callClientOptions = CallClientOptions()
let callNetworkOptions = CallNetworkOptions()
callNetworkOptions.proxyUrl = proxyUrl
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions)

// ...continue normally with your SDK setup and usage.

Konfigurowanie serwera proxy sygnału na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal i wdrożyć na nim serwer NGINX. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal.

Oto konfiguracja serwera NGINX, której można użyć jako przykładu:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

Funkcja serwera proxy nie będzie dostępna dla tożsamości usługi Teams i akcji współdziałania usługi Azure Communication Services Teams.

Serwer proxy wywołujący ruch multimedialny

W poniższych sekcjach opisano sposób wywoływania ruchu multimediów przez serwer proxy.

Co to jest serwer TURN?

Wiele razy nawiązywanie połączenia sieciowego między dwoma elementami równorzędnymi nie jest proste. Bezpośrednie połączenie może nie działać z następujących powodów:

  • Zapory z rygorystycznymi regułami.
  • Równorzędni siedzą za siecią prywatną.
  • Komputery działające w środowisku translatora adresów sieciowych (NAT).

Aby rozwiązać te problemy z połączeniem sieciowym, można użyć serwera korzystającego z protokołu Traversal using Relay NAT (TURN) na potrzeby przekazywania ruchu sieciowego. Narzędzia przechodzenia sesji dla serwerów NAT (STUN) i TURN to serwery przekaźnika.

Podaj szczegóły serwera TURN za pomocą zestawu SDK

Aby podać szczegóły serwerów TURN, należy przekazać szczegóły dotyczące serwera TURN, który ma być używany w ramach inicjowania CallClientOptions CallClientprogramu . Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw Sdk systemu Android usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania połączeń głosowych i wideo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.setUrls(Arrays.asList("turn:20.202.255.255"));
iceServer.setUdpPort(3478);
iceServer.setRealm("turn.azure.com"); // Realm information is required.
iceServer.setUsername("turnserver1username");
iceServer.setPassword("turnserver1password");

callNetworkOptions.setIceServers(Arrays.asList(iceServer));

// Supply the network options when creating an instance of the CallClient
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

Ważne

Jeśli podczas inicjowania CallClientpodano szczegóły serwera TURN, cały ruch multimedialny przepływa wyłącznie przez te serwery TURN. Każdy inny kandydat ICE, który jest zwykle generowany podczas tworzenia wywołania, nie będzie brany pod uwagę podczas próby nawiązania łączności między elementami równorzędnymi. Oznacza to, że rozważane są tylko relay kandydaci. Aby dowiedzieć się więcej o różnych typach kandydatów na lód, zobacz RTCIceCandidate: właściwość typu.

Obecnie zestaw SDK systemu Android obsługuje tylko jeden adres IPv4 i protokół UDP dla serwera proxy multimediów. Jeśli nie podano portu UDP, jest używany domyślny port UDP 3478. Zestaw SDK zgłosi Failed to set media proxy błąd podczas wywoływania setIceServer z nieobsługiwanymi danymi wejściowymi w następujący sposób:

  • Na liście IceServers znajduje się więcej niż jeden serwer ICE.
  • Więcej niż jeden adres URL znajduje się na liście adresów URL serwera IceServer.
  • Adres URL protokołu IPv6 znajduje się na liście adresów URL.
  • Dostępny jest tylko port TCP.
  • Nie podano informacji o obszarze.

Jeśli podane informacje o serwerze ICE są nieprawidłowe, CallClient inicjowanie kończy się niepowodzeniem i odpowiednio zgłasza błędy.

Konfigurowanie serwera TURN na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal. Aby wdrożyć serwer TURN, użyj polecenia coturn. Coturn to bezpłatna i open source implementacja serwera TURN i STUN dla voIP i WebRTC.

Po skonfigurowaniu serwera TURN można go przetestować, korzystając z instrukcji na stronie internetowej WebRTC Trickle ICE .

Ruch sygnalizujący serwer proxy

Aby podać adres URL serwera proxy, należy przekazać go w ramach CallClientOptions jego właściwości Network podczas inicjowania CallClient. Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw Sdk systemu Android usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania połączeń głosowych i wideo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.setProxyUrl("https://myproxyserver.com");
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Konfigurowanie serwera proxy sygnału na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal i wdrożyć na nim serwer NGINX. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal.

Oto konfiguracja serwera NGINX, której można użyć jako przykładu:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

Funkcja serwera proxy nie będzie dostępna dla tożsamości usługi Teams i akcji współdziałania usługi Azure Communication Services Teams.

Serwer proxy wywołujący ruch multimedialny

W poniższych sekcjach opisano sposób wywoływania ruchu multimediów przez serwer proxy.

Co to jest serwer TURN?

Wiele razy nawiązywanie połączenia sieciowego między dwoma elementami równorzędnymi nie jest proste. Bezpośrednie połączenie może nie działać z następujących powodów:

  • Zapory z rygorystycznymi regułami.
  • Równorzędni siedzą za siecią prywatną.
  • Komputery działające w środowisku translatora adresów sieciowych (NAT).

Aby rozwiązać te problemy z połączeniem sieciowym, można użyć serwera korzystającego z protokołu Traversal using Relay NAT (TURN) na potrzeby przekazywania ruchu sieciowego. Narzędzia przechodzenia sesji dla serwerów NAT (STUN) i TURN to serwery przekaźnika.

Podaj szczegóły serwera TURN za pomocą zestawu SDK

Aby podać szczegóły serwerów TURN, należy przekazać szczegóły dotyczące serwera TURN, który ma być używany w ramach inicjowania CallClientOptions CallClientprogramu . Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw Windows SDK usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania głosu i wideo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.Uris = new List<Uri>() { new Uri("turn:20.202.255.255") }.AsReadOnly();
iceServer.UdpPort = 3478;
iceServer.Realm = "turn.azure.com";
iceServer.Username = "turnserver1username";
iceServer.Password = "turnserver1password";

callNetworkOptions.IceServers = new List<IceServer>() { iceServer }.AsReadOnly();

// Supply the network options when creating an instance of the CallClient
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

Ważne

Jeśli podczas inicjowania CallClientpodano szczegóły serwera TURN, cały ruch multimedialny przepływa wyłącznie przez te serwery TURN. Każdy inny kandydat ICE, który jest zwykle generowany podczas tworzenia wywołania, nie będzie brany pod uwagę podczas próby nawiązania łączności między elementami równorzędnymi. Oznacza to, że rozważane są tylko relay kandydaci. Aby dowiedzieć się więcej o różnych typach kandydatów na lód, zobacz RTCIceCandidate: właściwość typu.

Obecnie zestaw SDK systemu Android obsługuje tylko jeden adres IPv4 i protokół UDP dla serwera proxy multimediów. Jeśli nie podano portu UDP, jest używany domyślny port UDP 3478. Zestaw SDK zgłosi Failed to set media proxy błąd podczas wywoływania setIceServer z nieobsługiwanymi danymi wejściowymi w następujący sposób:

  • Na liście IceServers znajduje się więcej niż jeden serwer ICE.
  • Więcej niż jeden adres URL znajduje się na liście adresów URL serwera IceServer.
  • Adres URL protokołu IPv6 znajduje się na liście adresów URL.
  • Dostępny jest tylko port TCP.
  • Nie podano informacji o obszarze.

Jeśli podane informacje o serwerze ICE są nieprawidłowe, CallClient inicjowanie kończy się niepowodzeniem i odpowiednio zgłasza błędy.

Konfigurowanie serwera TURN na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal. Aby wdrożyć serwer TURN, użyj polecenia coturn. Coturn to bezpłatna i open source implementacja serwera TURN i STUN dla voIP i WebRTC.

Po skonfigurowaniu serwera TURN można go przetestować, korzystając z instrukcji na stronie internetowej WebRTC Trickle ICE .

Ruch sygnalizujący serwer proxy

Aby podać adres URL serwera proxy, należy przekazać go w ramach CallClientOptions jego właściwości Network podczas inicjowania CallClient. Aby uzyskać więcej informacji na temat konfigurowania połączenia, zobacz Zestaw Windows SDK usług Azure Communication Services, aby zapoznać się z przewodnikiem Szybki start dotyczącym konfigurowania głosu i wideo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.ProxyUri = new Uri("https://myproxyserver.com");
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Konfigurowanie serwera proxy sygnału na platformie Azure

Maszynę wirtualną z systemem Linux można utworzyć w witrynie Azure Portal i wdrożyć na nim serwer NGINX. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie maszyny wirtualnej z systemem Linux w witrynie Azure Portal.

Oto konfiguracja serwera NGINX, której można użyć jako przykładu:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}