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
Pillow7.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_size
和client_body_buffer_size
这两个参数要设置对了
另一种是,上面的这个问题解决了,结果出现nginx那边返500错误,客户端提示"permission denied",主要是服务器那边存储文件的文件夹权限没有开,我将media挂载到了容器外路径media,两个media都要开所有权限(虽然这么做草率了一点,之后再看什么权限必须得开什么权限不用开),不能只一个media有权限。