如何在没有命中我的gunicorn / django服务器的情况下在nginx中提供静态文件?

时间:2018-01-05 22:31:05

标签: django nginx reverse-proxy gunicorn

我已经按照parts one and two of this guide设置了nginx / gunicorn / django,它运行正常。现在,我尝试做的是包含我自己创建的静态文件,这些文件是通过构建VueJS项目创建的。我的静态文件夹现在包含一个管理文件夹(按照本指南第二部分中的步骤自动放置)和一个登录文件夹。我的文件结构如下所示:

- myproject
    - myproject
        - __pycache__
        - __init.py__
        - settings.py
        - urls.py
        - wsgi.py
    - static
        - admin
            - css
            - fonts
            - img
            - js
        - login
            - index.html
            - static
                - css
                - img
                - js
    -db.sqlite3
    - manage.py

我的nginx配置文件的最新迭代如下所示:

server {
    listen 8000;
    server_name 0.0.0.0;

    rewrite_log on;
    error_log /home/vagrant/debug.log debug;

    root /sync/genetesis/github/cardioflux-webapp/myproject;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static {
        alias /sync/genetesis/github/cardioflux-webapp/myproject/static;
        autoindex on;
    }

    location / {
        include proxy_params;
        proxy_pass http://0.0.0.0:8030;
    }
}

这些是我点击各种网址的结果: - 当我点击http://0.0.0.0:8000时,我看到了Django"恭喜!"页面与火箭飞船。 - 当我点击http://0.0.0.0:8000/admin时,我会看到管理页面,包含所有样式。 - 当我点击http://0.0.0.0:8000/login时,我会看到一个Django 404页面,其中包含:

Using the URLconf defined in myproject.urls, Django tried these URL patterns, in this order:
    1. admin/
The current path, login, didn't match any of these.

我的理解是,如果找不到与请求相关的静态文件,nginx应该只将请求传递给gunicorn / django,但似乎并非如此。它看起来像管理员请求,它仍然传递给Django,并且在登录请求中,它没有找到我的文件,因此在我的Django应用程序中尝试将其作为GET。

此时,我已经阅读了很多指南,教程等,我完全不知道该怎么做。我希望应用程序在"登录"中提供静态文件。我点击0.0.0.0:8000/login时的文件夹,意思是index.html文件和相关的css / js。我真的不需要管理部分工作,但这是我可以开始工作的全部内容。 我还没有真正了解管理员在没有index.html时的工作方式;它必须从Django获得一些东西,但这完全颠覆了我认为这样的工作方式(如果可能的话,只从nginx获取静态文件,否​​则其他请求将转到gunicorn / Django)。

任何人都可以向我解释如何实现这一目标,或者指向我解释的资源吗?如果需要更多信息,请告知我们

1 个答案:

答案 0 :(得分:0)

你误解了教程的内容。您已将nginx配置为在URL" yourwebsite.com/static /"上提供文件服务。 。所有其他路径 - 从" /"开始,即所有内容 - 将直接路由到Django,因为是您告诉nginx做的。当它说"如果用户正在访问静态文件",则表示"如果用户正在访问/ static /"下的URL。

现在,你可能可以配置nginx来查找" /"下的静态文件。首先使用attribute: function( name, val ) { if ( name == 'option' ) { this.write( '=', val ); } else if (name == 'imagealt') { this.write(' alt=', val); } } 指令。但这样做是错误的。您不希望您的登录页面是静态HTML页面。 Django应该处理整个网站。

例如,您可能希望您的登录页面看起来像您网站的其他部分,这很可能涉及通过Django从您的数据库动态生成的菜单和侧边栏等内容。此外,您还需要确保已登录的用户无法访问登录页面 - Django会处理该逻辑。如果用户输入错误的用户名/密码组合,您将希望在登录表单上显示这些错误 - 再次,这将由Django完成。