微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【Docker】nginx+uwsgi+django+postgresql

./docker-compose.yml

version: "3"

services:
  db:
    image: postgres
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: 'a1s2d3'
      POSTGRES_USER: 'postgres'
      POSTGRES_DB: 'miniserver'
      PGDATA: '/var/lib/postgresql/data/pgdata'
    volumes:
        - ./postgres/data:/var/lib/postgresql/data/pgdata
    restart: always

  web:
    build: ./web
    expose:
      - "8000"
    volumes:
      - ./web/media:/usr/local/lib/python3.8/site-packages/miniserver/media
      - ./uwsgi:/tmp # 挂载uwsgi日志
    depends_on:
      - db
    # environment:
    #   - DEBUG=False
    tty: true #同docker run指令参数,表示分配tty设备,该可以支持终端登录
    stdin_open: true

  Nginx:
    build: ./Nginx
    restart: always
    ports:
      - "80:80"
    expose:
      - "80"
    depends_on:
      - web
    links:
      - web

./web/Dockerfile

FROM python:3.8.5

ENV PYTHONUNBUFFERED 1

RUN pip install -i https://test.pypi.org/simple/ miniserver==0.0.7

workdir /usr/local/lib/python3.8/site-packages/miniserver

RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

copY uwsgi.ini /usr/local/lib/python3.8/site-packages/miniserver
copY start.sh /usr/local/lib/python3.8/site-packages/miniserver

RUN sed -i 's/\r//' start.sh \
    && chmod +x start.sh

./web/start.sh

#python manage.py collectstatic --noinput&& #收集静态文件到根目录,
python manage.py makemigrations&&
python manage.py migrate&&
uwsgi --ini /usr/local/lib/python3.8/site-packages/miniserver/uwsgi.ini

./web/uwsgi.ini

[uwsgi]

project=miniserver
uid=www-data
gid=www-data
base=/usr/local/lib/python3.8/site-packages

chdir=%(base)/%(project)
module=%(project).wsgi:application
master=True
processes=2

socket=0.0.0.0:8000
chown-socket=%(uid):www-data
chmod-socket=664

vacuum=True
max-requests=5000

pidfile=/tmp/%(project)-master.pid
daemonize=/tmp/%(project)-uwsgi.log

#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
post buffering = 8192
buffer-size= 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true

#开启内存使用情况报告
memory-report = true

#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10

#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
python-autoreload=1

./Nginx/Dockerfile

FROM Nginx:latest

# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/Nginx/conf.d/default.conf
# && mkdir -p /usr/share/Nginx/html/static \
    # && mkdir -p /usr/share/Nginx/html/media
# && mkdir -p /usr/share/Nginx/ssl

# 设置Media文件用户用户组为Linuxwww-data, 并给予可读和可执行权限,
# 否则用户上传图片无法正确显示。
# RUN chown -R www-data:www-data /usr/share/Nginx/html/media \
#     && chmod -R 775 /usr/share/Nginx/html/media

# 添加配置文件
ADD ./Nginx.conf /etc/Nginx/conf.d/

# 关闭守护模式
CMD ["Nginx", "-g", "daemon off;"]

./Nginx/Nginx.conf

upstream django {
    ip_hash;
    server web:8000; # Docker-compose web服务端口
}

server {
    listen 80; # 监听80端口
    server_name localhost; # 可以是Nginx容器所在ip地址或127.0.0.1,不能写宿主机外网IP地址

    charset utf-8;
    client_max_body_size 102400M; # 限制用户上传文件大小
    # client_body_buffer_size 100M;

    #location /static {


    location / {
        include /etc/Nginx/uwsgi_params;
        uwsgi_pass django;
        uwsgi_read_timeout 600;
        uwsgi_connect_timeout 600;
        uwsgi_send_timeout 600;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP  $remote_addr;
        # proxy_pass http://django; # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
    }
}

    access_log /var/log/Nginx/access.log main;
    error_log /var/log/Nginx/error.log warn;

    server_tokens off;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