私はそれがよく答えられた質問であることを知っていますが、私が見つけたもののどれも私のために働くようではないようです。私は単純なDjango=プロジェクトを持っており、gunicornとnginxを使ってDockerで実行しようとしています。以下が私の設定です。
Dockerfile
# Pull base image
FROM python:3.6-slim
# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV DATABASE_Host db
# Set work directory
ARG PROJECT=my_project
ARG PROJECT_DIR=/var/www/${PROJECT}
RUN mkdir -p $PROJECT_DIR
# Copy project
COPY my_project $PROJECT_DIR/
COPY docker-entrypoint.sh /
RUN chmod u+x /docker-entrypoint.sh
# give permission for nginx to read static files
RUN chown -R "$USER":www-data /var/www/my_project/allstatic && chmod -R 0755 /var/www/my_project/allstatic
WORKDIR $PROJECT_DIR
EXPOSE 8000
ENTRYPOINT ["/docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/bash
apt-get update
apt-get install -y git
pip install --upgrade pip
pip install -r requirements.txt
python manage.py collectstatic --noinput
python manage.py migrate --no-input
touch ./logs/gunicorn.log
touch ./logs/gunicorn-access.log
tail -n 0 -f ./logs/gunicorn*.log &
gunicorn --bind 0.0.0.0:8000 my_project.wsgi:application --log-level=info --log-file=./logs/gunicorn.log --access-logfile=./logs/gunicorn-access.log
exec "$@"
docker-compose.yml
version: '3.6'
services:
db:
image: postgres:10.5-Alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=some_some
- POSTGRES_DB=database
networks:
- database_network
app:
build: .
volumes:
- .:/var/www
- static_volume:/var/www/my_project/allstatic
depends_on:
- db
networks:
- nginx_network
- database_network
nginx:
image: nginx:1.13
ports:
- 8000:8000
volumes:
- ./config/nginx/conf.d:/etc/nginx/conf.d
- static_volume:/var/www/my_project/allstatic
depends_on:
- app
networks:
- nginx_network
networks:
nginx_network:
driver: bridge
database_network:
driver: bridge
volumes:
postgres_data:
static_volume:
nginx設定
upstream develop_server {
server app:8000;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_read_timeout 300;
proxy_pass http://develop_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $Host;
proxy_redirect off;
}
location /static/ {
autoindex on;
alias /var/www/my_project/allstatic;
}
}
プロジェクト設定で、STATIC_URLとSTATIC_ROOTを次のように定義しました
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'allstatic/')
STATIC_URL = STATIC_ROOT
そしてここに私が得ているエラーがあります
app_1 | Not Found: /var/www/my_project/allstatic/really_important_file.js
nginx_1 | 172.22.0.1 - - [23/Sep/2018:11:55:26 +0000] "GET /var/www/my_project/allstatic/really_important_file.js HTTP/1.1" 404 3132 "http://localhost:8000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0" "-"
このエラーのほかに、ページ全体が問題なく読み込まれます。また、manage.py runserver
を使用してサーバーを実行すると、staticsが適切に提供されるため、nginxの構成がどういうわけか間違っていると思います。答えDockerfileで何が行われているのか(おそらくそれが間違っているのでしょうか?)、静的ディレクトリでnginxのアクセス許可を変更するよう提案されたことがわかりました。
私が逃したことを指摘してくれてとても感謝しています。
更新
これは明らかにアクセス許可の問題ではありません-私のウェブブラウザでlocalhost:8000/static/really_important_file.jsにアクセスすることで、このファイルにアクセスできます。今、私はこれらのエラーの原因が何であるか本当にわかりません。
問題は、Djangoアプリケーションの設定であり、結局nginxではありません。静的ファイルを含むフォルダーへの絶対パスを指すSTATIC_ROOTとしてSTATIC_URLを指定しました。理解できるように、ページが読み込まれ、{{ static }}
タグに基づいてスクリプトのURLを解決しようとしましたが、明らかにnginxで処理できないこの絶対パスを探していました。私はそれをSTATIC_URL = '/static/'
に変更し、すべてが正常に機能するようにしました。