Vue.js 如何使用docker compose通过nginx解除阻止我从我的js前端到我的api的请求?
背景: 因此,我正在为一个非营利组织创建一个web应用程序。这个项目始于学校,我想使用一些“新”技术 我选择创建几个服务,并通过docker compose管理它们。 我主要提供以下服务:Vue.js 如何使用docker compose通过nginx解除阻止我从我的js前端到我的api的请求?,vue.js,nginx,django-rest-framework,docker-compose,cors,Vue.js,Nginx,Django Rest Framework,Docker Compose,Cors,背景: 因此,我正在为一个非营利组织创建一个web应用程序。这个项目始于学校,我想使用一些“新”技术 我选择创建几个服务,并通过docker compose管理它们。 我主要提供以下服务: 带有django rest框架的后端api 使用vuejs的前端 使用nginx的反向代理 一切都很顺利,我的项目快结束了。所以我想在测试环境中测试我的架构。问题是我是部署方面的大傻瓜,我可能会选择错误的选项 我的想法是:这个非营利组织没有很多钱,所以我试着测试一个最便宜的解决方案:租用一台虚拟机,克隆我
- 带有django rest框架的后端api
- 使用vuejs的前端
- 使用nginx的反向代理
- 当我到达我的主页并尝试从我的nginx获取一些图像时,我立即在控制台中收到以下消息:CORS请求被阻止:CORS请求未成功
- 如果我想登录,firefox中的“网络”选项卡会显示只有一个选项是“发送”,但没有任何答案,而不是我的POST请求
version: '3.7'
services:
db:
container_name: db
image: postgres
networks:
- main
ports:
- "5432:5432"
volumes:
- pg-data:/var/lib/postgresql/data
redis:
container_name: redis
image: redis:alpine
networks:
- main
celery:
container_name: celery
build: ./backend
command: bash -c 'celery worker --app=backend.celery:app --loglevel=info'
volumes:
- ./backend:/code
depends_on:
- db
- redis
networks:
- main
nginx:
restart: always
container_name: nginx
build:
context: .
dockerfile: nginx/prod/Dockerfile
ports:
- "80:80"
depends_on:
- backend
volumes:
- ./nginx/prod/prod.conf:/etc/nginx/nginx.conf:ro
- django-static:/usr/src/app/static
- django-media:/usr/src/app/media
networks:
- main
backend:
container_name: backend
build: ./backend
command: /start_prod.sh
volumes:
- .:/code
- django-static:/backend/static
- django-media:/backend/media
ports:
- "8000:8000"
networks:
- main
depends_on:
- db
volumes:
pg-data:
django-static:
django-media:
networks:
main:
driver: bridge
这是我的nginx配置:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
client_max_body_size 100m;
upstream backend {
server backend:8000;
}
server {
listen 80;
charset utf-8;
root /dist/;
index index.html;
# frontend
location / {
try_files $uri $uri/ @rewrites;
}
location @rewrites {
rewrite ^(.+)$ /index.html last;
}
# backend urls
location ~ ^/(admin|api|auth) {
proxy_redirect off;
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
# static files
location /static {
autoindex on;
alias /usr/src/app/static;
}
# media files
location /media {
autoindex on;
alias /usr/src/app/media;
}
}
}
老实说,虽然我还没有太多经验,但我在这个项目上做了很多工作:
但我想要一些不同的东西,所以我只遵循了最初的指南,并改编了以下内容
我已经尝试过使用django cors头文件,或者在nginx conf中添加cors支持,如下所示:
- 但这并没有解决我的问题
localhost
也称为IPv4127.0.0.1
或IPv6::1
将请求发送到测试部署后端
我的猜测是否正确:我建议在开始脚本之外或在单独的配置中使用环境变量来指定环境。否则,您可以在代码中为每个请求更改主机名/IP。
无论如何,您必须在测试环境中使用主机名/IP。您的
前端是docker compose中的服务还是nginx服务中的服务。我用它来服务静态文件。确切地说,我在请求中使用localhost。在这种情况下,我应该使用私有IP还是公共IP?我将测试这两个,但我不明白为什么它不能与localhost一起工作。我的每个服务都运行在同一台服务器上,所以localhost不是引用该IP地址吗?是的,您必须使用测试环境的公共IP或主机名。你说得对,两者都在同一台服务器上。然而,前端是在客户端执行的,这意味着如果我访问您的web应用程序,它正在运行,并试图向localhost no my machine发送请求,而不是向您的测试环境发送请求。现在能用了吗?天啊,这太明显了。。。我知道js是客户端的,但我完全忘记了它,并假设它是在服务器端执行的。。。好的,谢谢你!真不敢相信我在这个愚蠢的错误上坚持了这么久哈哈!因此,实际上,我使用了.env文件来更改url,它成功了!伟大的你能记下我的答案吗:)太棒了。