Запуск слуги Haskell через https с помощью nginx
Я пытаюсь понять, как правильно запустить конечную точку API Servant через https с помощью nginx.
Итак, чтобы пройти через то, что я сделал. Поэтому я подумал, что мне, вероятно, потребуется настроить Servant, чтобы он мог обмениваться данными через https. Поэтому я добавил это в свой код
Development -> run port $ logStdoutDev $ corsWithContentType $ app cfg
Production -> runTLS (tlsSettings "./certs/fullchain1.pem" "./certs/privkey1.pem")
(setPort port defaultSettings)
(corsWithContentType $ app cfg)
Таким образом, пункт "Производство" работает на моем производственном сервере. Тогда у меня есть это в nginx
upstream api_server {
server 127.0.0.1:8081;
}
location /api {
proxy_set_header Host $host;
proxy_pass http://api_server;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/xxx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/xxx/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
С этой настройкой я выполняю ajax-запрос со страницы (который правильно работает через https). Однако, когда я делаю это, я получаю ответ от сервера Servant
InsecureConnectionDenied
Как будто мой запрос ajax небезопасен. Я был уверен, что если я делаю запрос ajax на странице с https, этот запрос является безопасным.
Если я пропущу все это и просто запущу Servant без TLS, я получу метод 405 Not Allowed при попытке опубликовать сообщение. Я знаю, что это связано с https, потому что, когда я выполняю запрос прямо к IP:PORT API, он работает. В чем может быть проблема здесь?
1 ответ
Это из-за моего префикса "/api" в конфиге nginx. Запрос был отправлен серванту как "/api/registrations", но должен был быть "/registration". Неправильная настройка в nginx, ничего общего с Servant и https.