私は、Ubuntu を実行しているサーバー上の WSGI 経由で Apache2 上で実行される django API を開発しています。
ユーザーは、POST リクエストを使用して、撮影した写真をサーバーにアップロードできます。API はこのリクエストを処理し、画像を に書き込もうとします/var/www/media/animals/user_uploads/<animal_type>/<picture_name>.jpg
。ディレクトリがない場合は、ディレクトリ/var/www/media/animals/user_uploads/<animal_type>/
が作成されます。
開発中にテストしたときは、Windows と Scientific Linux の両方を使用してすべて正常でした。デプロイメント サーバーでテストすると、次のエラーが表示されます。
私の理解では、Apache2 サーバーはユーザーを使用して実行されていますwww-data
。私の場合、cat /etc/passwd
ユーザーのリストを取得するために実行すると、次のようになりますwww-data
:
www-data:x:33:33:www-data:/var/www:/bin/sh
www-data
これは、が 内のすべてのものにアクセスできることを意味していると想定しています/var/www/
。私は以下を試しました:
chmod 777 -R メディア
これはうまくいきましたが、明らかにこれは非常に悪い解決方法です。これを解決するより良い方法はありますか?
これは私の wsgi.py です:
import os, sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "serengeti.settings")
sys.path.append('/serengeti/django/serengeti')
sys.path.append('/serengeti/django')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
私のファイルにはこれがありますsettings.py
:
MEDIA_ROOT = '/var/www/media/'
MEDIA_URL = os.path.join(BASE_DIR,'/media/')
私のvhost.conf
にはこれが含まれています:
Alias /media/ /var/www/media/
ベストアンサー1
結局、私は自分でこれを解決しました。
開発マシンで実行する場合、実際には現在のユーザーの権限を使用して実行しています。ただし、デプロイメント サーバーで実行する場合、実際には を介して実行しており、これは の権限wsgi
を使用して実行していることを意味します。www-data
www-data
は、所有者でも、 を所有するユーザー グループにも属していません/var/www
。つまり、 はwww-data
として扱われother
、他のユーザーに権限が設定されます。
の悪いこれを解決するには、次のようにします。
sudo chmod -R 777 /var/www/
これにより、誰もが のすべてに完全にアクセスできるようになります/var/www/
。それは非常に悪い考えだ。
別の悪い解決策としては、次のようになります。
sudo chown -R www-data /var/www/
これにより、所有者は に変更されますwww-data
。セキュリティ上の脆弱性が生じる。
の良い解決策は次のようになります:
sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 770 /var/www/
これにより、グループwww-data
に追加され、そのグループとそのすべてのサブフォルダーvarwwwusers
として設定されます。 に設定してセキュリティを強化することもできますが、その場合、機能を使用できなくなるため、自分のやっていることに非常に自信がない限り、に固執してください。/var/www/
750
Django's
collectstatic
770