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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

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

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

Q&A

解決済

1回答

1769閲覧

nginxで画像をサーバキャッシュしようとするとエラーが発生します

poppon

総合スコア2

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

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

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

0グッド

0クリップ

投稿2022/05/12 00:47

flask-nginxで画像をサーバキャッシュさせようと、nginxのconfファイルに以下を設定すると
画像が一律404エラーとなってしまいます。

色々調べていると、パスルーティングの優先順位が以下に渡る?為か、proxy_passなどが未適用になるからかとは想定したのですが
この中にproxy_passを入れてみたら、nginx自体が起動しなくなりました。

ご存知の方おりましたらご教示いただきたく願います。
よろしくお願いします。

location ~* \.(css|js|webp)$ { expires 15d; }

以下、confファイルの設定となります。
上記の内容をコメントアウトしているときは問題なく動作します。

server { listen 80; server_name xxxxx.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name xxxxx.com; if ($host != "xxxxx.com") { return 444; } proxy_read_timeout 180; # SSLを無効化してTLSのみ受け付ける ssl_protocols TLSv1.3 TLSv1.2; ssl_certificate /etc/letsencrypt/live/xxxxx.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/xxxxx.com/privkey.pem; error_page 500 503 /503.html; location = /503.html { root /usr/share/nginx/html; } location ~* \.(css|js|webp)$ { expires 15d; } location / { if ($maintenance = true) { return 503; } proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2022/05/12 03:42

nginxが起動しなくなるときにエラーログをはくと思うのですが、そのログは確認していますでしょうか? 内容見ても分からない場合はログの内容を質問文に追記されると回答が出やすくなると思います。
poppon

2022/05/12 04:38

↑の設定だけではエラーにはならず、起動はできるのですが、画像が404エラーとなります。。。
AbeTakashi

2022/05/12 05:11

404ならNot Foundですよね? こちらもまずはNginxのエラーログを見れば、どういうパスに画像があると期待されてるか分かると思います。そして実際にそのパスに画像があるかないかをチェックし、同時にNginxの設定のパスが正しいかどうかのチェックもできるのではないでしょうか? 設定ファイルの情報だけでは原因の特定が厳しいので、その辺からあたりを付けていくことをおすすめします。
poppon

2022/05/12 05:30

AbeTakashiさん ご回答いただきありがとうございました。たしかにnginxのえらーログに出力されていました。ありがとうございます。 2022/05/12 14:26:13 [error] 12331#0: *3 open() "/usr/share/nginx/html/static/image/app.png" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: xxx.com, request: "GET /static/image/app.png HTTP/1.1", host: "xxx.com", referrer: "https://xxx.com/" app.pngについては /home/centos/xxx/src/static/image配下に配置しているのですが なぜ/usr/share/nginx/html/static/image配下を見にいってしまうのか・・・検討も付きません・・・
AbeTakashi

2022/05/12 06:53

rootの設定で"/home/centos"という記述は質問文の設定ファイル内にはありませんが、どこか他で記述してるのでしょうか? もし設定してないなら大元のnginx.confの設定が効いてしまうので/usr/share/nginxを見に行ってしまうのだと思います。/usr/share/nginx/html以下に/home/centos/xxx/src/staticのシンボリックリンクを張るとかでも対応できるかもしれません。
guest

回答1

0

ベストアンサー

(css|js|webp) の location には proxy_pass 設定がないので、Nginx が直接ファイルを応答しようとするのですが、デフォルトの $document_root 以下を探して 404 になっているのだと思います。
8000 番ポートで稼働しているバックエンド Webサーバーのドキュメントルートを root で設定するといいのではないでしょうか。

(例) location ~* \.(css|js|webp)$ { root /home/centos/xxx/src; expires 15d; }

あるいは、proxy_pass を効かせたいのであれば、location / { ... } の中で if 文を使うか。

(例) location / { if ( $request_uri ~* "\.(css|js|webp)$" ) { expires 15d; } proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; }

投稿2022/05/12 06:10

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poppon

2022/05/12 06:55

ありがとうございます!!! 後者のほうで動作しました・・・! .css?2022020906 ↑のように最新を取り込ませる為に、末尾にタイムスタンプを入れたファイルが対象にならないのですが、設定を変更しないといけないでしょうか?
TaichiYanagiya

2022/05/12 12:47

$request_uri はクエリストリングを含みます。 $request_filename に変更するとどうでしょうか。
poppon

2022/05/13 14:00

ありがとうございました・・・!すべて解消できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問