httpsサービスの作成

質問:

Workermanはどのようにhttpsサービスを作成し、クライアントがhttpsを通じて接続通信できるようにしますか。

回答:

httpsプロトコルは実際にはhttp+SSLであり、httpプロトコルの上にSSL層を追加したものです。Workermanはhttpプロトコルをサポートし、同時にSSLもサポートしています(Workermanバージョン>=3.3.7が必要です)。
したがって、httpプロトコルの基盤の上にSSLを有効にするだけでhttpsプロトコルをサポートできます。

Workermanがhttpsをサポートするためには2つの一般的な方法があります。1つはWorkerman自体でSSLを有効にする方法、もう1つは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. 証明書を申請し(pem/crtファイルおよびkeyファイル)、/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 "";
  }
}