Skip to content

创建 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
<?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 "";
  }
}

基于 MIT 许可发布