nginx + django提供静态文件

Modified on: Fri, 09 Aug 2019 05:20:02 +0800

我已经按照django wiki(https:// code)设置django与dginx的说明。 djangoproject.com/wiki/DjangoAndNginx)并按如下方式设置nginx(一些名称更改以适合我的设置)。

    user  nginx nginx;

worker_processes  2;

error_log /var/log/nginx/error_log info;

events {
    worker_connections  1024;
    use epoll;
}

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

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

    client_header_timeout   10m;
    client_body_timeout 10m;
    send_timeout        10m;

    connection_pool_size        256;
    client_header_buffer_size   1k;
    large_client_header_buffers 4 2k;
    request_pool_size       4k;

    gzip on;
    gzip_min_length 1100;
    gzip_buffers    4 8k;
    gzip_types  text/plain;

    output_buffers  1 32k;
    postpone_output 1460;

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;

    keepalive_timeout   75 20;

    ignore_invalid_headers  on;
    index index.html;

    server {
        listen 80;
        server_name localhost;
        location /static/  {
            root /srv/static/; 
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov) {
            access_log   off;
            expires      30d; 
        }
        location / {
            # host and port to fastcgi server
            fastcgi_pass 127.0.0.1:8080;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
            fastcgi_param REMOTE_ADDR $remote_addr;
            }
        access_log  /var/log/nginx/localhost.access_log main;
        error_log   /var/log/nginx/localhost.error_log;
    }
}

未提供静态文件(nginx 404)。如果我查看访问日志,似乎nginx正在查找/ etc / nginx / html / static ...而不是/ srv / static /如配置中所指定的那样。

我不知道为什么会这样做,任何帮助都会非常感激。

作者:avalore

最佳答案

简短回答:查看长版本中的最后一个位置。从技术上讲,该页面中描述的设置是错误的。请参阅答案的结尾。

答案很长:您的日志中可能包含/etc/nginx...路径,因为静态文件请求与您的静态位置(正则表达式位置)不匹配你没有指定root

当您的请求与正则表达式位置匹配时,nginx将搜索/etc/nginx下的文件。要解决此问题,您可能需要在root块中直接添加server指令,如上所述,或者在每个非代理位置下(同样也适用于fastCGI)。 / p>

还发现:如果您在位置nginx下指定root指令,则会在$document_root/$location下搜索文件,例如在/srv/static/static中,99%不是你想要的。您可以使用alias指令,但nginx文档如果可能,请更喜欢重新定义root指令:

location /static {
    root /srv;
}

alias指令的工作方式与您的预期相同,因此您可能需要编写此代码:

location /static {
    alias /srv/static;
}

关于正则表达式位置,您可能希望将其放在/static位置。此外,因为只有静态文件,你可以摆脱其他的正则表达式位置,最终位置将如下所示:

location /static {
    root /srv;
    access_log   off;
    expires      30d;
}

为什么描述的设置错误以及如何解决此问题

根据用户提供的命令,他喜欢让大多数组件尽可能地在类似Debian的Linux上运行。但是,不是手动正确安装所有东西,也不是仅使用aptitude,而是开始混合并安装软件包。这适用于某些开发盒,但对于任何生产来说都是不行的。所以这里有一些观点:

  1. 请以一种方式安装软件,最好是从软件包中安装。如果你需要前沿,为它们构建包(这不是那么难;))或使用一些环境将它与系统分开,如virtualenv
  2. 您无需手动添加nginx用户和组。 Web服务器从Debian中的www-data:www-data运行。由于您的设置不打算在Web服务器上下文中运行任何代码,因此添加更多用户是没用的。
  3. 本文建议重新定义整个/etc/nginx/nginx.conf文件,这是完全错误的,尤其是在类似Debian的系统上。您可能希望在sample_project中创建/etc/nginx/sites-available文件,并将其链接到/etc/nginx/sites-enabled
  4. 本例中的sample_project文件应仅包含server块本身,仅此而已。
  5. 大多数指令(log_format除外)可能都有虚拟主机的上下文,因此应放在server块下/ code>文件。您不会影响在此Web服务器上运行的其他服务的工作。您可以将sample_project指令放在您的文件中,但不在任何块之外,并且在log_format块本身之前。
  6. 不应编写所有server指令,而应编写fastcgi_pass,只重新定义那些不正确的当前设置。
  7. 要通过logrotate自动轮换日志文件,您应将其命名为匹配include fastcgi_params*access.log通配符。
  8. 醇>

    为此提供最小工作主机配置文件*error.log可能如下所示:

    # cd /etc/nginx/sites-enabled && ln -s ../sites-available/sample_project sample_project
作者:,jollyroger

相关问答

添加新评论