Я новичок в этом, поэтому прошу прощения, если я даже не понял условия. Я пытаюсь создать обратный прокси-сервер с 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.
Спасибо за любую помощь, которую вы можете мне оказать, или за то, какие термины мне следует исследовать / искать.
Джастин
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;
...
}