nginx、docker 和 gunicorn url 中不包含端口号

nginx、docker 和 gunicorn url 中不包含端口号

我有一个 django 应用,它也使用 gunicorn 和 nginx。我可以使用以下方式访问我的网站http://网址:8000,但我不知道如何正确配置它,所以我根本不必在url中使用端口号,即http://网址相当于http://网址:8000

这是我的docker-compose.yml:

version: '3.2'

services:
  immweb:
    restart: always
    build: .
    expose:
      - "8000"
    command: gunicorn smn_imm.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - type: volume
        source: smnvol
        target: /etc/smn_imm/smnvol
    ports:
      - "8000:8000"

  nginx:
    build: nginx
    depends_on:
      - immweb

nginx.conf:

upstream smn_imm {
    server web:8000;
}

server {

    listen 80;
    server_name smn-imm;

    location / {
        proxy_pass http://smn_imm;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        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_redirect off;
    }

}

答案1

您尚未为该nginx服务打开任何端口。听起来,当您点击时,http://url:8000您实际上是直接点击了 gunicorn 容器。

在您的 nginx 配置中,我会完全删除上游块,并在您的proxy_pass行中指定 gunicorn 端口。但是,这应该指向 gunicorn 容器的 DNS 名称(immweb如指定)。请参阅本指南了解详细信息。

server {
    listen 80;
    server_name smn-imm;
    location / {
        proxy_pass http://immweb:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        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_redirect off;
    }
}

然后您需要更新撰写文件:

version: '3.2'

services:
  immweb:
    restart: always
    build: .
    command: gunicorn smn_imm.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - type: volume
        source: smnvol
        target: /etc/smn_imm/smnvol

  nginx:
    build: nginx
    depends_on:
      - immweb
    ports:
     - "80:80"

请注意,我为 添加了外部端口映射,nginx但删除了 的portsexposeimmweb。请参阅我链接的文档中有关HOST_PORT和之间差异的部分CONTAINER_PORT

网络服务到服务通信使用 CONTAINER_PORT。定义 HOST_PORT 后,服务也可在 Swarm 外部访问。

现在,在您的浏览器中连接到http://smn-imm/,它应该可以工作。如果这不是您打算用于服务的主机名,则server_name在 nginx 配置中更新,和/或配置您的 DNS。

显然,不要将其提供给互联网,另一个反向代理应该终止 SSL,或者使用 SSL 证书配置你的 nginx 容器,并公开端口 443。

相关内容