https 서비스 생성

질문:

Workerman은 클라이언트가 https로 연결 통신할 수 있는 https 서비스를 어떻게 생성합니까?

답변:

https 프로토콜은 실제로 http + SSL로, http 프로토콜 위에 SSL 레이어를 추가한 것입니다. Workerman은 http 프로토콜을 지원할 뿐만 아니라 SSL도 지원합니다 (Workerman 버전 >= 3.3.7 필요),
그래서 http 프로토콜의 기반 위에서 SSL을 활성화하면 https 프로토콜을 지원하게 됩니다.

Workerman이 https를 지원하는 두 가지 일반적인 방식이 있으며, 하나는 Workerman이 직접 SSL을 활성화하는 방법이고, 다른 하나는 nginx를 사용하여 SSL을 프록시하는 방법입니다. 두 가지 방법 중 하나를 선택할 수 있으며 동시에 설정할 수는 없습니다.

Workerman에서 SSL 활성화

준비 작업:

  1. Workerman 버전 >= 3.3.7

  2. PHP에 openssl 확장이 설치됨

  3. 이미 인증서(pem/crt 파일 및 key 파일)를 신청하여 /etc/nginx/conf.d/ssl 아래에 두었습니다.

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// 인증서는 신청한 것이 가장 좋습니다.
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // crt 파일도 가능
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // 자가 서명 인증서일 경우 이 옵션을 활성화해야 합니다.
    )
);
// 여기 설정된 것은 http 프로토콜입니다.
$worker = new Worker('http://0.0.0.0:443', $context);
// transport를 ssl로 설정하여 http+SSL 즉 https로 변환합니다.
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

위의 Workerman 코드를 통해 https 서비스를 생성하면 클라이언트는 https 프로토콜을 통해 Workerman에 연결하여 안전한 암호화 통신을 구현할 수 있습니다.

테스트:

브라우저 주소창에 https://도메인:443을 입력하여 접근합니다.

주의:

  1. https 포트는 반드시 https 프로토콜로 접근해야 하며, http 프로토콜로는 접근할 수 없습니다.

  2. 인증서는 일반적으로 도메인과 바인딩되므로 테스트할 때는 도메인을 사용하고 IP를 사용하지 마십시오.

  3. https로 접근할 수 없는 경우 서버 방화벽을 확인하십시오.

nginx를 SSL 프록시로 사용

Workerman 자체의 SSL 외에도 nginx를 SSL 프록시로 사용하여 https를 구현할 수 있습니다.

주의
nginx SSL 프록시는 Workerman에서 SSL을 설정하는 것 중 하나를 선택해야 하며, 동시에 활성화할 수 없습니다.

통신 원리 및 과정은 다음과 같습니다:

  1. 클라이언트가 https 연결을 nginx에 요청합니다.

  2. nginx는 https 프로토콜의 데이터를 http 프로토콜로 변환하여 Workerman의 http 포트로 전달합니다.

  3. Workerman은 데이터를 수신한 후 비즈니스 논리를 처리하고 http 프로토콜의 데이터를 nginx에 반환합니다.

  4. nginx는 http 프로토콜의 데이터를 다시 https로 변환하여 클라이언트에 전달합니다.

nginx 구성 참고

전제 조건 및 준비 작업:

  1. Workerman이 8181 포트(http 프로토콜)를 수신하고 있다고 가정합니다.

  2. 이미 인증서를 신청하여 /etc/nginx/conf.d/ssl 아래에 두었습니다.

  3. nginx를 사용해 443 포트로 외부에 wss 프록시 서비스를 제공할 예정입니다(포트는 필요에 따라 수정할 수 있습니다).

nginx 구성은 다음과 같이 비슷합니다:


upstream workerman {
    server 127.0.0.1:8181;
    keepalive 10240;
}

server {
  listen 443;
  server_name 사이트도메인.com;
  access_log off;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
  ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

  location /
  {
    proxy_pass http://workerman;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Connection "";
  }
}