创建https服务

问:

Workerman如何创建一个https服务,使得客户端可以用过https协来连接通讯。

答:

https协议实际是http+SSL,就是在http协议上加入SSL层。Workerman支持http协议,同时也支持SSL(需要Workerman版本>=3.3.7),
所以只需要在http协议的基础上开启SSL即可支持https协议。

Workerman开启SSL

准备工作:

1、Workerman版本不小于3.3.7

2、PHP安装了openssl扩展

3、已经申请了证书(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下

  1. <?php
  2. require_once __DIR__ . '/Workerman/Autoloader.php';
  3. use Workerman\Worker;
  4. // 证书最好是申请的证书
  5. $context = array(
  6. 'ssl' => array(
  7. 'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // 也可以是crt文件
  8. 'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
  9. 'verify_peer' => false,
  10. )
  11. );
  12. // 这里设置的是http协议
  13. $worker = new Worker('http://0.0.0.0:443', $context);
  14. // 设置transport开启ssl,变成http+SSL即https
  15. $worker->transport = 'ssl';
  16. $worker->onMessage = function($con, $msg) {
  17. $con->send('ok');
  18. };
  19. Worker::runAll();

通过Workerman以上的代码就创建了https服务,客户端就可以通过https协议来连接workerman实现安全加密通讯了。

测试:

浏览器地址栏输入https://域名:4431访问。

注意:

1、https端口必须用https协议访问,http协议无法访问。

2、证书一般是与域名绑定的,所以测试的时候请使用域名,不要使用ip。

3、如果使用https无法访问请检查服务器防火墙。

利用nginx作为ssl的代理

除了用Workerman自身的SSL,也可以利用nginx作为SSL代理实现https。

通讯原理及流程是:

1、客户端发起https连接连到nginx

2、nginx将https协议的数据转换成http协议并转发到Workerman的http端口

3、Workerman收到数据后做业务逻辑处理,返回http协议的数据给nginx

4、nginx再将http协议的数据转换成https,转发给客户端

nginx配置参考

前提条件及准备工作:

1、假设Workerman监听的是80端口(http协议)

2、已经申请了证书(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下

3、打算利用nginx开启4431端口对外提供wss代理服务(端口可以根据需要修改)

nginx配置类似如下

  1. server {
  2. listen 4431;
  3. ssl on;
  4. ssl_certificate /etc/nginx/conf.d/ssl/laychat/laychat.pem;
  5. ssl_certificate_key /etc/nginx/conf.d/ssl/laychat/laychat.key;
  6. ssl_session_timeout 5m;
  7. ssl_session_cache shared:SSL:50m;
  8. ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  9. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  10. location /
  11. {
  12. proxy_pass http://127.0.0.1:80;
  13. proxy_http_version 1.1;
  14. proxy_set_header X-Real-IP $remote_addr;
  15. }
  16. }