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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

267閲覧

【お力貸してください】error_logのAH01630: client denied by server configurationを解消し、表示できていない画像を表示させたい

Hikaru-UPP

総合スコア6

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

1グッド

1クリップ

投稿2024/10/23 02:14

編集2024/10/24 10:32

実現したいこと

×の表示になっている画像を表示させたい

イメージ説明

発生している問題・分からないこと

Djangoを使って、AWSのLightsailの本番環境にて、サービス開発をしていますが、画像が非表示状態になってしまっており、まず、Apacheのエラーログからエラー確認を行い、様々な対応をしていますが、画像表示が出来ない状態がつづいています。

エラーメッセージ

error

1AH01630: client denied by server configuration: /opt/bitnami/proj 2ects/student_info/myvenv/student_info/media, referer: https://〇〇〇.com/le 3ssons/detail/3

該当のソースコード

/opt/bitnami/projects/student_info/myvenv/student_info/lessons/views.py

from django.views.generic import ListView, DetailView from django.views.generic.edit import CreateView, UpdateView, DeleteView from .models import Lesson from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .forms import LessonSearchForm,LessonForm from django.shortcuts import render, redirect from django.core.mail import send_mail from django.conf import settings from .forms import LessonForm class LessonDetailView(LoginRequiredMixin, DetailView): model = Lesson template_name = "lessons/lesson_detail.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) print(context) # デバッグ用にコンテキストを出力 return context

/opt/bitnami/projects/student_info/myvenv/student_info/templates/lessons/lesson_detail.html

{% extends "base.html" %} {% load django_bootstrap5 %} {% block title %}生徒情報詳細{% endblock %} {% block content %} <h1>生徒情報詳細</h1> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <table class="table table-responsive table-striped table-hover table-bordered"> <tbody> <tr> <th>授業日</th> <td>{{ lesson.day }}</td> </tr> <tr> <th>生徒</th> <td>{{ lesson.student }}</td> </tr> <tr> <th>教科</th> <td>{{ lesson.subject }}</td> </tr> <tr> <th>講師</th> <td>{{ lesson.teacher }}</td> </tr> <tr> <th>宿題確認</th> <td>{{ lesson.homework_done }}</td> </tr> <tr> <th>授業テキスト名</th> <td>{{ lesson.get_textbook_display }}</td> </tr> <tr> <th>授業ページ</th> <td>{{ lesson.contents }}</td> </tr> <tr> <th>授業テキスト名②</th> <td>{{ lesson.get_textbook_2_display }}</td> </tr> <tr> <th>授業ページ②</th> <td>{{ lesson.contents_2 }}</td> </tr> <tr> <th>解答スピード</th> <td>{{ lesson.speed }}</td> </tr> <tr> <th>正確性</th> <td>{{ lesson.accuracy }}</td> </tr> <tr> <th>理解度</th> <td>{{ lesson.understanding }}</td> </tr> <tr> <th>気分・意欲</th> <td>{{ lesson.feeling }}</td> </tr> <tr> <th>次回の宿題(テキスト名)</th> <td>{{ lesson.get_next_homework_text_display }}</td> </tr> <tr> <th>次回の宿題(ページ数)</th> <td>{{ lesson.next_homework_contents }}</td> </tr> <tr> <th>次回の宿題(テキスト名)②</th> <td>{{ lesson.get_next_homework_text_2_display }}</td> </tr> <tr> <th>次回の宿題(ページ数)②</th> <td>{{ lesson.next_homework_contents_2 }}</td> </tr> <tr> <th>講評</th> <td>{{ lesson.memo }}</td> </tr> <tr> <th>授業シート</th> <td style="text-align: center;"> {% if lesson.class_img %} <img src="{{ lesson.class_img.url }}" alt="授業シート" style="max-width: 100%; height: auto;"> {% else %} 画像はありません {% endif %} </td> </tr> </tbody> </table> <p>画像のURL: {{ lesson.class_img.url }}</p> <br> <a href="{% url 'lesson_list' %}">戻る</a> </form> {% endblock %}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラーログから、client denied by server configuration というエラーが発生しており、これはApacheの設定によってメディアファイルへのアクセスが拒否されていると判断し、/opt/bitnami/projects/student_info/myvenv/student_info/media ディレクトリに対してのアクセスが問題となっていると考え下記を試みました。

