使用nginx在https上运行Haskell服务方

时间:2018-04-01 22:18:26

标签: haskell nginx https servant

我正在尝试计算如何使用nginx在https上正确运行Servant API端点。

所以要完成我所做的事情。所以我想我可能需要设置Servant,以便通过https进行通信。所以我把它添加到我的代码

  Development -> run port $ logStdoutDev $ corsWithContentType $ app cfg
  Production  -> runTLS (tlsSettings "./certs/fullchain1.pem" "./certs/privkey1.pem")
                        (setPort port defaultSettings)
                        (corsWithContentType $ app cfg)

所以这里的Production子句就是在我的生产服务器上运行的。然后我在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请求不安全。我相信,如果我在使用https的页面发出ajax请求,那么该请求是安全的。

如果我跳过所有这些并且只是在没有TLS的情况下运行Servant,那么在尝试发布时我会得到一个405 Method Not Allowed。我知道这是连接到https的,因为当我直接向IP执行请求时:api的PORT可行。这可能是什么问题?

1 个答案:

答案 0 :(得分:2)

这是因为我的" / api" nginx配置中的前缀。该请求被发送给Servant作为" / api / registrations"但应该是" /注册"。 nginx配置错误,与Servant和https无关。