-1

我正在运行一个在端口 4242 上运行的 NodeJS 应用程序,这是 dokefile、docker-compose 和 nginx conf 看起来像这样

Dockerfile

FROM node:12-alpine
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
EXPOSE 4242
CMD node index.js.

码头工人撰写

services:
   web:
      build: .
   ports:
      - "80:4242"
   environment:
   DATABASE_URL: <DB_URL>
   depends_on:
      - db
command: >
    npm run start"

NGINX

server {
listen 80;
server_name server_name;

location / {
        try_files $uri $uri/ =404;
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://localhost:80;
}
}

我想让这个应用程序通过 Nginx 的端口 80 以及端口 80 上的基本身份验证访问,但我无法正确映射端口。

编辑:我总是得到端口已经在使用错误,因为 Nginx 默认情况下正在侦听端口 80,而在 docker-compose 中,我将 80 与 Dockerfile 暴露的 4242 映射

提前致谢

4

1 回答 1

1

您不能在端口 80 上同时拥有 nginx 和 docker 容器。

他们必须监听不同的端口以避免“端口已在使用错误”。

您可以将容器端口 4242 映射到主机端口 4242 :在 docker-compose 文件中替换- "80:4242"为。- "4242:4242"

重启你的容器docker-compose restart web,你可以检查你的容器是否正在运行docker-compose ps(你会同时看到映射的端口)

然后,您必须相应地更改 nginx conf:

server {
  listen         80;
  server_name    your_server_name;

  location / {
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://localhost:4242;
  }
}

备注:

  • 我删除try_files了它,因为它绕过了proxy_pass指令。如果您尝试使用try_files.
  • 替换your_server_name为您的真实服务器名称。
  • 重新加载 nginx

最后你有:

  1. nginx(直接在主机上)监听端口 80,
  2. location使用基本身份验证阻止,
  3. 将流量转发到主机端口 4242,
  4. 映射到 docker 容器端口 4242 proxy_pass
  5. 最后点击你的 NodeJS 应用程序。
于 2021-03-01T15:31:46.427 回答