This document is about: SERVER 5
SWITCH TO

수정중인 페이지 입니다.

Photon Server 환경 구성

Photon의 주요 환경 구성 파일은 PhotonServer.config입니다. 이 파일은 SDK의 binaries 폴더에 있습니다. 이 파일은 애플리케이션 설정, IP의 리스너 그리고 특정 값의 성능 구성을 위해 사용됩니다. 이 파일에는 게임 로직의 구성 값을 포함하고 있지는 않습니다.

기본값은 Photon이 더 많은 코어를 가진 컴퓨터에서 잘 확장되지만 일반 컴퓨터에서도 돌아갈 수 있도록 되어 있습니다. 일반적으로 성능 수정은 필요하지 않습니다.

여기에 기술한 설정이 가장 일반적으로 사용됩니다.

Photon Server 구성 설정 페이지에 더 자세히 설명되어 있습니다.

인스턴스 노드

여러 인스턴스가 지원됩니다. 각 인스턴스에는 구성 파일에 별도의 노드가 있습니다. 인스턴스는 애플리케이션, 리스너 및 기타 설정 그룹이며 인스턴스를 실행할 때 함께 사용해야 합니다.

예제:

XML

<Configuration>
  <Instance Name="CustomPhotonServerInstance"
    MaxMessageSize="512000"
    MaxQueuedDataPerPeer="512000"
    PerPeerMaxReliableDataInTransit="51200"
    PerPeerTransmitRateLimitKBSec="256"
    PerPeerTransmitRatePeriodMilliseconds="200"
    MinimumTimeout="5000"
    MaximumTimeout="30000"
    DisplayName="OwnCloudTM">

    <!-- instance config here -->

  </Instance>
</Configuration>

인스턴스 노드는 다음의 속성을 가질 수 있습니다:

  • Name: Photon Socket Server에서 인스턴스에 사용할 이름입니다.
  • MaxMessageSize: 단일 피어에서 허용된 최대 전송 메시지 용량 (바이트).
  • MaxQueuedDataPerPeer: 피어당 최대 버퍼 크기 용량 (바이트)입니다.
  • PerPeerMaxReliableDataInTransit: 피어가 전송할 수 있고 피어가 아직 ACK를 수신하지 않은 신뢰할 수 있는 데이터의 최대 양입니다. 바이트. 이 양의 데이터가 전송되면 향후 신뢰할 수 있는 모든 데이터가 대기열에 포함됩니다.
  • PerPeerTransmitRateLimitKBSec: 1초 안에 전송할 수 있는 최대 데이터양(신뢰할 수 없고 신뢰할 수 없음)입니다(KB). 피어가 전송할 수 있는 데이터양을 제한하는 데 사용할 수 있습니다. 제한에 도달하면 신뢰할 수 있는 데이터가 대기열에 추가되고 신뢰할 수 없는 데이터가 삭제됩니다.
  • PerPeerTransmitRatePeriodMilliseconds: 전송 속도 제한을 확인하는 빈도입니다. 기본적으로 250ms마다(초당 4회) 검사하며 각 검사마다 PerPeerTransmitRateLimitKBSec 을 4씩 확장합니다. 값이 작을수록 데이터 흐름의 일관성이 높아지고 값이 클수록 흐름은 불안정해지지만 서버 리소스 사용은 줄어듭니다.
  • MinimumTimeout ("타임아웃 설정"을 확인하세요)
  • MaximumTimeout ("타임아웃 설정"을 확인하세요)
  • DisplayName: PhotonControl에서 인스턴스에 대해 표시할 이름입니다.
  • DataSendingDelayMilliseconds ("지연 설정"을 확인하세요)
  • AckSendingDelayMilliseconds ("지연 설정"을 확인하세요)
  • ProduceDumps: 프로그램이 죽은 경우 "덤프 파일" 생성을 사용할지 사용하지 않을지 스위치 덤프 파일은 Photon Core에서 문제를 찾는 데 필수적입니다.
  • DumpType ("Photon 코어 디버깅하기"를 확인하세요)
  • MaxDumpsToProduce ("Photon 코어 디버깅하기"을 확인하세요)
  • MaxDumpsToAttemptToProduce ("Photon 코어 디버깅하기"을 확인하세요)
  • ...

