web-dev-qa-db-ja.com

nginx + Djangoサービス静的ファイル

DjangoをnginxでDjango wikiから設定するための指示に従いました( https://code.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は/ srv/static /ではなく/ etc/nginx/html/static ...を探しているようです。

なぜこれが行われているのか、私には手がかりがありません。どんな助けでも大歓迎です。

6
avalore

短い答え:長いバージョンの最後の場所を参照してください。技術的には、そのページで説明されている設定は間違っています。理由については、回答の最後を参照してください。

長い回答:静的ファイルのリクエストが静的な場所(正規表現の場所-と一致しないため、ログに/etc/nginx...パスが含まれている可能性があります 優先rootブロック自体にserverを指定していません。

リクエストが正規表現の場所と一致すると、nginxは/etc/nginxでファイルを検索します。これを修正するには、上記のようにrootブロック内に直接serverディレクティブを追加するか、プロキシされていない各場所の下に追加します(fastCGIにも同じことが言えます)。

また発見:場所の下でrootディレクティブを指定すると、nginxは$document_root/$locationの下でファイルを検索します。 /srv/static/staticでは、99%は望んでいないかもしれません。 aliasディレクティブを使用することもできますが、 nginx documentation は、可能であれば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. ソフトウェアを一方向、できればパッケージからインストールしてください。最先端のEdgeが必要な場合は、それらのパッケージをビルドするか(それほど難しくありません;))、またはvirtualenvのようなシステムから環境を分離するために環境を使用します。
  2. Nginxユーザーとグループを手動で追加する必要はありません。 WebサーバーはDebianのwww-data:www-dataから実行されます。セットアップはWebサーバーコンテキスト内でコードを実行することを意図していないため、ユーザーを追加しても意味がありません。
  3. この記事は、特にDebianのようなシステムでは、完全に間違っている/etc/nginx/nginx.confファイル全体を再定義することを提案しています。これを行う代わりに、sample_project/etc/nginx/sites-availableファイルを作成して/etc/nginx/sites-enabledにリンクし、nginxに構成をアタッチさせる `:
    # cd /etc/nginx/sites-enabled && ln -s ../sites-available/sample_project sample_project
  4. この場合のsample_projectファイルには、serverブロック自体のみを含める必要があります。
  5. ほとんどのディレクティブ(log_formatおよびおそらく他のいくつかを除く)は仮想ホストのコンテキストを持つ必要があるため、sample_projectファイルのserverブロックの下に配置する必要があります。このWebサーバーで実行されている他のサービスの作業には影響しません。 log_formatディレクティブをファイル内に配置できますが、ブロックの外側で、serverブロック自体の前に配置できます。
  6. すべてのfastcgi_passディレクティブを記述する代わりに、include fastcgi_paramsを記述して、現在の設定に正しくないものだけを再定義する必要があります。
  7. Logrotateによってログファイルを自動的にローテーションさせるには、*access.logまたは*error.logワイルドカードに一致するようにファイルに名前を付ける必要があります。

これを最小限に機能するホスト構成ファイル/etc/nginx/sites-available/sample_projectにすると、次のようになります。

server {
    listen 80;
    server_name myhostname.com;
    root /home/user/Django/sample_project;

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

    location / {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:8080;
    }

    access_log      /var/log/nginx/sample_project.access.log combined;
    error_log       /var/log/nginx/sample_project.error.log warn;
}
13
jollyroger

サーバーブロックでserver_name localhostを使用します。つまり、nginxは、httpホストヘッダーフィールド「localhost」または127.0.0.1の可能性があるリクエストに対してのみ応答します。

他のhttp Hostフィールドを持つリクエストは、nginxのデフォルトの場所に移動します。これは-思った-/usr/share/nginx/htmlです。

サーバーブロックがすべての受信リクエストを受け入れるようにする場合は、server_name ""を使用します。これは、Django構成では必要ないかもしれませんが、.

0
Jasper