我对docker的安装有些复杂。一切都按预期工作,除了我有这个奇怪的问题。 访问 index 页面或 / pages / _id 页面我没有错误。但是,当我尝试打开 / other-page 时,它崩溃了。所有人都使用相同的API网址。
打开 / other-page 时在控制台中发现错误:
获取http://api:1337/games网:: ERR_NAME_NOT_RESOLVED
不确定该怎么做,有什么建议吗?
nuxt.config.js
axios: {
baseURL: 'http://api:1337'
},
docker-compose.yml
version: '3'
services:
api:
build: .
image: strapi/strapi
environment:
- APP_NAME=strapi-app
- DATABASE_CLIENT=mongo
- DATABASE_HOST=db
- DATABASE_PORT=27017
- DATABASE_NAME=strapi
- DATABASE_USERNAME=
- DATABASE_PASSWORD=
- DATABASE_SSL=false
- DATABASE_AUTHENTICATION_DATABASE=strapi
- HOST=api
- NODE_ENV=production
ports:
- 1337:1337
volumes:
- ./strapi-app:/usr/src/api/strapi-app
#- /usr/src/api/strapi-app/node_modules
depends_on:
- db
restart: always
links:
- db
nuxt:
# build: ./app/
image: "registry.gitlab.com/username/package:latest"
container_name: nuxt
restart: always
ports:
- "3000:3000"
links:
- api:api
command:
"npm run start"
nginx:
image: nginx:1.14.2
expose:
- 80
container_name: nginx
restart: always
ports:
- "80:80"
volumes:
- ./nginx:/etc/nginx/conf.d
depends_on:
- nuxt
links:
- nuxt
index.vue
...
async asyncData({ store, $axios }) {
const games = await $axios.$get('/games')
store.commit('games/emptyList')
games.forEach(game => {
store.commit('games/add', {
id: game.id || game._id,
...game
})
})
return { games }
},
...
page.vue
...
async asyncData({ store, $axios }) {
const games = await $axios.$get('/games')
store.commit('games/emptyList')
games.forEach(game => {
store.commit('games/add', {
id: game.id || game._id,
...game
})
})
return { games }
},
...
Nginx conf
upstream webserver {
ip_hash;
server nuxt:3000;
}
server {
listen 80;
access_log off;
connection_pool_size 512k;
large_client_header_buffers 4 512k;
location / {
proxy_pass http://webserver;
proxy_http_version 1.1;
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-Proto $scheme;
proxy_max_temp_file_size 0;
}
更新:
尝试了Thomasleveil的建议。现在,我收到以下错误:
nuxt | [2:09:35 PM]错误:连接ECONNREFUSED 127.0.0.1:80
因此,现在看来/ api已转发到127.0.0.1:80。不确定为什么^^
nuxt.config.js
axios: {
baseURL: '/api'
},
server: {
proxyTable: {
'/api': {
target: 'http://localhost:1337',
changeOrigin: true,
pathRewrite: {
"^/api": ""
}
}
}
}
docker-compose.yml
version: '3'
services:
reverse-proxy:
image: traefik # The official Traefik docker image
command: --api --docker # Enables the web UI and tells Traefik to listen to docker
ports:
- "80:80" # The HTTP port
- "8080:8080" # The Web UI (enabled by --api)
volumes:
- /var/run/docker.sock:/var/run/docker.sock # listen to the Docker events
networks:
- mynet
api:
build: .
image: strapi/strapi
container_name: api
environment:
- APP_NAME=strapi-app
- DATABASE_CLIENT=mongo
- DATABASE_HOST=db
- DATABASE_PORT=27017
- DATABASE_NAME=strapi
- DATABASE_USERNAME=
- DATABASE_PASSWORD=
- DATABASE_SSL=false
- DATABASE_AUTHENTICATION_DATABASE=strapi
- HOST=api
- NODE_ENV=development
ports:
- 1337:1337
volumes:
- ./strapi-app:/usr/src/api/strapi-app
#- /usr/src/api/strapi-app/node_modules
depends_on:
- db
restart: always
networks:
- mynet
labels:
- "traefik.backend=api"
- "traefik.docker.network=mynet"
- "traefik.frontend.rule=Host:example.com;PathPrefixStrip:/api"
- "traefik.port=1337"
db:
image: mongo
environment:
- MONGO_INITDB_DATABASE=strapi
ports:
- 27017:27017
volumes:
- ./db:/data/db
restart: always
networks:
- mynet
nuxt:
# build: ./app/
image: "registry.gitlab.com/username/package:latest"
container_name: nuxt
restart: always
ports:
- "3000:3000"
command:
"npm run start"
networks:
- mynet
labels:
- "traefik.backend=nuxt"
- "traefik.frontend.rule=Host:example.com;PathPrefixStrip:/"
- "traefik.docker.network=web"
- "traefik.port=3000"
networks:
mynet:
external: true
答案 0 :(得分:2)
访问索引页面或/ pages / _id页面我没有错误。但是,当我尝试打开/ other-page时,它崩溃了。
重新制定:
/
有一个主页,其中显示了一些指向/pages/_id
(其中_id
是有效的游戏ID)上的页面的链接/
或/pages/_id
时,内容显示出来/
中定位到/pages/xxx
(其中xxx
是有效ID)的链接,则出现错误asyncData在nuxt.js中的工作方式如下:
http://yourserver/pages/123
asyncData
方法http://api:1337/games/123
进行不同的调用来获取内容,接收响应并呈现内容。 现在发生了一些变化。
http://api:1337/games/123
上,该页面具有指向列出所有游戏(http://yourserver/
)的主页的链接,然后单击它。http://api:1337/games
进行了ajax调用,以尝试获取新内容。由于名称解析错误而失败此功能是nuxt.js带来的功能,可以加快页面内容的加载时间。来自documentation的重要信息是:
每次加载页面组件之前,都会调用。
asyncData
。导航到其他路由时,它将一次(在对Nuxt应用程序的第一个请求时)称为服务器端,而在客户端则称为
server-side
表示从nuxt服务器到api服务器的调用client-side
表示从用户浏览器到api服务器的调用现在有趣的部分:
1337
http://api:1337/
,并且工作正常http://api:1337
失败(net::ERR_NAME_NOT_RESOLVED
),因为用户计算机不知道如何将域名api
转换为IP地址。即使可以,该IP地址也将无法访问。http://yourserver/api/
开头的URL转发到端口api
上的1337
容器。client-side
(通过用户浏览器)到api的链接使用网址http://yourserver/api
而不是http://api:1337/
http://api:1337
进行的调用server-side
。server-side
)进行的呼叫添加反向代理由于您使用的是nuxt.js Axios module来调用api容器,因此您已经到达了一半。
Axios模块具有一个proxy选项,可以在nuxtjs.config.js中将其设置为true
下面是使用Traefik为您的项目设置反向代理的示例,但是文档说明该代理与baseURL选项的使用不兼容。必须使用prefix选项。
您的nuxt.config.js应该看起来像这样:
axios: {
prefix: '/api',
proxy: true
},
proxy: {
'/api/': {
target: 'http://localhost:1337',
pathRewrite: {
'^/api/': ''
}
}
},
这在您的开发计算机上工作正常,如果trapi正在运行并且在http://localhost:1337
处响应。但这在容器中不起作用,因为我们需要将http://localhost:1337
替换为http://api:1337
。
为此,我们可以引入一个环境变量(STRAPI_URL
):
axios: {
prefix: '/api',
proxy: true
},
proxy: {
'/api/': {
target: process.env.STRAPI_URL || 'http://localhost:1337',
pathRewrite: {
'^/api/': ''
}
}
},
我们稍后将在docker-compose.yml文件中设置STRAPI_URL
。
client-side
)发出的呼叫添加反向代理由于在使用docker时我放弃了使用nginx实现反向代理,因此以下是Traefik的示例:
docker-compose.yml:
version: '3'
services:
reverseproxy: # see https://docs.traefik.io/#the-traefik-quickstart-using-docker
image: traefik
command: --docker
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
api:
image: strapi/strapi
environment:
- ...
expose:
- 1337
labels:
traefik.frontend.rule: PathPrefixStrip:/api
traefik.port: 1337
nuxt:
image: ...
expose:
- 3000
command:
"npm run start"
labels:
traefik.frontend.rule: PathPrefixStrip:/
traefik.port: 3000
现在,用户浏览器向http://yourserver
发出的所有HTTP请求将由Traefik反向代理处理。
Traefik将通过查看traefik.
和nuxt
容器上以api
开头的标签来配置转发规则。
您现在有2个反向代理:
server-side
请求(nuxt.js Proxy module)client-side
请求(Traefik)我们现在需要指示 nuxt.js代理模块,它必须将请求转发到http://api:1337/
。为此,我们将使用STRAPI_URL
环境变量。
我们需要指示 nuxt Axios模块,用户浏览器必须调用http://yourserver/api
上的api。这是通过API_URL_BROWSER环境变量完成的。
axios: {
prefix: '/api',
proxy: true
},
proxy: {
'/api/': {
target: process.env.STRAPI_URL || 'http://localhost:1337',
pathRewrite: {
'^/api/': ''
}
}
},
version: '3'
services:
reverseproxy: # see https://docs.traefik.io/#the-traefik-quickstart-using-docker
image: traefik
command: --docker
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
api:
image: strapi/strapi
environment:
- ...
expose:
- 1337
labels:
traefik.frontend.rule: PathPrefixStrip:/api
traefik.port: 1337
nuxt:
image: ...
expose:
- 3000
command:
"npm run start"
environment:
NUXT_HOST: 0.0.0.0
STRAPI_URL: http://api:1337/
API_URL_BROWSER: /api
labels:
traefik.frontend.rule: PathPrefixStrip:/
traefik.port: 3000