타임아웃 설정

인스턴스 노드의 두 값은 서버가 응답하지 않는 UDP 클라이언트를 시간 초과하는 방법을 설명합니다. MinimumTimeout 그리고 MaximumTimeout.

UDP와 연결된 피어는 연결을 끊기 전에 응답할 MinimumTimeout 밀리 초를 가지고 있습니다. 연결이 끊길 때까지의 실제 시간은 RTT 기록을 기준으로 피어당 동적으로 결정됩니다. 이전에 양호했던 RTT는 더 빨리 분리됩니다.

TCP 연결에는 노드 TCPListener (그리고 PhotonServer.config 에도)에 별도의 InactivityTimeout이 있습니다. 우리는 5초(5000ms)로 설정했습니다. 이 시간 동안 요청이 도착하지 않으면 연결 시간이 초과되고 종료됩니다. 클라이언트는 또한 이를 방지하기 위해 서버를 정기적으로 "ping"합니다.

클라이언트는 연결을 독립적으로 모니터링하며 연결을 시간 초과시킬 수도 있습니다. 양쪽 모두 여러분의 게임에 맞춰 비슷한 시간대를 가져야 합니다.

지연 설정

DataSendingDelayMillisecondsAckSendingDelayMilliseconds 속성은 성능과 최소 응답 시간 간의 균형을 나타냅니다. 이 지연은 트래픽을 줄이기 위해 약간의 지연을 직접 추가합니다. 대기를 통해 서버가 명령을 집계하여 하나의 패키지로 전송할 수 있습니다.

전송 지연은 서버가 아무것도 보내지 않을 때 트리거 되며ack 지연은 수신되는 신뢰할 수 있는 데이터에 의해서 트리거 됩니다.

위에서 볼 수 있듯이 기본값은 각각 50ms입니다. 우리는 이것이 좋은 값이라는 것을 알았지만 클라이언트와 서버가 같은 컴퓨터에서 실행되더라도 왕복 시간이 ~50ms 정도 걸립니다.

게임에 따라 로드 테스트를 다른 값으로 수행해야 합니다. 0의 지연은 타이머 사용을 건너뛰는 특수한 경우이므로 낮은 지연 < 10을 피하십시오.

로그 설정

  • LogFileLocation: 관리되지 않는 Photon Socket Server 로그 파일 위치. 절대 경로 또는 "PhotonSocketServer.exe"의 상대 경로 둘 중의 하나가 될 수 있습니다.
  • LogFileName: 관리되지 않는 Photon Socket Server 로그 파일 이름.
  • LoggingEnabled: 이 인스턴스의 관리되지 않는 로깅의 활성화 또는 비활성화.
  • LogUnimportantExceptions: 중요하지 않은 것으로 간주되는 일부 예외를 기록할지 여부.

스키마 확인

  • ValidateSchema: 이 인스턴스의 스키마 확인 활성화 또는 비활성화.
  • SchemaValidationFailureIsFatal: 스키마 유효성 검사 실패로 인해 서버가 종료되는지 여부.

애플리케이션 노드

구성 파일은 시작 시 Photon이 로드해야 하는 애플리케이션을 정의합니다. "Applications" 노드에서는 "Application" 항목을 여러 개 추가할 수 있습니다.

여러 애플리케이션을 로드하려면 고유한 이름을 가진 애플리케이션 노드를 더 추가하면 됩니다. 이 중 하나는 이름(예제의 "NameServer")을 사용하여 기본 애플리케이션으로 만들 수 있습니다. 기본 앱은 알 수 없는 애플리케이션에 연결을 시도하는 클라이언트의 폴백 앱입니다.

