使用Docker部署nginx来支持WebSocket
使用Docker上的nginx来实现WebSocket。
在使用Docker的nginx环境时,我遇到了一些问题,想要进行WebSocket连接,因此在此分享一下。希望能对其他面临相同问题的人有所帮助。不过,这里将省略有关docker-compose的使用方式部分。
准备工作
-
- 从Dockerhub上常规安装
-
- https://hub.docker.com/_/nginx/
-
- 创建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环境(失败示例)
-
- 在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环境(成功示例)。
-
- 在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";
}