【问题标题】:404 on Nginx running on docker (uwsgi)在 docker (uwsgi) 上运行的 Nginx 上的 404
【发布时间】:2015-07-17 08:29:07
【问题描述】:

我一直在与这个作斗争,无法理解它。

我有一个可以运行的简单 Dockerfile,我使用 supervisord 作为 CMD 来启动 nginx 和 uwsgi。它完成了这项工作,但我得到了 404。所以我要做的是使用/bin/bash 启动 docker 并手动启动和调试,例如:

sudo docker run -t -i -p 8095:80  myimage /bin/bash

这是我的 nginx 配置文件(在站点可用,然后是站点启用的链接):

server {
    listen 80;
    server_name 0.0.0.0;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/WikiRockWord2Vec/WikiRockWord2Vec.sock;
    }
}

这是我的 uwsgi ini:

[uwsgi]
module = wsgi

master = true
processes = 5


socket = /WikiRockWord2Vec/WikiRockWord2Vec.sock
chmod-socket = 777
vacuum = true
uid = www-data

die-on-term = true

确实创建了套接字,并且我已将权限更改为 777 以确保所有 nginx 都可以访问。但似乎 nginx 无论如何都不会发送到上游。

浏览到 localhost:8095 会找到 nginx 主页,但任何其他路由都返回 404。Nginx 错误日志为空

我已经确认 nginx 读取了 .conf(通过添加拼写错误并在 nginx 日志中查看错误)但是更改套接字位置没有影响,好像它甚至不关心关于那部分。 在我的 ubuntu 盒子上类似的情况下,当 sock 文件不存在或存在权限问题时,我会在日志中得到 502 和一些提示。 但是在这里我什么也没得到,好像 UWSGI 没有针对 NGINX 进行配置。

我迷路了,你能帮忙吗?我是否缺少 nginx 中的模块配置(类似于 apache)?我是 nginx 新手。

【问题讨论】:

    标签: nginx flask docker uwsgi


    【解决方案1】:

    404 可能是因为您的nginx conf 文件的server 块不正确,我认为是因为您的server_name 部分。

    所以这是我的修改版本,你可以检查它是否有效

    server {
        listen 80 default_server;
    
        location / {
            uwsgi_pass unix:///WikiRockWord2Vec/WikiRockWord2Vec.sock;
            include uwsgi_params;
        }
    }
    

    【讨论】:

    • 谢谢!我不得不删除默认的 conf,因为它有冲突,但与此相比这很容易
    【解决方案2】:

    配置 Nginx、uWSGI、Supervisord 等(并且仅用于 Flask 应用程序)可能很困难,因此我制作了一个公共(和开源)Docker 映像,其中包含可用于构建 Python 的所有花里胡哨的功能Flask 网络应用程序。

    它有用于运行应用程序的 uWSGI、用于服务 HTTP 的 Nginx 和用于控制它们的 Supervisord,因此您无需学习如何安装和配置所有这些来构建您的 Python Flask Web 应用程序。

    似乎带有 Nginx 的 uWSGI 是部署 Python Web 应用程序的更健壮(并且性能出色)的方法之一。以下是基准测试:http://nichol.as/benchmark-of-python-web-servers

    您甚至可以使用一些模板项目来引导您自己的项目。而且,您不必克隆完整的项目或其他东西,您可以将其用作基础映像。

    Docker 集线器:https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/

    GitHub:https://github.com/tiangolo/uwsgi-nginx-flask-docker

    【讨论】:

    • 不应该是 1 个 docker 1 服务?,在你的情况下,你有 1 个 docker 和几个正在运行的服务
    • @EsseTi 经验法则是您应该“每个容器一个进程”。例如,这有助于将应用程序及其数据库隔离在不同的容器中。但是如果你想要一种“微服务”方法,如果它们都与同一个“服务”相关,你可能希望在一个容器中拥有多个进程,并且你可能希望包含你的 Flask 代码、uWSGI 和 Nginx在同一个容器中(并且可能使用您的数据库运行另一个容器)。检查这个:valdhaus.co/writings/docker-misconceptions
    猜你喜欢
    • 2015-12-16
    • 2013-09-20
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2016-04-11
    • 2021-09-26
    相关资源
    最近更新 更多