PhotonServer.config에 설정되지 않은 애플리케이션은 로드되지 않으며 배포할 필요도 없습니다. 애플리케이션이 구성에 있지만 파일이 없는 경우 Photon이 시작되지 않고 로그에서 문제의 이름을 남깁니다.

예제:

XML

<!-- Defines which applications are loaded on start and which of them is used by default. Make sure the default application is defined. -->
<!-- Application-folders must be located in the same folder as the bin_Win64 folders. The BaseDirectory must include a "bin" folder. -->
<Applications Default="NameServer">
  <Application
    Name="Master"
    BaseDirectory="LoadBalancing\Master"
    Assembly="Photon.LoadBalancing"
    Type="Photon.LoadBalancing.MasterServer.MasterApplication">
  </Application>
  <Application
    Name="Game"
    BaseDirectory="LoadBalancing\GameServer"
    Assembly="Photon.LoadBalancing"
    Type="Photon.LoadBalancing.GameServer.GameApplication">
  </Application>
  <Application
    Name="NameServer"
    BaseDirectory="NameServer"
    Assembly="Photon.NameServer"
    Type="Photon.NameServer.PhotonApp">
  </Application>
</Applications>

각 애플리케이션에는 연결할 때 클라이언트에서 사용할 수 있는 이름이 있습니다. 애플리케이션 노드에서 지원하는 속성입니다.

  • BaseDirectory: 애플리케이션이 존재하는 폴더를 정의합니다. 이 폴더는 "bin" 폴더 이름을 지정하지 않지만 관례에 따라 지정해야 합니다.
  • Assembly: 애플리케이션의 ".dll" 이름.
  • Type: 애플리케이션의 "main" 클래스 (Photon.SocketServer.ApplicationBase에서 상속됨).
  • ApplicationRootDirectory:
  • PassUnknownAppsToDefaultApp: 알 수 없는 애플리케이션 이름이 제공될 때 true 이면 기본 애플리케이션이 사용됩니다. false일 경우 연결이 종료되는 치명적인 오류가 발생됩니다. 기본값은 false입니다.
  • StartTimeoutMilliseconds: 지정된 시간 내에 애플리케이션이 시작되지 않으면 Photon이 종료됩니다. 0 = 타임아웃이 적용되지 않습니다.
  • StopTimeoutMilliseconds: 지정된 시간 내에 애플리케이션이 중지되지 않으면 Photon이 종료됩니다. 0 = 타임아웃이 적용되지 않습니다.

리스너

프로토콜, IP 및 포트별로 시스템의 엔드 포인트를 구성합니다. 여러 리스너 유형을 정의할 수 있습니다. 동일한 유형의 리스너를 여러 개 정의하여 여러 IP/포트 조합을 열 수 있습니다.

일반적인 설정

다음 속성들은 대부분의 리스너 간에 공유됩니다.

  • Name: 리스너의 선택적인 이름.
  • IPAddress: 기본값 IP 0.0.0.0는 지역적으로 사용할 수 있는 모든 IP에 대해서 Photon이 리슨하도록 합니다. IP가 여러 개인 컴퓨터는 여기서 올바른 IP를 정의해야 합니다. 와일드카드 IP를 교체하면 Photon은 특정 IP 주소만 엽니다.
    노트: IP에 바인딩된 라이선스를 사용하는 경우 구성된 리스너에서 이 IP를 설정해야 합니다.
  • Port: 리슨 할 포트 번호.
  • IPAddressIPv6: 수신할 IP 주소, 예, 2001:db8:a0b:12f0::1 또는 :: 모든 인터페이스 수신.
  • ListenBacklog: 수신 백로그 큐의 크기입니다. 이것은 동시에 설정될 수 있는 연결의 수에 영향을 미칩니다. 예를 들어, 151개의 클라이언트가 정확히 동시에 연결을 시도할 경우 마지막 연결이 거부될 수 있습니다. 각 연결 설정 시도는 시간이 거의 걸리지 않으며 일단 연결이 설정되면 제한의 영향을 받지 않습니다. 따라서 이 값을 10으로 설정하고 동시에 연결을 10회 이상 시도하지 않는 한 10,000개의 동시 활성 연결을 유지할 수 있습니다.
  • Disabled: 리스너를 사용하지 않을 것인지 정의.
  • RecvBufferSize: 수신 데이터의 버퍼 크기.
  • SendBufferSize: 송신 데이터의 버퍼 크기.

