在Docker中,如何通过中间反向代理将WebSocket集成到LAMP服务中?

在Docker中,如何通过中间反向代理将WebSocket集成到LAMP服务中?

早上好,朋友们,我有以下docker-compose.yml文件,用于安装反向代理和带有 phpmyadmin 服务的 LAMP 堆栈。

笔记:我实际上是从头开始创建它的,并添加了新的功能,它可能并不完美。

version: "3.8"

services:
  reverse-proxy:
    env_file:
      - .env
    container_name: Proxy-Server
    image: jwilder/nginx-proxy:alpine
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/nginx/certs
    ports:
      - "${LH_HOST_MACHINE_UNSECURE_HOST_PORT:-80}:80"
      - "${LH_HOST_MACHINE_SECURE_HOST_PORT:-443}:443"
    depends_on:
      - webserver
      - phpmyadmin
    networks:
      - lamp-network
    extra_hosts:
      - "${LH_WEB_SERVER_DOMAIN}:127.0.0.1"
      - "${LH_PHPMYADMIN_DOMAIN}:127.0.0.1"
    environment:
      - TRUST_DOWNSTREAM_PROXY=true
      - ENABLE_WEBSOCKETS=true
    labels:
      - "lh2.setup.description=Proxy Server"
      - "lh2.setup.role=reverse-proxy"
  webserver:
    env_file:
      - .env
    container_name: ${LH_SYSTEM_NAME}-Web-Server
    build:
      context: ./bin/${LH_PHP_ENVIRONMENT}
    restart: always
    expose:
      - 80
      - 443
    networks:
      - lamp-network
    depends_on:
      - database
    volumes:
      - ${LH_PROJECT_ROOT}:/var/www/html:rw
      - ${LH_PROJECT_ROOT}${LH_DOCUMENT_ROOT}:/var/www/html/public:rw
      - ${LH_VHOSTS_DIR}:/etc/apache2/sites-enabled
      - ${LH_PHP_INI}:/usr/local/etc/php/php.ini
      - ${LH_LOG_DIR}:/var/log/apache2
      - ${LH_LOG_CRON}:/var/log/cron
    environment:
      LH_WEB_MASTER: ${LH_WEB_MASTER}
      VIRTUAL_HOST: ${LH_WEB_SERVER_DOMAIN}
      LH_APACHE_DOCUMENT_ROOT: ${LH_APACHE_DOCUMENT_ROOT}
      LH_DOCUMENT_ROOT: ${LH_DOCUMENT_ROOT}
      HOST_MACHINE_MYSQL_PORT: ${LH_HOST_MACHINE_MYSQL_PORT}
      MYSQL_DATABASE: ${LH_MYSQL_DATABASE}
      MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${LH_MYSQL_USER}
      MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
    extra_hosts:
      - "host.docker.internal:host-gateway"
    labels:
      - "lh2.setup.description=Web Server"
      - "lh2.setup.role=webserver"
  database:
    env_file:
      - .env
    build:
      context: ./bin/${LH_DATABASE}
    container_name: ${LH_SYSTEM_NAME}-${LH_DATABASE}
    restart: always
    networks:
      - lamp-network
    ports:
      - "127.0.0.1:${LH_HOST_MACHINE_MYSQL_PORT}:${LH_HOST_MACHINE_MYSQL_PORT}"
    volumes:
      - ${LH_MYSQL_INITDB_DIR}:/docker-entrypoint-initdb.d
      - ${LH_MYSQL_DATA_DIR}:/var/lib/mysql
      - ${LH_MYSQL_LOG_DIR}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${LH_MYSQL_DATABASE}
      MYSQL_USER: ${LH_MYSQL_USER}
      MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
    labels:
      - "lh2.setup.description=Database Server"
      - "lh2.setup.role=database"
  phpmyadmin:
    env_file:
      - .env
    container_name: ${LH_SYSTEM_NAME}-phpmyadmin
    image: phpmyadmin/phpmyadmin
    restart: always
    depends_on:
      - database
    environment:
      VIRTUAL_HOST: ${LH_PHPMYADMIN_DOMAIN}
      PMA_HOST: database
      PMA_PORT: 3306
      PMA_USER: root
      PMA_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${LH_MYSQL_USER}
      MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
      UPLOAD_LIMIT: ${LH_UPLOAD_LIMIT}
      MEMORY_LIMIT: ${LH_MEMORY_LIMIT}
    volumes:
      - /sessions
      - ${LH_PHP_INI}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
    networks:
      - lamp-network
    labels:
      - "lh2.setup.description=phpMyAdmin"
      - "lh2.setup.role=phpmyadmin"
networks:
  lamp-network:
    driver: bridge

所有这些都可以在我的本地 Windows 11 计算机上完美运行,但现在我想集成 websocket 功能,我明白为此我必须使用 SSL 证书,这就是我启用端口 443 的原因,但我找不到示例或在文档中找不到哪些东西对我有用或者我应该添加什么:

  1. 我应该在我的 hosts 文件中做哪些更改,目前需要添加此行来重定向 http 请求:
# Developer Area Docker
127.0.0.1 lh-2.dock lh-2.pma.dock
# End of section
  1. 如何使用 yml 文件生成 SSL 证书,我想一定有一些服务映像可以执行此操作,并且不需要更改我的代理的映像,除了在容器之间合并或共享卷。

我在这里迷失了,因为我甚至不知道从哪里开始。

  1. 我应该在我的 yml 文件中修改 reverse_proxy 服务以将 wss:// 请求重定向到 webserver 服务容器。

在这里我更加迷失,因为我甚至不知道从哪里开始。

  1. 我应该在我的 Web 服务器/LAMP 服务中修改什么来捕获反向代理发送的内容。

在这里我更加迷茫了,因为我甚至不知道从哪里开始。如果需要更多信息,请告诉我,以便我可以添加。

相关内容