gpt4 book ai didi

django - Nginx 和 uwsgi 连接在放置在单独的 docker 容器中时被拒绝

转载 作者:行者123 更新时间:2023-12-02 18:55:19 27 4
gpt4 key购买 nike

我正在建立一个 Django 项目并使用 nginx 和 uwsgi 的组合来为它们服务。另外,我正在使用 Docker 将 django+uwsgi 放在一个容器中,将 nginx 放在另一个容器中。

出于测试目的,我想在本地进行设置,并且还想使用自定义域名进行测试。我真的很难设置它。

这是我的 nginx.conf

user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

include /etc/nginx/conf.d/*.conf;

#gzip on;

upstream app {
server 0.0.0.0:8000;
}

server {
listen 80;
charset utf-8;
server_name someapp.app *.someapp.app;

location / {
# checks for static file, if not found proxy to app
uwsgi_pass app;
include uwsgi_params;
#try_files $uri @proxy_to_app;
}

location /static {
alias /static;
}

location /media {
alias /media;
}

location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://someapp.app;

}
}

}

这是我的 uwsgi.ini

[uwsgi]
http-socket = 0.0.0.0:8000
chdir = /app
master = true
processes = 4
cheaper = 2
chmod-socket = 664
env = DJANGO_SETTINGS_MODULE=config.settings.local
module = config.wsgi:application
vacuum = true

我无法在我的 url 浏览器中使用 somapp.app 进行连接,或者无法连接 abc.someapp.app。我需要进行任何其他设置才能使其正常工作吗?

最佳答案

要将容器粘合在一起,您需要做一些事情。

首先,在 Docker 中创建一个用户网络。这将为容器提供一个通过名称进行通信和发现彼此的地方。

docker network create my_app

现在,当您运行这些容器时,请同时使用该网络。

docker run --network my_app <other-options>

这将做两件事。首先,它将容器放在一个可以相互通信的网络上,并且不会受到 Docker 可能正在做的任何其他事情的干扰。其次,它将允许他们使用他们的容器名称找到彼此,就好像这些名称是 DNS 主机名一样。

现在,您需要确保每个应用程序都知道如何找到另一个应用程序。在您的情况下,这主要意味着 Nginx 需要知道在哪里可以找到 uwsgi 服务器。

您的 uwsgi 服务器已经绑定(bind)到 0.0.0.0:8000 .这很好,因为它绑定(bind)到容器的外部接口(interface)(不仅仅是本地主机)。要完成这项工作,您需要确保将端口公开给 Docker。在你构建它的 Dockerfile 中,确保你有这个。

EXPOSE 8000

这将暴露 Docker 中的端口(不一定将其发布到 Internet)。

现在我们知道了 uwsgi 在哪里,并且它的端口是暴露的,你可以告诉 Nginx 在哪里找到它。您当前正在执行此操作,这将不起作用:

upstream app {
server 0.0.0.0:8000;
}

您需要修改它以改用其他容器的名称。

upstream app {
server uwsgi:8000;
}

既然要从外面连接Nginx,除了暴露端口,

EXPOSE 80

您将需要发布它。像这样的东西。

docker run --network my_app -p 80:80

或者,如果绑定(bind)的端口应该是外部主机上的 80 以外的端口,您可以使用不同的端口。

docker run --network my_app -p 8080:80

最后是您要使用自定义主机名的部分。这不太容易,因为默认情况下 Docker 不会为您处理这个问题。如果您在本地运行它,例如在笔记本电脑上,这很容易:只需使用 localhost,可能带有特定端口。

http://localhost:8080

如果您想从其他地方远程访问它,您可能需要将 IP 添加到 /etc/hosts客户端系统,或向 DNS 添加一些内容。在不知道您实际所处的环境的情况下,很难说得更多。

关于django - Nginx 和 uwsgi 连接在放置在单独的 docker 容器中时被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com