TCP 리스너 설정

  • FlowControlMaxQueuedBytes: 피어가 전송할 수 있는 최대 데이터양입니다. 바이트 단위입니다. 이 양의 데이터가 전송되면 이후 모든 데이터가 큐에 포함됩니다. 이는 TCP Windows를 운영 체제의 자체 버퍼로 고려합니다.

  • DisableNagle: Nagle의 알고리즘이 연결에서 사용 중인지 확인합니다. true로 설정하면 Nagle이 비활성화되고 TCP 스택에 도달하자마자 아웃바운드 TCP 데이터가 전송됩니다. false로 설정하면 Nagle이 작동 중이며 TCP 스택은 아웃바운드 데이터를 더 적은 데이터그램으로 합치려고 시도합니다. 이 설정을 true로 설정하면 전송되는 데이터그램이 많아지는 대신 TCP 연결의 대기 시간이 다소 단축될 수 있습니다.

  • InactivityTimeout: 서버가 응답하지 않는 피어의 연결을 끊기 전까지의 시간입니다. "0" 값은 타임아웃이 없음을 의미합니다. 밀리 초 단위입니다.

  • LoggingEnabled: 리스너의 로그를 활성화 할지를 결정합니다.

사용자 지정 연결 메시지

  • CustomConnectMessagePrefix: Photon은 구성된 문자열을 클라이언트의 연결 메시지의 접두사로 보낸 경우 무시합니다.
  • CustomConnectMessageSuffix: Photon은 구성된 문자열을 클라이언트의 연결 메시지의 접미사로 보낸 경우 무시합니다.
  • CustomConnectMessageIsRequired: true로 설정하면 각 연결 메시지에 사용자 지정 접두사/접미사가 필요합니다.

매니지드 애플리케이션 설정

  • OverrideApplication: 이 포트에 연결하는 클라이언트는 클라이언트가 어떤 항목에 연결되든 상관없이 이름이 지정된 애플리케이션에 있게 됩니다.
  • DefaultApplication: 클라이언트에서 명명된 애플리케이션을 찾을 수 없는 경우 폴백입니다.
  • MaxMessageSize: 인바운드 및 아웃바운드 메시지에 허용되는 기본 최대 바이트 수를 결정합니다.
  • MaxInboundMessageSize: 서버가 이 리스너를 통해 수신하는 메시지의 최대 바이트 수를 결정합니다. 메시지가 MaxInboundMessageSize 제한을 초과하면 클라이언트의 서버 연결이 끊어집니다. 기본값은 MaxMessageSize에 구성된 값입니다.
  • MaxOutboundMessageSize: 서버가 이 리스너를 통해 보내는 메시지의 최대 바이트 수를 결정합니다. 메시지가 MaxOutboundMessageSize 제한을 초과하면 클라이언트의 서버 연결이 끊어집니다. 기본값은 MaxMessageSize에 구성된 값입니다.
  • AppDataInactivityTimeout: 애플리케이션(매니지드 코드)이 로우 레벨(원시 코드) keep-alive ping과 반대로 데이터를 가져오지 않는 경우 시간 초과입니다.

HttpListeners

v5에서, WebSocketListeners 은 HTTPListeners를 통해 구성되었으며 PeerTypeWebSocket으로 지정합니다.

XML

