如何将 Traefik 配置为位于 Nginx 和 PHP-FPM WebSocket 服务器之前?

问题描述

我想使用 Traefik 作为 Ratchet WebSocket 服务器背后的反向代理(deploy section 中建议的第三个选项)。

目标是使用反向代理管理 HTTPS 和 wss,同时在 Ratchet 服务器上保留简单的 HTTP 和 ws。

我的 WebSocket 服务器暴露在端口 8080 上,例如 this example

public function run()
{
    $loop   = React\EventLoop\Factory::create();
    $pusher = new Pusher();

    // Listen for the web server to make a ZeroMQ push after an AJAX request
    $context = new React\ZMQ\Context($loop);
    $pull    = $context->getSocket(ZMQ::SOCKET_PULL);
    $pull->bind('tcp://0.0.0.0:5555');
    $pull->on('message',array($pusher,'onEntry'));

    // Set up our WebSocket server for clients wanting real-time updates 
    $webSock = new React\Socket\Server('0.0.0.0:8443',$loop); 

    $webServer = new IoServer(
        new HttpServer(
            new WsServer(
                new WampServer(
                    $pusher
                )
            )
        ),$webSock
    );

    $loop->run();
}

this post 之后,我已经能够通过 Traefik 配置 HTTPS。

这是我的简化版docker-compose.yml

Nginx:
  image: wodby/Nginx:$Nginx_TAG
  container_name: "${PROJECT_NAME}_Nginx"
  depends_on:
    - PHP
  environment:
    Nginx_STATIC_OPEN_FILE_CACHE: "off"
    Nginx_ERROR_LOG_LEVEL: debug
    Nginx_BACKEND_HOST: PHP
    Nginx_SERVER_ROOT: /var/www/html/webroot
    Nginx_VHOST_PRESET: $Nginx_VHOST_PRESET
  volumes:
    - ./html:/var/www/html:cached
  labels:
    - "traefik.http.routers.${PROJECT_NAME}_Nginx.rule=Host(`${PROJECT_BASE_URL}`)"
    - "traefik.http.middlewares.${PROJECT_NAME}_Nginx_https.redirectscheme.scheme=https"
    - "traefik.http.routers.${PROJECT_NAME}_Nginx.entrypoints=web"
    - "traefik.http.routers.${PROJECT_NAME}_Nginx.middlewares=${PROJECT_NAME}_Nginx_https@docker"
    - "traefik.http.routers.${PROJECT_NAME}_Nginx_https.rule=Host(`${PROJECT_BASE_URL}`)"
    - "traefik.http.routers.${PROJECT_NAME}_Nginx_https.tls=true"
    - "traefik.http.routers.${PROJECT_NAME}_Nginx_https.entrypoints=websecure"

PHP:
  build:
    context: .
    dockerfile: docker/PHP-fpm/Dockerfile
  container_name: "${PROJECT_NAME}_PHP"
  volumes:
    - ./html:/var/www/html
  labels:
    - "traefik.http.routers.PHP.rule=Host(`${PROJECT_BASE_URL}`)"

traefik:
  image: traefik:v2.0
  container_name: "${PROJECT_NAME}_traefik"
  command:
    - "--api.insecure=true"
    - "--entrypoints.web.address=:80"
    - "--entrypoints.websecure.address=:443"
    - "--providers.docker=true"
    - "--providers.file.filename=/etc/traefik/dynamic_conf/config.yml"
    - "--providers.file.watch=true"
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
    - "./docker/traefik/config.yml:/etc/traefik/dynamic_conf/config.yml" # used to define the certificate path
    - "./docker/certs:/tools/certs"

但是,我现在如何将 HTTPS/wss 到 HTTP/ws 转发到 PHP 服务?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...