How to configure Traefik to be in front of Nginx and a PHP-FPM WebSocket server?

Viewed 2269

I'd like to use Traefik as a reverse proxy behind a Ratchet WebSocket server (3rd option suggested in deploy section).

The goal is to manage HTTPS and wss with the reverse proxy while keeping a simple HTTP and ws on the Ratchet server.

My WebSocket server exposes on port 8080, like in 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();
}

Following this post, I have been able to configure HTTPS via Traefik.

Here is my simplified 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"

However, how can I now forward HTTPS/wss to HTTP/ws to the php service?

0 Answers
Related