使用Docker部署nginx来支持WebSocket

使用Docker上的nginx来实现WebSocket。

在使用Docker的nginx环境时,我遇到了一些问题,想要进行WebSocket连接,因此在此分享一下。希望能对其他面临相同问题的人有所帮助。不过,这里将省略有关docker-compose的使用方式部分。

准备工作

    1. 从Dockerhub上常规安装

 

    1. https://hub.docker.com/_/nginx/

 

    1. 创建nginx的default.conf

 

    将以下内容保存在父级文件中,文件名为mysite.template,而不是在容器中保存,并通过以下介绍的方法将其加载到容器中。
# For WebSocket

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location /ws/ {
        proxy_pass http://(ws通信したいコンテナ名)/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

以下是用于建立WebSocket连接的描述。

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

将上述内容保存为文件名为mysite.template的文件。

使用docker来配置nginx环境(失败示例)

    1. 在docker-compose.xml文件中进行设置,

 

    按照以下方式将mysite.template文件加载到容器中。
version: '2'
services:
    proxy:
        restart: always
        image: nginx
        container_name: nginx_proxy
        volumes:
         - ./mysite.template:/etc/nginx/conf.d/mysite.template
        ports:
         - "80:80"
        command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

在环境的描述部分,使用envsubst命令将其作为模板加载
2. 执行docker-compose命令

docker-compose up -d proxy

如果发生错误,就无法启动。
3. 检查容器内的default.conf文件。

docker exec -it nginx_proxy bash

(在集装箱内) –

cat /etc/nginx/conf.d/default.conf

可能是像下面这样的描述

…(略)…
proxy_http_version 1.1;
        proxy_set_header Upgrade ;
        proxy_set_header Connection "upgrade";
…(略)…

(\$http_upgrade的部分不见了。。)

以下是一个汉语的译文选项:
这里是提示。

这是envsubst的规范,如果仅仅以\$…来描述的话,它会被视为模板变量。
所以,通过定义一个虚拟变量并传入,\$…的描述也能直接反映出来。

使用Docker设置Nginx环境(成功示例)。

    1. 在docker-compose.xml中进行配置

 

    以类似下面的方式将mysite.template加载到容器中描述
version: '2'
services:
    proxy:
        restart: always
        image: nginx
        container_name: nginx_proxy
        volumes:
         - ./mysite.template:/etc/nginx/conf.d/mysite.template
        ports:
         - "80:80"
         environment:
         - DUMMY=dummy
        command: /bin/bash -c "envsubst '$$DUMMY' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

(改动)

    • environmentでダミー変数(DUMMY)を定義

 

    commandのenvsubstで定義した変数を渡す
    运行docker-compose
docker-compose up -d proxy

成功地执行了,没有发生任何错误!

只需使用常规的webSocket编写来与客户端建立连接,然后应该会有响应。

在wss上的连接

即使是在wss的情况下,也不需要特殊的设置。只需在常规的ssl描述中添加WebSocket的描述即可。

    docker-compose.xml
version: '2'
services:
    proxy:
        restart: always
        image: nginx
        container_name: nginx_proxy
        volumes:
         - ./mysite.template:/etc/nginx/conf.d/mysite.template
        ports:
         - "80:80"
         - "443:443"
        environment:
         - DUMMY=dummy
        command: /bin/bash -c "envsubst "envsubst '$$DUMMY' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

-我的网站模板

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl on;
    ssl_certificate (中間証明書のパス)/fullchain.pem;
    ssl_certificate_key (中間証明書のパス)/privkey.pem;

    server_name (ドメイン名);

    location /ws/ {
        proxy_pass http://(wss通信したいコンテナ名)/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
广告
将在 10 秒后关闭
bannerAds