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;
...
}