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. Вот мой 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, но потом подумал, что это не то, что мне нужно. Я хочу пройти через Nginx на Raspberry Pi и передать его 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;

    ...
}
Другие вопросы по тегам