<HTTPListeners>
      <HTTPListener Name="MyListenerNameShowsUpInPerfMon"
        IPAddress="0.0.0.0"
        IPAddressIPv6="::"
        Port="80"
        OverrideApplication = "WebSocketEchoApp"
        InactivityTimeout="5000"
        DisableNagle="true"
        Secure = "true"
        PeerType="WebSocket"        
        MaxUriLength="255"
        MaxHeaderLength="255"
        MaxHeaders="20"
        PermittedOrigins="photonengine.com, myawesome.game, etc."
        MaxInboundMessageSize="10000"
        MaxInboundMessageQueueSize="50000"
        MaxOutboundMessageSize="10000"
        MaxOutboundMessageQueueSize="50000"
        Ping="false"
        WebHook="false"
        NoCache="true">
        <StandardHeaders>
          <StandardHeader Name="X-Blah" Value="X-BlahValue"/>
          <StandardHeader Name="X-Blah2" Value="X-Blah2Value"/>
        </StandardHeaders>
        <Routing>
           <Route Url="/"/> <!-- If present this is a wildcard match for ANY url not specified -->
           <Route Url="/photon/m" Ping="true" WebHook="true"/>
           <Route Url="/photon/g"/>
           <Route Url="/photon/g1" OverrideApplication="HttpApp1" PeerType="Websocket"/>
           <Route
               PermittedOrigins="*"
               Url="/photon/g2"
               InactivityTimeout="12000"
               MaxInboundMessageSize="10000"
               MaxInboundMessageQueueSize="50000"
               MaxOutboundMessageSize="10000"
               MaxOutboundMessageQueueSize="50000"
               OverrideApplication="HttpApp2"/>
        </Routing>
      </HTTPListener>

이 아이디어는 애플리케이션 별로 리스너를 구성하고 필요한 경우 엔드 포인트당 추가 경로와 추가 헤더(필요한 경우)를 구성합니다. 구성된 경로가 기본 리스너 설정에서 상속되거나 경로를 재정의할 수 있습니다.

HttpListener 노드 지정 속성:

  • RouteCounters: true 또는 false
  • MaxUriLength: URI의 초대 길이.
  • MaxHeaderLength: 요청 헤더의 최대 길이.
  • MaxHeaders: 요청 헤더의 최대 개수.
  • MaxKeepAliveTime: 연결 유지에 대한 허용 최대 지속 시간.
  • MaxKeepAliveRequests: 동일한 연결 유지에 허용되는 최대 요청 수.
  • CloseDelayMilliseconds: 연결이 종료되는 지연 시간.

루트 노드 지정 속성:

  • SubProtocols: WebSockets 피어 유형에만 해당.
  • PingEvery: 이 엔드 포인트를 ping 해야 하는 빈도입니다. WebSockets 피어 유형에만 해당됩니다. "Ping"을 true로 설정해야 합니다.

HttpListener와 Route 노드 간에 공유되는 속성입니다:

  • Name: 리스너 또는 라우트의 이름
  • PermittedOrigins: 화이트리스트된 도메인. v5 BETA에서 "Access-Control-Allow-Origin"이라고 하며 동일한 이름의 HTTP 응답 헤더를 설정합니다(CORS).
  • Ping: 이 엔드 포인트가 핑되었거나 되어 있지 않으면 true 또는 false.
  • WebHook: 이 엔드 포인트가 WebHook인 경우 true 또는 false.
  • Url: 이 엔드 포인트에 대한 URL.

노트: 기본적으로, 라우트 수준 Windows 성능 카운터는 단일 경로를 가진 HTTP 리스너에 대해 만들어지지 않습니다.

런타임 노드

사용할 Photon 런타임 어셈블리를 정의합니다.

XML

<Runtime
  Assembly="PhotonHostRuntime, Culture=neutral"
  Type="PhotonHostRuntime.PhotonDomainManager"
  UnhandledExceptionPolicy="TerminateProcess">
</Runtime>

매크로

경로 매크로

