无法通过nginx暴露前端React应用和后端Fast API应用,只有一个可以工作

wwwo4jvm  于 2023-06-28  发布在  Nginx
关注(0)|答案(1)|浏览(160)

我有一个docker-compose应用程序,它有三个服务react前端部署在3000端口,fast API后端部署在8000端口,ngnix部署在80端口。我的docker-compose看起来如下:

  1. version: '3'
  2. services:
  3. app:
  4. container_name: frontend-conatiner
  5. restart: always
  6. build: ./Frontend
  7. ports:
  8. - "3000:3000"
  9. backend:
  10. container_name: backend-container
  11. restart: always
  12. build: ./Backend
  13. env_file:
  14. - ./Backend/.env.local
  15. volumes:
  16. - ./Backend/:/backend
  17. ports:
  18. - "8000:8000"
  19. command: uvicorn api.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
  20. nginx:
  21. container_name: nginx-container
  22. restart: always
  23. build: ./nginx
  24. ports:
  25. - "80:80"
  26. depends_on:
  27. - app

我的nginx配置如下:

  1. server {
  2. listen 80;
  3. server_name my_app;
  4. # Proxy settings
  5. location / {
  6. proxy_pass http://app:3000;
  7. }
  8. # Backend Proxy settings
  9. location /api/ {
  10. proxy_pass http://backend:8000;
  11. }
  12. }

现在的问题是,我能够访问我的前端在http:localhost,但我不能访问我的后端快速API,即。当我做http:localhost/api/docs时,我得到not found。当我尝试在没有nginx的情况下测试后端时。在http:localhost:8000/docs,它工作得非常好。
我也试过切换前端和后端的位置,如果我改变我的nginx配置如下,那么我可以访问后端,但不能访问前端React应用程序:

  1. server {
  2. listen 80;
  3. server_name my_app;
  4. # Proxy settings
  5. location / {
  6. proxy_pass http://backend:8000;
  7. }
  8. # Backend Proxy settings
  9. location /api/ {
  10. proxy_pass http://app:3000;
  11. }
  12. }

所以我确信我在nginx配置中做错了什么,任何帮助都将不胜感激。

9lowa7mx

9lowa7mx1#

这里的问题是,当你点击http:localhost/api/docs时,它会重定向到http:localhost:8000/api/docs。没有这样的URL,只有http:localhost:8000/docs。它会显示404 Notfound
为了解决这个问题,当url有/api时,我们必须将其重定向到后端,而不使用/api url路径。
nginx配置文件更新为

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. # Proxy settings
  5. location / {
  6. proxy_pass http://app:3000;
  7. }
  8. # Backend Proxy settings
  9. location /api/ {
  10. rewrite ^/api/(.*)$ /$1 break;
  11. proxy_pass http://backend:8000;
  12. }
  13. }

rewrite ^/api/(.*)$ /$1 break;这将捕获/api之后的所有内容并重定向到该路径

展开查看全部

相关问题