【Docker】nginx+uwsgi+django+postgresql

to learn

配置nginx+uwsgi过程中的问题:

django容器的Dockerfile:

  • 加上ENV PYTHONUNBUFFERED 1

nginx配置:

  • nginx.conf中user是否要改为root
    • the socket API bind() to a port less than 1024, such as 80 as your title mentioned, need root access.
  • client_max_body_size 10M; # 限制用户上传文件大小
    client_body_buffer_size 1024k;
    这两个参数大小是否合适

nginx和web的数据卷挂载:
静态文件夹和media文件夹,为什么需要在nginx再进行挂载?不挂载是否访问就会出问题。在外网进行测试,整体流程,包括media等文件夹内容并不根据pypi打包时的储存
可以参考这篇文章的挂载方式和路径分配

nginx.conf:
server_tokens off什么意思,会不会对之后的用户权限产生影响

可能的错误:

  • 注意:Django默认ALLOWED_HOSTS = []为空,在正式部署前你需要修改settings.py, 把它设置为服务器实际对外IP地址,否则后面部署会出现错误

原有工程项目的一些变动:

pip安装包的存放路径
/usr/local/bin/chardetect
/usr/local/lib/python3.8/site-packages/chardet-4.0.0.dist-info/*
/usr/local/lib/python3.8/site-packages/chardet/*

为了容器连接,之前代码需要修改的地方:
settings里的数据库,'host‘改为db,跟docker-compose里数据库容器的祈使名一致,ENGINE改为django.db.backends.postgresql
requirements.txt中添加:
uwsgi2.0.18(版本不确定), 项目设置现在是2.0.19.1
Pillow
7.1.2(说为了images?没搞清楚先不加,现在不加也没什么问题)

生产环境设置 Debug = False

settings.py中的DOMIAN_NAME改一下

设置ALLOWED HOSTS
ALLOWED_HOSTS = [‘your_server_IP’, ‘your_domain_name’]
例会上说时设置为127?

设置STATIC ROOT 和 STATIC URL
STATIC_ROOT = os.path.join(BASE_DIR, ‘static’)
STATIC_URL = “/static/”

设置MEDIA ROOT 和 MEDIA URL
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)
MEDIA_URL = “/media/”

现在docker部署基础上可以改进的地方:
requirements.txt作为与django项目分开的部分导入,pip
django的makemigrations可以写在.sh中然后执行,像部署的例子2一样(https://blog.csdn.net/pushiqiang/article/details/79405874)

./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.8

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
RUN mkdir media \
	&& chmod -R 777 media \
    && 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文件夹用户和用户组为Linux默认www-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;

部署完成后遇到的错误

1、上传文件失败

主要分两种,一种是docker那边的nginx提示:a client request body is buffered to a temporary file,往往是nginx配置文件中两个参数 client_max_body_sizeclient_body_buffer_size这两个参数要设置对了
另一种是,上面的这个问题解决了,结果出现nginx那边返500错误,客户端提示"permission denied",主要是服务器那边存储文件的文件夹权限没有开,我将media挂载到了容器外路径media,两个media都要开所有权限(虽然这么做草率了一点,之后再看什么权限必须得开什么权限不用开),不能只一个media有权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值