경로 구성을 단순화하기 위해 가장 중요한 폴더에 대한 매크로 집합을 제공합니다:

  • [EXE]: 서버 실행 가능한 "PhotonSocketServer.exe"이 있는 폴더.
  • [CONFIG]: 서버에 의해서 사용되는 환경 구성 파일이 있는 폴더.
  • [DEPLOY]: [CONFIG]의 상위 폴더, 예, [CONFIG]\...
  • [CERTS]: 기본 "CertificatePath" 값: [EXE]\certs.

매크로를 사용하여 상대 경로를 구성할 수 있습니다. 서버 시작 시 관리되지 않는 PhotonSocketServer 로그 파일에 매크로가 기록됩니다:

Plain Old Text

22572: 16:13:36.098 - Config File: D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64\PhotonServer.config
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CONFIG]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[DEPLOY]" - "[CONFIG]\.."
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[EXE]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CERTS]" - "[EXE]\certs"

다음과 같이 PhotonServer 인스턴스 설정을 통해 명시적 경로를 사용하여 매크로를 재지정할 수 있습니다:

  • PathMacro_EXE
  • PathMacro_CERTS

카운터 매크로

라우트 레벨 카운터 이름에는 다음과 같은 매크로가 포함될 수 있습니다:

  • [ADDRESS]: IP 주소 예, 192.168.0.1.
  • [PORT]: 포트 번호 예, 8080.
  • [FULL_ADDRESS]: IP 주소와 포트: 192.168.0.1:8080.
  • [ENDPOINT]: 엔드 포인트의 이름.
  • [PARENT]: 엔드 포인트 또는 ParentCounters=""의 이름.

관리되는 SocketServer 설정

애플리케이션 수준에서 PhotonSocketServer와 관련된 일부 설정을 구성할 수 있습니다. 이 작업은 다음과 같이 애플리케이션의 각 구성 파일에 선택적 <SocketServer> 노드/요소를 추가하여 수행할 수 있습니다(다음 예제에서는 각 설정의 기본값이 포함됩니다):

XML

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <Photon>
    <SocketServer SecurityProtocol="Tls12|Tls13"
        Protocols="GpBinaryV16,GpBinaryV18,Json"
        LogGuardOn="true">
        <Limits MessageRate="5000"
          MessageDataRate="2147483647"
          MaxMessageSize="512000"
          OnlyLogViolations="false"/>
        <S2S RpcProtocol="GpBinaryV18" UseInitV3="false"/>
    </SocketServer>
  </Photon>
</configuration>
  • SecurityProtocol: 서버가 사용할 TLS 버전을 정의합니다. 현재 TLS1.2 및 TLS1.3이 표준이므로 기본값이 권장되며 보안이 강화됩니다. 필요한 경우에만 변경하세요. 가능한 값: Ssl3|Tls|Tls11|Tls12|Tls13. 이 값의 집합은 .NET의 System.Net.ServicePointManager.SecurityProtocol입니다.
  • Protocols: 이 서버 애플리케이션에서 사용할 수 있는 데이터 직렬화 프로토콜을 정의합니다.
  • MessageRate: 초당 피어당 허용되는 최대 수신 메시지 수입니다. 기본값은 5000 입니다.
  • MessageDataRate: 초당 피어당 허용되는 버퍼링 된 수신 데이터의 최대 크기입니다. 기본값은 2147483647 입니다(int.MaxValue).
  • MaxMessageSize: 허용되는 수신되는 메시지의 최대 크기입니다. 기본값은 512000입니다.
  • LogGuardOn: 스팸 로깅에 대한 보호를 활성화하거나 비활성화합니다.
  • OnlyLogViolations: 제한을 위반할 경우 수행할 조치(로그 위반 또는 피어 연결 끊기)를 정의합니다.
  • RpcProtocol: 서버 간 통신에 사용되는 데이터 직렬화 프로토콜입니다.
  • UseInitV3: 서버 간 통신에 InitRequest 버전 3을 사용할지 여부를 지정합니다.
Back to top