Запуск слуги 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.

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