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を有効にする
準備作業:
-
Workermanバージョン>=3.3.7
-
PHPにopenssl拡張がインストールされている
-
証明書を申請し(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と入力してアクセスします。
注意:
-
httpsポートには必ずhttpsプロトコルでアクセスする必要があります。httpプロトコルではアクセスできません。
-
証明書は一般的にドメインにバインドされるため、テスト時にはドメインを使用し、IPアドレスは使用しないでください。
-
httpsでアクセスできない場合は、サーバーファイアウォールを確認してください。
nginxを利用したsslのプロキシ
Workerman自身のSSLを使用する代わりに、nginxをSSLプロキシとして利用してhttpsを実現することも可能です。
注意
nginxがSSLをプロキシする方法とWorkermanでSSLを設定する方法のどちらか一方を選択することができます。両方を同時に有効にすることはできません。
通信の原理とプロセスは次のとおりです。
-
クライアントがhttps接続をnginxに発起します。
-
nginxはhttpsプロトコルのデータをhttpプロトコルに変換し、Workermanのhttpポートに転送します。
-
Workermanはデータを受信し、ビジネスロジックを処理してhttpプロトコルのデータをnginxに返します。
-
nginxはhttpプロトコルのデータを再びhttpsに変換し、クライアントに転送します。
nginxの設定参考
前提条件および準備作業:
-
Workermanが8181ポート(httpプロトコル)を監視しているとします。
-
証明書を申請し(pem/crtファイルおよびkeyファイル)、/etc/nginx/conf.d/sslに配置している。
-
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 "";
}
}