Google Cloud Platform 和 Nginx 反向代理

Google Cloud Platform 和 Nginx 反向代理

我对此非常陌生,所以如果我可能甚至没有正确理解这些术语,我深表歉意。我试图实现的是使用 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;

    ...
}

相关内容