配置nginx反向代理进行mqtt通信
Config nginx to reverse proxy for mqtt communication
我在 IP 和端口上有一个 MQTT (EMQX) 服务器 运行。我使用 nodejs MQTT 库在我的服务和该端口之间直接通信。
我想使用反向代理 (nginx) 以便能够使用 DNS 来修剪通信。
此时我的nginx是这样配置的:
events { worker_connections 1024; }
stream {
upstream websocket {
server ******:7053;
}
server {
listen 8888;
proxy_pass websocket;
}
}
http {
server {
listen 884;
server_name *******;.
error_log /var/log/errors.log;
location / {
proxy_pass *******;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
}
所以当我尝试通过端口 8888 连接时,nginx 总是超时
2020/12/03 16:23:48 [error] 22#22: *31 upstream timed out (110: Connection timed out) while connecting to upstream, client: 89.155.0.10, server: 0.0.0.0:8888, upstream: "192.16.102.26:7053", bytes from/to client:0/0, bytes from/to upstream:0/0
两种服务都在 docker 容器中。并由 docker 组合开始。
MQTT 服务的组合是:
version: "2.1"
services:
mqtt-broker:
build:
context: .
dockerfile: Dockerfile
container_name: evio_mqtt_broker
environment:
- EMQX_LISTENER__SSL__EXTERNAL=8883
- EMQX_DASHBOARD__LISTENER__HTTP=18083
- EMQX_LOADED_PLUGINS="emqx_auth_username,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard"
- EMQX_LISTENER__SSL__EXTERNAL__TLS_VERSIONS=tlsv1.2
#- EMQX_LISTENER__SSL__EXTERNAL__KEYFILE=etc/certs/key.pem
#- EMQX_LISTENER__SSL__EXTERNAL__CERTFILE=etc/certs/cert.pem
#- EMQX_LISTENER__SSL__EXTERNAL__CACERTFILE=etc/certs/cacert.pem
- EMQX_LISTENER__SSL__EXTERNAL__VERIFY=verify_peer
#- EMQX_LISTENER__SSL__EXTERNAL__FAIL_IF_NO_PEER_CERT=true
- EMQX_LISTENER__SSL__EXTERNAL__REUSE_SESSIONS=on
- EMQX_LISTENER__SSL__EXTERNAL__HONOR_CIPHER_ORDER=on
- EMQX_ALLOW_ANONYMOUS=false
- EMQX_AUTH__USER__1__USERNAME=****
- EMQX_AUTH__USER__1__PASSWORD=****
#- EMQX_AUTH__USER__2__USERNAME=umdc
#- EMQX_AUTH__USER__2__PASSWORD=umdc_buddy
- EMQX_DASHBOARD__DEFAULT_USER__PASSWORD=****
ports:
- "7053:1883" # MQTT Port
- "8883:8883" # MQTT SSL Port
#- "8083:8083" # MQTT WebSocket Port
#- "8084:8084" # MQTT WebSocket SSL Port
#- "8080:8080" # HTPP Management Port
- "1884:18083" # Web Dashboard Port
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- evio_network
stop_signal: SIGKILL
networks:
evio_network:
nginx 是:
version: "2.0"
networks:
evio_network:
services:
reverse_proxy:
container_name: reverse_proxy
image: nginx
networks:
- evio_network
ports:
- 8888:8888
- 8843:8843
- 1883:1883
- 8883:8883
volumes:
- /home/evio/src/evio_nginx_reverse_proxy/config/nginxDEV.conf:/etc/nginx/nginx.conf
restart: always
我是否必须更改 mqtt 中的任何内容或我的反向代理有问题?
如评论中所述。
这里的问题是这 2 个服务是从单独的 docker-compose 文件启动的。虽然它们都绑定到具有相同名称的网络,但这些网络是分开的,因为它们以不同的编排名称为前缀。
这个问题有2个解决方案:
- 合并 2 个 docker 组合文件,这意味着它们将位于同一命名空间中,并将共享通用的命名网络。
- 创建一个“外部”网络并从两个文件中引用它。
对于第二个选项,您使用 docker network
命令创建网络,例如docker network create evio_network
然后在每个撰写文件的末尾包括以下内容:
networks:
evio_network:
external:
name: "evio_network"
我在 IP 和端口上有一个 MQTT (EMQX) 服务器 运行。我使用 nodejs MQTT 库在我的服务和该端口之间直接通信。
我想使用反向代理 (nginx) 以便能够使用 DNS 来修剪通信。
此时我的nginx是这样配置的:
events { worker_connections 1024; }
stream {
upstream websocket {
server ******:7053;
}
server {
listen 8888;
proxy_pass websocket;
}
}
http {
server {
listen 884;
server_name *******;.
error_log /var/log/errors.log;
location / {
proxy_pass *******;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
}
所以当我尝试通过端口 8888 连接时,nginx 总是超时
2020/12/03 16:23:48 [error] 22#22: *31 upstream timed out (110: Connection timed out) while connecting to upstream, client: 89.155.0.10, server: 0.0.0.0:8888, upstream: "192.16.102.26:7053", bytes from/to client:0/0, bytes from/to upstream:0/0
两种服务都在 docker 容器中。并由 docker 组合开始。
MQTT 服务的组合是:
version: "2.1"
services:
mqtt-broker:
build:
context: .
dockerfile: Dockerfile
container_name: evio_mqtt_broker
environment:
- EMQX_LISTENER__SSL__EXTERNAL=8883
- EMQX_DASHBOARD__LISTENER__HTTP=18083
- EMQX_LOADED_PLUGINS="emqx_auth_username,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard"
- EMQX_LISTENER__SSL__EXTERNAL__TLS_VERSIONS=tlsv1.2
#- EMQX_LISTENER__SSL__EXTERNAL__KEYFILE=etc/certs/key.pem
#- EMQX_LISTENER__SSL__EXTERNAL__CERTFILE=etc/certs/cert.pem
#- EMQX_LISTENER__SSL__EXTERNAL__CACERTFILE=etc/certs/cacert.pem
- EMQX_LISTENER__SSL__EXTERNAL__VERIFY=verify_peer
#- EMQX_LISTENER__SSL__EXTERNAL__FAIL_IF_NO_PEER_CERT=true
- EMQX_LISTENER__SSL__EXTERNAL__REUSE_SESSIONS=on
- EMQX_LISTENER__SSL__EXTERNAL__HONOR_CIPHER_ORDER=on
- EMQX_ALLOW_ANONYMOUS=false
- EMQX_AUTH__USER__1__USERNAME=****
- EMQX_AUTH__USER__1__PASSWORD=****
#- EMQX_AUTH__USER__2__USERNAME=umdc
#- EMQX_AUTH__USER__2__PASSWORD=umdc_buddy
- EMQX_DASHBOARD__DEFAULT_USER__PASSWORD=****
ports:
- "7053:1883" # MQTT Port
- "8883:8883" # MQTT SSL Port
#- "8083:8083" # MQTT WebSocket Port
#- "8084:8084" # MQTT WebSocket SSL Port
#- "8080:8080" # HTPP Management Port
- "1884:18083" # Web Dashboard Port
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- evio_network
stop_signal: SIGKILL
networks:
evio_network:
nginx 是:
version: "2.0"
networks:
evio_network:
services:
reverse_proxy:
container_name: reverse_proxy
image: nginx
networks:
- evio_network
ports:
- 8888:8888
- 8843:8843
- 1883:1883
- 8883:8883
volumes:
- /home/evio/src/evio_nginx_reverse_proxy/config/nginxDEV.conf:/etc/nginx/nginx.conf
restart: always
我是否必须更改 mqtt 中的任何内容或我的反向代理有问题?
如评论中所述。
这里的问题是这 2 个服务是从单独的 docker-compose 文件启动的。虽然它们都绑定到具有相同名称的网络,但这些网络是分开的,因为它们以不同的编排名称为前缀。
这个问题有2个解决方案:
- 合并 2 个 docker 组合文件,这意味着它们将位于同一命名空间中,并将共享通用的命名网络。
- 创建一个“外部”网络并从两个文件中引用它。
对于第二个选项,您使用 docker network
命令创建网络,例如docker network create evio_network
然后在每个撰写文件的末尾包括以下内容:
networks:
evio_network:
external:
name: "evio_network"