无法得到我的前端容器与我的后端容器与nginx通信

wfveoks0  于 2022-12-11  发布在  Nginx
关注(0)|答案(1)|浏览(188)

我已经这样做了很多次,但由于某种原因,我不能让我的容器沟通。
即使当我试图从前端 curl ,我也无法连接!
例如:

/etc/nginx # curl http://localhost:8081/v1/test
curl: (7) Failed to connect to localhost port 8081 after 0 ms: Connection refused
/etc/nginx #

bb36725aa567   vue-golang-grpc-base-client     "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes    80/tcp, 0.0.0.0:80->8080/tcp       vue-golang-grpc-base-client-1
8d9fa96e0e67   vue-golang-grpc-base-api        "./main"                 15 minutes ago   Up 15 minutes   0.0.0.0:8081-8082->8081-8082/tcp   vue-golang-grpc-base-api-1

我的nginx文件看起来像

upstream api {
    server ${API_HOST}:8081;
 }

 server {
     server_name localhost example.com www.example.com;
     listen 8080;

     root /usr/share/nginx/html;

     access_log /var/log/nginx/access.log;
     error_log /var/log/nginx/error.log;

     location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf)$ {
         expires 1y;
         add_header Cache-Control "public";
         access_log off;
     }

     location / {
        try_files $uri /index.html;
     }

     location ~ ^/(api)/ {
         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_set_header Host $http_host;
         proxy_set_header X-NginX-Proxy true;

         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection $connection_upgrade;

         proxy_redirect off;
         proxy_pass http://api;

         add_header Cache-Control "no-store, no-cache, must-revalidate";
         expires off;
     }

 }

我正在使用Vue.js 3与typescript和创建一个自定义的url处理程序,因为我没有使用webpack。

export class EnvironmentHelper {
    public static get isDevelopment(): boolean {
        return process.env.NODE_ENV === "development";
    }

    public static get isProduction(): boolean {
        return process.env.NODE_ENV === "production";
    }

    public get baseUrl(): string {
        if (EnvironmentHelper.isDevelopment) {
            return "http://localhost:8081"
        }
        if (EnvironmentHelper.isProduction) {
            return "http://localhost:8080/"
        }
        
        return "/";
    }
}

那么我有一个.env文件

NODE_ENV=development
API_HOST=localhost

我使用axios
第一个
然后我用docker compose构建图像

version: '3.0'
services:
    api:
        build:
            context: ./api
        ports:
            - "8082:8082" # gRPC
            - "8081:8081" # gRPC Gateway
        networks:
            - personal
    client:
        build:
            context: ./client
        environment:
            - API_HOST=api
            - NODE_ENV=production
        env_file:
            -   client/.env.local
        networks:
            - personal
        ports:
            - "80:8080"
networks:
    personal:

我有两个.env文件

.env
.env.production

而且两者是相同的

NODE_ENV=production
API_HOST=api

如有任何建议,我们将不胜感激...

  • ----更新-----
    最后,我尝试了许多被接受的答案建议,但问题是路由。我把它设置为api,而不是v1,即/v1/test
    不过,我希望这篇文章能帮助其他人正确配置。魔鬼在细节@masseyb
zfciruhq

zfciruhq1#

client服务中的localhost是容器localhost,而不是Map端口的PC的localhost
nginx正在尝试将连接传递到upstream { server localhost:8081; }(给定API_HOST环境变量),client服务中没有侦听端口8081的内容,因此“连接被拒绝”。
您可以将您的API_HOST更新为api,例如upstream { server api:8081; }api将被解析为容器IP,并且连接将被传递到<container_ip>:8081而不是localhost:8081(首选),或者您可以在host网络上运行client服务并继续使用localhost

相关问题