如何通过NGINX连接现有数据库?

问题描述 投票:0回答:1

我有一个项目需要开始

Docker
。我已经成功创建了
images
containers
Django
NGINX
postgreSQL
,因此项目可以正确启动。我注意到,当我尝试登录管理面板时,Django 会引发
OperationalError at /admin/login/ connection to server at "database" (192.168.144.2), port 5432 failed: fe_sendauth: no password supplied
。没有
nginx
一切工作正常,但现在我无法访问数据库。据我了解这个问题,我需要改变
nginx.config
,但我几乎尝试了所有方法,但仍然无法解决这个问题。看起来
postgreSQL
可能看不到我的用户。我的代码片段如下。

uwsgi.ini

[uwsgi]

wsgi-file = config/wsgi.py

strict = true  
 
socket = :8000  

protocol = http

master = true  

no-orphans = true   

die-on-term = true  

lazy-apps = true

processes = 4  

threads = 8   

enable-threads = true  

max-requests = 500

reload-on-rss = 1024
 
worker-reload-mercy = 60

harakiri = 60

harakiri-verbose = true

vacuum = true

post-buffering = 1048576

buffer-size = 65535

nginx.conf

worker_processes 1;

events {

    worker_connections 1024;

}

http {

    include mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;
    include /etc/nginx/uwsgi_params;

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://django:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

    }
}

Dockerfile

FROM python:3.10.0-alpine

RUN apk add postgresql-client build-base postgresql-dev linux-headers pcre-dev

WORKDIR /movies_admin

COPY requirements.txt .

RUN pip install -r requirements.txt --no-cache-dir

EXPOSE 8000

COPY movies_admin .

docker-compose.yml

version: '3.8' 

services:
  django:
    build:
      context: .
    
    volumes:
      - "./movies_admin:/movies_admin"
    
    environment:
      - DB_HOST=database
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe
      - SECRET_KEY='django-insecure-8h%wg+drqmqjkw$8wm7#)#%*fb3b%(-e!-kbdth^#9u)23u!48'
    
    command:
      sh -c "uwsgi --ini /movies_admin/uwsgi.ini"
    
    depends_on:
      - database

  database:

    image: postgres:16

    environment:
      - POSTGRES_DB=movies_database
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=123qwe
    
    volumes:
      - $HOME/postgresql/data:/var/lib/postgresql/data
  
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - django

组件/database.py

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST', 'database'), # name of docker container with postgresql
        'PORT': os.environ.get('DB_PORT', 5432),
        'OPTIONS': {
            'options': '-c search_path=public,content'
        }
    }
} 

附注我还认为这个想法可能在

ports
中使用
docker-compose.yml
,但当我阅读 dos 时,最佳实践是隐藏
django
postgresql
端口并仅通过
nginx
连接。

python django postgresql docker nginx
1个回答
0
投票

您的问题似乎与 Docker 或 NGINX 无关。再次阅读错误:

no password supplied
- 这意味着您连接正常,但数据库未收到密码

components/database.py
正在调用
os.environ.get('DB_PASSWORD')
,但是你在哪里设置这个环境变量呢?

docker-compose.yml
中,查看您的
django
服务环境变量。您正在设置一个名为
POSTGRES_PASSWORD
not
DB_PASSWORD
的变量,这正是您的
django
应用程序正在寻找的内容。

解决方案

django
中的
docker-compose.yml
服务读入
POSTGRES_PASSWORD
而不是当前的
DB_PASSWORD

© www.soinside.com 2019 - 2024. All rights reserved.