我有两个 docker 容器
frontend
和 api
api
提供 Restful API,frontend
是 Next.JS 应用程序
我需要一个适用于SSR和CSR的统一URL,当我将
uri
设置为apollo客户端时,我无法使用https://api/graphql
,因为CSR会中断,我也无法使用https://localhost:{PORT}/graphql
,因为SSR会中断。
如果我想有条件地设置端点那就太麻烦了。
修复它的标准和通用方法是什么(忽略阿波罗客户端,我需要一个适用于任何其他用例的解决方案)?
这不会对您当前的设置进行一对一的修复,但希望这能让您朝着正确的方向迈出一步
根据我的评论,我有一个类似的结构,它使用本地运行的 Traefik 实例,使用漂亮的 URL 将所有本地流量路由到底层服务容器。
我的 Traefik 版本有点过时,所以里程可能会有所不同。但要按照我的方式进行设置,请运行以下两个命令(需要打开端口 80、443 和 8080):
docker network create -d bridge traefik-network
docker run -d -p 80:80 -p 443:443 -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name=traefik \
--restart unless-stopped \
--network=traefik-network \
-l traefik.enable=false \
traefik:2.4 \
--providers.docker=true \
--api.insecure=true \
--entrypoints.web.address=:80 \
--entrypoints.websecure.address=:443
以下是我在项目中使用的一些基准配置。我省略了许多可能与您无关的配置,因此请忽略
extends
指令,因为这些指令可能对您的设置没有帮助,但可以视为占位符,供您填写自己的配置详情:
docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:1.23-alpine
restart: unless-stopped
ports:
- "80"
environment:
FPM_HOST: ${COMPOSE_PROJECT_NAME}_php
NEXT_HOST: ${COMPOSE_PROJECT_NAME}_node
NGINX_SERVER_NAME: ${NGINX_SERVER_NAME}
NGINX_ROOT: ${NGINX_ROOT}
volumes:
- ../api:/var/www/html
- ../logs:/var/log/nginx
- ./nginx:/etc/nginx/templates
networks:
default:
aliases:
- ${COMPOSE_PROJECT_NAME}_nginx
- ${NGINX_SERVER_NAME}
labels:
- "traefik.enable=true"
- "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${NGINX_SERVER_NAME}`)"
- "traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=web"
depends_on:
- backend
- frontend
backend:
extends:
file: ./docker/services-common.yml
service: php
labels:
- "traefik.enable=false"
depends_on:
- postgres
frontend:
extends:
file: ./docker/services-common.yml
service: node
restart: unless-stopped
labels:
- "traefik.enable=false"
command: [ "yarn", "run", "dev" ]
depends_on:
- backend
postgres:
extends:
file: ./docker/services-common.yml
service: postgres
labels:
- "traefik.enable=false"
volumes:
postgres:
networks:
default:
name: traefik-network
external: true
nginx/default.conf.template
upstream frontend {
server ${NEXT_HOST}:3000;
}
server {
listen 80 default_server;
server_name ${NGINX_SERVER_NAME};
root ${NGINX_ROOT};
index index.php;
location / {
proxy_pass http://frontend;
}
location /api {
alias ${NGINX_ROOT}/public/;
try_files $uri /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_intercept_errors on;
fastcgi_pass ${FPM_HOST}:9000;
fastcgi_param SCRIPT_FILENAME $document_root/public/$fastcgi_script_name;
fastcgi_param NGINX_SERVER_NAME http://${NGINX_SERVER_NAME};
}
}
.env
# Project
COMPOSE_PROJECT_NAME=my-project
PHP_VERSION=8.1
# NGINX
NGINX_PORT=80
NGINX_SERVER_NAME=project.docker.localhost
NGINX_ROOT=/var/www/html
# Node JS
DEV_PORT=3000
# .... Project specific settings
这样本地就可以访问API了:
http://project.docker.localhost/api
前端位于: