問題
我有三個 Docker 容器:一個后端、一個前端和一個處理請求的 nginx 容器。當我在我的計算機(帶有 docker 引擎的 Windows 筆記本電腦)上運行它時,一切正常。我可以看到呼叫是在容器的日志中進行的:
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:00 0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:00 0000] "GET /static/js/bundle.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:00 0000] "GET /static/js/vendors~main.chunk.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:00 0000] "GET /static/js/main.chunk.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:01 0000] "GET /favicon.ico HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:01 0000] "GET /manifest.json HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:01 0000] "GET /logo192.png HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
reverse_proxy_1 | 172.19.0.1 - - [10/Oct/2021:21:15:02 0000] "GET /api/versions/ HTTP/1.1" 200 55 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
backend_1 | Sending versions
當我將其部署192.168.31.103在網路上的專用 ubuntu 服務器 ( ) 或計算機上 VirtualBox 中的 VM 上時,前端和后端似乎不再通信。我可以看到前端,但是如果我做和之前一樣的操作,后端是不查詢的:
192.168.31.101 - - [10/Oct/2021:21:29:39 0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:29:39 0000] "GET /sockjs-node HTTP/1.1" 101 2801 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:29:39 0000] "GET /static/js/bundle.js HTTP/1.1" 304 0 "http://192.168.31.103/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:29:39 0000] "GET /static/js/vendors~main.chunk.js HTTP/1.1" 304 0 "http://192.168.31.103/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:29:39 0000] "GET /static/js/main.chunk.js HTTP/1.1" 304 0 "http://192.168.31.103/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:29:41 0000] "GET /favicon.ico HTTP/1.1" 200 2114 "http://192.168.31.103/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
我可以在我的瀏覽器中直接轉到后端:http://192.168.31.103/api/versions/這很好用,回傳 json 物件,nginx 顯示相應的日志。
192.168.31.101 - - [10/Oct/2021:21:39:25 0000] "GET /api/versions/ HTTP/1.1" 200 55 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
192.168.31.101 - - [10/Oct/2021:21:39:25 0000] "GET /favicon.ico HTTP/1.1" 200 2114 "http://192.168.31.103/api/versions/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
(請注意,這192.168.31.101是我的筆記本電腦在網路上的 IP)。
你能發現錯誤嗎?
配置
我有一個Django的REST后端服務于一些看法,一切背后的/api/前綴,例子:http:localhost/api/version。我暫時洗掉了所有 CSRF 保護。
設定.py
ALLOWED_HOSTS = [
localhost,
127.0.0.1,
192.168.31.103,
]
我有一個 React 前端可以獲取這個后端:
應用程式.js
[...]
const backendURL = 'http://localhost';
const getBackendVersion = () => {
setFetchingVersions(true);
fetch(`${backendURL}/api/versions/`)
.then( response => response.json())
.then( d => {
setAppVersions({
'frontend': frontendVersion,
'backend': d['versions']['maapi'],
})
})
.catch( () => setFetchingVersions(false));
};
[...]
我使用Docker部署它。
docker-compose.yml
version: '3.8'
services:
backend:
build: ./ma-backend
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
expose:
- 8000
env_file:
- ./.env.prod
frontend:
build: ./ma-frontend
command: npm start
expose:
- 3000
depends_on:
- backend
env_file:
- ./.env.prod
reverse_proxy:
build: ./nginx
ports:
- 80:80
depends_on:
- backend
- frontend
nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
}
http {
upstream backend {
server backend:8000;
}
upstream frontend {
server frontend:3000;
}
server {
listen 80;
server_name localhost 127.0.0.1;
location /api {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_redirect default;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location /admin {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_redirect default;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location / {
proxy_pass http://frontend;
proxy_http_version 1.1;
proxy_redirect default;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
uj5u.com熱心網友回復:
看起來backendURL = 'http://localhost';可能是這里的罪魁禍首?例如,您的前端配置為查詢后端,http://localhost即使它部署在不同的 IP/服務器上。
您是否可以在 React 構建程序中使用環境變數或類似的東西來提供后端的實際 URL?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/315303.html
