Q&A

책을 따라하다가 막히는 부분이 있나요?
질문을 남겨주세요.

[질문] Doit 장고+부트스트랩 파이썬 웹 개발의 정석 592페이지~595페이지 django - docker - nginx 연결 질문

3 weeks, 3 days ago

daniel_choi daniel_choi

Doit 장고+부트스트랩 파이썬 웹 개발의 정석 592페이지~595페이지 질문

입니다.

솔직히 여기까지 오는데, 코드대로 해도 제대로 작동하는게 거의 없다시피 할정도로

구글링 + 챗gpt로 어찌저찌 따라오긴 했는데,

nginx에 3일째 해결이 안되고 있네요..

디버그 뜨더라도 "a와 b가 일치하지 않습니다"

라고라도 뜨면, 수월할텐데, 막연히 "nginx: [emerg] "location" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:24"

이런식으로 나와서요.

nginx.conf에 문제가 있는건 알겠는데, 여기의 24번째 줄은 location의 닫음 중괄호일 뿐이라서

어디서부터 잘못되었는지도 잘 모르겠습니다! ㅠㅠ

기본적으로 책이랑 깃허브 코드 참고해서 592페이지부터 595페이지까지 내용을 진행하자면

이제 docker로 개발용, 배포용 분리후에 nginx랑 연결하는 내용입니다.

그랬더니, 여태까지 작성한 내용이랑 nginx랑 연동은 안되고,

nginx 초기페이지만 있을 뿐입니다.

코드 검토해주시면 감사하겠습니다.


책에 있는 내용에서 챗gpt 등을 참고하면서 코드를 변형 시켰습니다.

연결점이 있는 코드들을 모두 보여드리겠습니다.

최종적으로는 nginx.conf의 web쪽과 docker-compose.yml의 web연결이 원활하지 않은 것 같습니다.


---

#1. nginx/Dockerfile

FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
---
#2. nginx/nginx.conf
http {
    upstream web {
server web:8000; # 'web' 서비스 이름을 사용하여 Django 앱에 접근
}

server {
listen 80;

server_name localhost;

location / {
proxy_pass http://web:8000; # 'web'으로 변경
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
}

location /static/ {
alias /usr/src/app/static/;
}

location /media/ {
alias /usr/src/app/media/;
---
#3. docker-compose.yml
services:
web:
image: daniel_blog-web
build: .
command: /usr/src/app/entrypoint.sh && gunicorn --workers 2 --timeout 120 daniel_blog.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/usr/src/app
ports:
- "8000:8000"
networks:
- django_network
environment:
- SQL_ENGINE=django.db.backends.postgresql
- SQL_DATABASE=daniel_blog_prod
- SQL_USER=daniel_blog_user
- SQL_PASSWORD=daniel_blog_db_password
- SQL_HOST=db
- SQL_PORT=5432
depends_on:
- db

nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./static:/usr/src/app/static
- ./media:/usr/src/app/media
ports:
- "80:80"
depends_on:
- web
networks:
- django_network

db:
image: postgres:17.0-alpine
environment:
- POSTGRES_USER=daniel_blog_user # 사용자 설정
- POSTGRES_PASSWORD=daniel_blog_db_password
- POSTGRES_DB=daniel_blog_prod # 데이터베이스 이름
networks:
- django_network

networks:
django_network:
driver: bridge
---

#4 Dockerfile


FROM python:3.11-slim

RUN apt-get update && apt-get install -y \
build-essential \
libffi-dev \
libssl-dev \
libpq-dev \
gcc \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
RUN apt-get update && apt-get install -y locales && locale-gen en_US.UTF-8

RUN pip install wait-for-it

COPY . .

CMD ["gunicorn", "--workers", "2", "--timeout", "120", "daniel_blog.wsgi:application", "--bind", "0.0.0.0:8000"]
---
#5. settings.py 의 DATABASES
DATABASES = {
'default': {
'ENGINE': os.environ.get("SQL_ENGINE", 'django.db.backends.postgresql'),
'NAME': os.environ.get('SQL_DATABASE', 'daniel_blog_prod'),
'USER': os.environ.get('SQL_USER', 'daniel_blog_user'),
'PASSWORD': os.environ.get('SQL_PASSWORD', 'daniel_blog_db_password'),
'HOST': os.environ.get('SQL_HOST', 'db'), # db 컨테이너의 서비스 이름 사용
'PORT': os.environ.get('SQL_PORT', '5432'), # 기본 포트 5432
"OPTIONS": {
"client_encoding": "UTF8"
}
}
}

Leave a Comment:
목록보기
Search
  • 자유게시판
  • Q&A