質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Node.js

    1859questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • nginx

    837questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Express

    242questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Nginx×Express(Node.js)環境下のキャッシュについて。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 283
退会済みユーザー

退会済みユーザー

ご覧いただきありがとうございます。
現環境としてリバースプロキシとしてNginx、バックエンドにNodeを使用しています。
NodeやExpressの公式のリファレンスにもある通り、cssjspngなどの静的ファイルをNodeで扱うのは不向きとの事なので、Nginxにやってもらおうと考えています。
Nginxの公式のリファレンスの元、色々とproxy_cacheについて調べ、実際に設定して見たのですが
うまくキャッシュできず困っております。
どなたかお知恵をお貸しいただければ幸いです。

#/etc/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; #file type include.
    default_type  application/octet-stream; #??? 

    proxy_cache_path      /var/cache/nginx/cache keys_zone=proxy:15m; #cache data place.
    proxy_temp_path       /var/cache/nginx/temp 1 2; #temp data place.


    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; #access data log place.
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/node.conf;
}
#/etc/nginx/conf.d/node.conf(nginx.confにてinclude)

upstream node {
  ip_hash;
  server xxx.xx.xxx.xxx:3000;
}

server {
    listen       80;
    server_name  xxx.xx.xxx.xxx;
    location / {
        proxy_redirect off;
        set $do_not_cache 0;
        if ($request_method != GET) {
         set $do_not_cache 1;
        }
        if ($uri !~* ".(html|png|gif|css|js)$") {
         set $do_not_cache 1;
        }
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache proxy;
        proxy_cache_key $scheme$host$uri$is_args$args;
        proxy_cache_valid 200 1h;
        proxy_cache_valid any 1m;
        proxy_pass http://node;

        #websoket grade up 
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
//app.js
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');

const MongoClient = require('mongodb').MongoClient;
const f = require('util').format;
const assert = require('assert');
app.use(express.static('public'));



app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

app.get('/page2',function(req,res){
  res.sendFile(__dirname + '/page2.html');
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
<!--index.html-->
<!doctype html>
<html>
  <head>
    <title>Express Sample</title>
    <link rel="stylesheet" href="stylesheets/index.css">
  </head>
  <body>
    <h1>Hello World</h1>
    <a href="/page2">page2へ</a>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script src="/javascripts/index.js"></script>
  </body>
</html>
//index.css
h1{
 color: red;
}
$(function(){
  console.log('Hello Javascript');
});
//index.css,index.jsのディレクトリルート
home
 └ username
       └ www
            └ sample
                    └public
                       ├── stylesheets --index.css
                       ├── javascripts --index.js
                       └── images

一応上記のような設定、ファイルで行なっています。
症状としては、<script src="/socket.io/socket.io.js"></script>のキャッシュは
/var/cache/nginx/cacheにキャッシュファイルが確認できるのですが、
index.css、index.jsのキャッシュファイルが確認できませんでした。
望んでいる動作としては、キャッシュされていないcss,js,pngファイルはキャッシュさせ、
次回アクセス以降、Nginxからそのキャッシュファイルをクライアントへ返却したいです。

もし何か心当たりありましたらお知恵をお貸しいただければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Node.js

    1859questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • nginx

    837questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Express

    242questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。