如何避免使用Docker应用程序混合内容

时间:2018-08-22 20:41:31

标签: reactjs docker nginx django-rest-framework

我正在一组Docker容器中运行一个基于Django的Web应用程序,并且试图同时包括一个REST API(使用django-REST-framework)和使用它的ReactJS应用程序。我所有其他应用程序都通过HTTPS提供服务,但是当涉及React应用程序触及Docker网络内部的REST API时,我遇到了SELECT follower_id, poster_id, recipient_id FROM followers INNER JOIN post on followed_id = poster_id WHERE follower_id = 1 AND poster_id != recipient_id; 。 React App被托管在我的NGINX容器中,并作为一个静态站点。

以下是我的Nginx容器的相关配置:

select distinct name, fruit
from t
where exists (select 1 from t t2 where t2.name = t.name and t2.fruit <> t.fruit);

在开发过程中,React应用程序从网络外部访问了我的REST API,因此资源调用使用了https,如下所示:
Mixed Active Content 并且一切都相对进行得很顺利,除非偶尔出现CORS错误。

但是,由于React和API都在Docker网络内部运行,因此容器之间的通信不涉及NGINX,并且路由如下所示: # SSL Website server { listen 443 http2 ssl; listen [::]:443 http2 ssl; server_name *.domain.com; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_certificate /etc/nginx/ssl/my_cert.crt; ssl_certificate_key /etc/nginx/ssl/my_key.key; ssl_stapling on; ssl_stapling_verify on; access_log /home/logs/error.log; error_log /home/logs/access.log; upstream django { server web:9000; } location / { include uwsgi_params; # Proxy settings proxy_pass http://django; proxy_http_version 1.1; proxy_buffering off; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # REACT APPLICATION location /faqs { autoindex on; sendfile on; alias /usr/share/nginx/html/faqs; } }

这给了我加剧的混合有效内容错误。

我已经看到了多个与此类似的问题,但是大多数问题要么没有使用Docker容器,要么使用了一些我已经在配置文件中获得的NGINX指令。考虑到Docker在这类松散耦合应用程序中的流行,我可以想象解决方案会解决此类问题。不幸的是,我没有遇到任何问题,因此,任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

由于您的应用程序同时包含来自同一端点的API和Web客户端,因此nginx中具有“网关”,可将所有请求路由到任一端点。到目前为止,通常的做法(尽管您缺少负载均衡器,但这是一个不同的讨论)

对您的API的所有请求都应为https。您还应该使用来自同一域的相同证书通过https服务静态站点。如果不是这种情况,那就是您的问题。

此外,您的react应用程序内的所有路由和url应该是相对的。这意味着react应用程序不需要知道您的域是什么。您的API也不理想,尽管有时很难做到。

您的axios调用应该是通过同一个域通过https服务的,应该是

axios.get(/api)