Docker-Compose + Django + PostgreSQL + uwsgi + Nginx, получающий 404, не найден - PullRequest
0 голосов
/ 05 июля 2018

Я недавно сделал несколько услуг для практики. Я использовал Docker-Compose, Django, PostgreSQL, uwsgi, Nginx. Я пытаюсь бежать на моей локальной машине. Вот то, что мой сайт нравится, когда я получаю доступ к нему на моем сервере. enter image description here

Вот часть статического файла my settings.py в корневом каталоге Django 'django_project'.

# STATIC FILE CONFIGURATION
STATIC_DIR = SRC_DIR.path('static')
STATIC_ROOT = str(SRC_DIR('staticfiles'))

STATIC_URL = '/static/'

STATICFILES_DIRS = [str(SRC_DIR('static'))]

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Вот мой файл Docker-compose

version: '2'
services:

  nginx:
    restart: always
    build: ./nginx
    ports:
     - "80:80"
    volumes_from:
     - refrigerator
    links:
     - refrigerator:refrigerator
    depends_on:
     - refrigerator

  refrigeratordb:
    image: "postgres:9.6.1"
    container_name: refrigeratordb
    expose:
     - "5432"
    environment:
     POSTGRES_PASSWORD: "something"
     POSTGRES_USER: "something"
     POSTGRES_DB: "something"

  refrigerator:
    build: .
    container_name: refrigeratormanager
    depends_on:
     - refrigeratordb
    links:
     - refrigeratordb
    volumes:
     - .:/var/www/refrigerator
     - /usr/src/app/static
    command: uwsgi --ini ./refrigerator_manager_uwsgi.ini
    stdin_open: true  
    tty: true  

Вот мой Dockerfile для Django

FROM centos/python-36-centos7:latest
USER root

ADD . /var/www/refrigerator/

WORKDIR /var/www/refrigerator
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

EXPOSE 8000

Вот мой Dockerfile для Nginx

FROM nginx:alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY ./sites-enabled/nginx.conf /etc/nginx/conf.d/default.conf

Вот мой nginx.conf

server {

    listen 80;
    server_name sodwkdrhdjemals.com www.sodwkdrhdjemals.com;
    charset utf-8;

    location /static {
        alias /static;
    }

    location / {
        include     uwsgi_params; # the uwsgi_params file you installed
        uwsgi_pass  refrigerator:8000;
    }

    location = /favicon.ico {
        return 404;
        log_not_found off;
        access_log off;
    }
}

Вот мой uwsgi.ini

[uwsgi]
chdir = /var/www/refrigerator/
module = refrigerator_manager.wsgi

socket =:8000

chmod-socket = 666

vacuum = true

master = true

Вот мой urls.py

urlpatterns = [
    url(settings.ADMIN_URL, admin.site.urls),
    url(r'^rest-swagger/', schema_view),
    url(r'^vegetables/?$', VegetablesListCreateAPIView.as_view(), 
name='query_for_vegetables_list'),
    url(r'^vegetables/(?P<vegetable_id>[0-9]+)/?$', 
VegetableRetrieveUpdateDeleteView.as_view(),
        name='retrieve_update_delete_vegetable_item'),
    url(r'^forks/?$', ForksListCreateAPIView.as_view(), 
name='query_for_forks_list'),
    url(r'^forks/(?P<fork_id>[0-9]+)/?$', 
ForkRetrieveUpdateDeleteView.as_view(),
        name='retrieve_update_delete_fork_item'),

    url(r'^.*', api_404, name='api_404'),
]

Я думаю, что статический файл не связан между контейнером nginx и контейнером Django. Я пытался исправить ошибку в течение нескольких дней, ссылаясь на похожие примеры Google и StackOverflow, но это не работает, и мне нужна помощь. Помогите!

1 Ответ

0 голосов
/ 05 июля 2018

В вашем urls.py есть строка как url(r'^.*', api_404, name='api_404'),, поэтому всякий раз, когда вы обращаетесь к своему root (т.е. www.mydomain.com/), диспетчер URL переводит вас в представление api_404.

Я не уверен, что находится внутри представления api_404, но, как показывает название представления, это может вызвать ошибку Http404.

Заключение
Это не проблема nginix, докера и т. Д., Просто попробуйте получить доступ к valid api

Этот фрагмент кода будет воспроизводить поведение

from rest_framework.decorators import api_view
from django.http import Http404


@api_view()
def api_404(request):
    raise Http404


urlpatterns = [

    url(r'^.*', api_404, name='api_404')
]
...