我对此非常陌生,所以如果我可能甚至没有正确理解这些术语,我深表歉意。我试图实现的是使用 Nginx 的反向代理,我监听 https(端口 443)和 MQTT(端口 8883)并将它们传递到各自的后端服务器。我正在学习本教程:
https://www.nginx.com/blog/nginx-and-iot-adding-protocol-awareness-for-mqtt/
我能够让 MQTT 在我的 aws 后端正常工作。但是我在将 https 请求发送到 google cloud platform 时遇到了问题。这是我的 nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
stream {
upstream gcp_backend {
server mysite.appspot.com:443;
}
server {
listen 443;
#proxy_pass gcp_backend;
proxy_pass mysite.appspot.com:443;
}
upstream mqtt_backend {
server mysite.iot.us-west-1.amazonaws.com:8883;
}
server {
listen 8883; # (tcp)
proxy_pass mqtt_backend;
}
}
我运行 nginx -v 并得到“nginx/1.10.3”。我在 raspberry pi 上运行它,我有一个通过 dyndns.org 获得的域名。当我转到https://somewhere.dyndns.org/api-name-here我收到 404 错误。我一度认为这可能是因为防火墙阻止了 Google Cloud 上的传入请求,但我不确定。我也尝试过在 Google Cloud 上使用自定义域,但后来我认为这些不是我想要的。我想通过 raspberry pi 上的 Nginx 并将其 proxy_pass 传递到 Google Cloud 后端。
如上所述,MQTT 已通过端口 8883 为我工作,但 AWS 可能出于某种原因没有拒绝。我认为 Google Cloud 给出错误是因为我的 dyndns.org 不是允许的域名之一,例如 appspot.com。
谢谢您能提供给我的任何帮助,或者感谢我应研究/搜索哪些术语。
贾斯汀
答案1
MQTT 需要流协议,因此您需要分离 HTTPS 和流配置。类似这样的操作应该可以做到:
stream {
upstream mqtt_backend {
server mysite.iot.us-west-1.amazonaws.com:8883;
}
server {
listen 8883; # (tcp)
location / {
proxy_pass mqtt_backend;
}
}
}
http {
upstream gcp_backend {
server mysite.appspot.com:443;
}
server {
listen 443;
#proxy_pass gcp_backend;
location / {
proxy_pass mysite.appspot.com:443;
}
}
}
此外,要通过 SSL 进行监听,您需要启用 SSL 并安装证书,否则您将收到协议错误。您至少需要:
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
...
}
可能还有:
server {
listen 8883 ssl; # (tcp)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
...
}