当前位置: 首页 > 知识库问答 >
问题:

Nginx不针对api的好端口

家弘业
2023-03-14

我试图使用nginx对一个经典的NodeJS(Express,TS)+Angular应用程序进行Dockerize,但我很难通过nginx正确绑定我的api。

事实上,nginx的目标似乎是我的本地主机:80...

...而我希望它以我的localhost:3000为目标。当我在localhost之后添加:3000时手动ping该url,它就可以工作了。

FROM node:15.14-alpine AS build

RUN mkdir -p /build/tmp
WORKDIR /build/tmp

COPY . .
RUN npm ci

CMD ["npm", "run", "start"]
### STAGE 1: Build ###
FROM node:15.14-alpine AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

### STAGE 2: Run ###
FROM nginx:1.17.1-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist/front /usr/share/nginx/html
version: '3.4'

services:
  mymusicads-front:
    container_name: mymusicads-front
    build:
      context: ./front
      dockerfile: Dockerfile
    ports:
      - 80:80
    restart: on-failure
    depends_on:
      - mymusicads-api
    networks:
      - front-back

  mymusicads-api:
    container_name: mymusicads-api
    build:
      context: ./api
      dockerfile: Dockerfile
    ports:
      - 3000:3000
    networks:
      - front-back

networks:
  front-back:
    driver: bridge
events{}

http {
    include /etc/nginx/mime.types;

    upstream api {
      server 127.0.0.1:3000;
    }

    server {
      listen 80;
      server_name front;
      root /usr/share/nginx/html;
      index index.html;
      location / {
          try_files $uri $uri/ /index.html;
      }
    }

    server {
      listen 80;
      server_name api;

      location /api/ {
          proxy_pass http://localhost:3000/;
          proxy_redirect off;
      }
    }
}

共有1个答案

沈德寿
2023-03-14

当您在配置中使用多个server块时,nginx将根据HTTPhost标头值选择处理请求的服务器块。如果它与任何指定的服务器名称都不匹配(或者根本不存在host标头),则将使用默认的服务器块。可以使用Listen指令的default_server标志显式指定默认服务器块。如果不显式指定,将使用侦听特定端口的第一个服务器块。有关更多细节,请参见nginx如何处理请求官方文档页面或本答案。

请尝试此配置:

events {}

http {
    include /etc/nginx/mime.types;
    server {
        listen 80;
        root /usr/share/nginx/html;
        index index.html;
        location / {
            try_files $uri $uri/ /index.html;
        }
        location /api/ {
            proxy_pass http://mymusicads-api:3000/;
            proxy_redirect off;
        }
    }
}

您不需要向外部世界公开Node.js端口3000,只有mymusicads-front容器才可以访问该端口。根据docker-compose端口与expose SO thread之间的区别,您的dockercompose.yml文件应该类似于

version: '3.4'

services:
  mymusicads-front:
    container_name: mymusicads-front
    build:
      context: ./front
      dockerfile: Dockerfile
    ports:
      - 80:80
    restart: on-failure
    depends_on:
      - mymusicads-api
    networks:
      - front-back

  mymusicads-api:
    container_name: mymusicads-api
    build:
      context: ./api
      dockerfile: Dockerfile
    expose:
      - 3000
    networks:
      - front-back

networks:
  front-back:
    driver: bridge
 类似资料:
  • 问题内容: 因此,我查看了有关该主题的所有教程,但没有任何效果。我在Windows 10专业版上有一个JENKINS实例,在Nginx上有一个centos。我想将NGINX用作Jenkins的反向代理,以具有https并使其可从Internet访问。我当前的配置是: (我替换了真实的URL和IP。)但这给了我502错误的网关。出现以下错误:连接到上游时,connect()到192.XXX:8080

  • 因为某些需求,需要把前后端部署在同一个端口,配置nginx反向代理,如下 在运行时已经将80端口映射到8848,并且能正确访问前端的页面。我预期是访问http://localhost:8848/zssrapi/xxx时能转到后端实际端口http://localhost:8123/zssrapi/xxx。但是尝试之后报错404,如图, 求助解决办法qaq

  • 这让我快疯了。 我有一个简单的Python脚本,可以使用Google mail API对我的个人GMail进行邮件管理。 我似乎能让它工作的唯一方法是让它保持“测试”状态,并每七天刷新一次令牌。 在应用编程接口管理页面上,我试图让它成为内部的,但我得到了这个工具提示:“因为你不是谷歌工作区用户......” 除了我是谷歌工作空间的用户。我每月有8美元的谷歌工作空间个人订阅。 当然,人们也在做我正在

  • 在我的 Spring Boot 应用程序中,我需要两种类型的身份验证机制。对于文件上传终结点,它需要基于 api 密钥的身份验证,对于其他终结点,它需要基于用户名密码的身份验证。以前,只有基于用户名密码的身份验证,如下所示。 为了支持下面的基于api密钥的身份验证,我修改了这段代码。通过以下线程并相应地实现。使用API密钥和密码保护Spring Boot API Spring Security:多

  • 更新:不推荐使用GCM,请使用FCM 我正在按照Google Developers页面中的指南实现新的Google云消息 我已经成功地运行并测试了它。但我现在的问题是,我有不同的产品风格,有不同的applicationID/packageName和不同的Google Cloud Messaging Project ID。必须放在而不是flavors文件夹中。 有什么方法可以使配置针对多种口味不同吗

  • 问题内容: 我编写了JAX-RS的附加内容,并将Java EE 6 API包含为Maven依赖项。 然后我有一个测试用例: 但我得到一个错误: 如果我将Jersey作为JAX-RS实现而不是Java EE API包含在内,那么一切都很好。 感谢BalusC的提示,我知道了我的猜测:Java EE 6只是一个没有方法主体的API: 来自java.net博客 您可以使用此jar编译代码,但是当然不能使