⒈Apacheの設定ファイルのアクセス許可を確認
下記のコードが記載されていることを確認しました。

Alias /media/ /opt/bitnami/projects/student_info/myvenv/student_info/media_local/ <Directory /opt/bitnami/projects/student_info/myvenv/student_info/media_local> Require all granted </Directory>

⒉ ルートディレクトリ上のsettings.pyにおけるMEDIA_ROOT と MEDIA_URLの設定確認
下記の設定を確認しました。

MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media_local'

表示させたい画像は、「media_local」内に保存されています。

⒊ media_localのディレクトリとファイルのアクセス権限の確認
下記のコードにて、ディレクトリとファイルのアクセス権限を確認しました。

ls -l /opt/bitnami/projects/student_info/myvenv/student_info/media_local

その結果、下記のアクセス権状態でした。

-rw-r--r-- 1 daemon www-data 2605779 Oct 4 01:46 _DSC9018_anPLj0W.JPG -rw-r--r-- 1 daemon www-data 2605779 Oct 3 02:57 _DSC9018.JPG drwxr-xr-x 2 daemon www-data 4096 Oct 3 02:57 media_local -rw-r--r-- 1 daemon www-data 3631 Oct 3 02:57 noImage_kq7P3zn.png -rw-r--r-- 1 daemon www-data 3631 Oct 3 02:57 noImage.png -rw-r--r-- 1 daemon www-data 63259 Oct 11 10:37 勉強風景_2MWu6XG.jpg -rw-r--r-- 1 daemon daemon 63259 Oct 18 02:05 勉強風景_5Zostgw.jpg -rw-r--r-- 1 daemon www-data 63259 Oct 14 11:37 勉強風景_CVwknHR.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 18 02:27 勉強風景.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 20 02:37 勉強風景_kihGx6T.jpg -rw-r--r-- 1 daemon daemon 63259 Oct 18 01:57 勉強風景_rNnZsPm.jpg -rw-r--r-- 1 daemon www-data 63259 Sep 26 01:21 勉強風景_uDLM3ZR.jpg

⒋ ブラウザで直接アクセス
そこで、アクセス権が許可されていることを確認したので、一度、直接画像のURLをブラウザで入力し、確認しました。

https://○○〇.com/media/%E5%8B%89%E5%BC%B7%E9%A2%A8%E6%99%AF_5Zostgw.jpg

その結果、「Forbidden
You don't have permission to access this resource.」となり、画像が表示できませんでした。

⒌ AppArmorの設定確認
ApacheのAppArmorプロファイルの内容を確認しました。

sudo cat /etc/apparmor.d/usr.sbin.apache2

白紙だったため、下記のコードを加えて、アクセス権の設定を行いました。

# Apache web server profile /usr/sbin/apache2 { # アクセス権の設定 /opt/bitnami/apache2/** r, /opt/bitnami/projects/student_info/myvenv/student_info/media_local/ r, /opt/bitnami/projects/student_info/myvenv/student_info/media_local/** rw, /usr/sbin/apache2 ix, }

設定適用のため、下記のコードを入力。

sudo systemctl reload apparmor

上記試しましたが、画像表示には至っておりません。

補足

Django 4.1.7
Apache/2.4.59 (Unix)

該当するページは、「templates/lessons/lesson_detail.html」なので、念のため、データベースから画像を引っ張ってこようとできているのかを確認するため、画像のURLを下記のように、して確認してみました。

イメージ説明

その結果、下記のように、画像のURLが表示されているので、media_localディレクトリの画像を引き出そうとしているように思います。

イメージ説明

juner👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

これまで、/opt/bitnami/apache2/conf/httpd.conf を編集していましたが、
/opt/bitnami/apache2/conf/vhosts/sample-https-vhost.confのファイルで、その編集内容が上書きされてしまっていたので、sample-https-vhost.confに記載していた下記のコードをコメントアウトしたら、画像が閲覧できました。

Alias /media/ /opt/bitnami/projects/student_info/myvenv/student_info/media/ <Directory /opt/bitnami/projects/student_info/myvenv/student_info/media> Require all granted </Directory>

投稿2024/10/30 07:34

Hikaru-UPP

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問