Deploy django-nginx-uwsgi
针对一些单位简单企业站使用docker 完成django uwsgi 部署
docker-nginx django-ruunserver
Django settings.py
ALLOWED_HOSTS = ['*']
...
STATIC_URL = '/static/'
STATIC_ROOT = '/statics'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'INFO',
'formatter': 'verbose',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': '/Users/kurong/Desktop/deploydemo/debug.log',
'when': 'midnight',
'interval': 1
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
},
}
python manage.py runserver 0.0.0.0:8000
nginx
upstream website {
server 192.168.50.229:8000;
}
server {
listen 80;
server_name 192.168.50.229;
charset utf-8;
location / {
proxy_pass http://website;
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
}
docker run -itd --name nginx -p 80:80 -v /Users/kurong/Desktop/site.conf:/etc/nginx/conf.d/default.conf nginx
docker-nginx django-uwsgi
测试uwsgi
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
uwsgi --http :8000 --wsgi-file test.py
浏览器访问127.0.0.1:8000
显示Hello World成功
测试uwsgi+django
uwsgi --http :8000 --module deploydemo.wsgi
浏览器访问127.0.0.1:8000
显示Django index页面成功
测试nginx+uwsgi+django
upstream website {
server 192.168.50.229:8000;
}
server {
listen 80;
server_name 192.168.50.229;
charset utf-8;
client_max_body_size 75M;
# location /media {
# alias /path/to/your/mysite/media;
# }
location /static {
alias /path/to/your/mysite/static;
}
location / {
uwsgi_pass website;
include /etc/nginx/uwsgi_params;
}
}
docker run -itd --name nginx -p 80:80 -v /Users/kurong/Desktop/site.conf:/etc/nginx/conf.d/default.conf nginx
uwsgi --socket :8000 --module deploydemo.wsgi
浏览器访问192.168.50.229
显示Django index页面成功
使用uwsgi.ini启动服务
[uwsgi]
chdir = /Users/kurong/Desktop/project/deploydemo
module = deploydemo.wsgi
socket = 0.0.0.0:8000
master = True
processes = 4
harakiri = 60
max-requests = 5000
vacuum = True
; pidfile = /data/uwsgi.pid
; daemonize = /www_data/uwsgi.log
uwsgi --ini uwsgi.ini
浏览器访问192.168.50.229
显示Django index页面成功
(py3) ➜ deploydemo ls -alR
total 24
drwxr-xr-x 9 kurong staff 288 4 8 12:14 .
drwxr-xr-x 8 kurong staff 256 4 8 09:26 ..
-rw-r--r-- 1 kurong staff 0 4 8 09:27 db.sqlite3
drwxr-xr-x 8 kurong staff 256 4 8 09:27 deploydemo
srw-rw-rw- 1 kurong staff 0 4 8 12:14 deploydemo.sock
-rwxr-xr-x 1 kurong staff 666 4 8 09:26 manage.py
drwxr-xr-x 2 kurong staff 64 4 8 10:53 static
-rw-r--r-- 1 kurong staff 124 4 8 11:48 test.py
-rw-r--r-- 1 kurong staff 242 4 8 12:53 uwsgi.ini
./deploydemo:
total 32
drwxr-xr-x 8 kurong staff 256 4 8 09:27 .
drwxr-xr-x 9 kurong staff 288 4 8 12:14 ..
-rw-r--r-- 1 kurong staff 0 4 8 09:26 __init__.py
drwxr-xr-x 8 kurong staff 256 4 8 11:54 __pycache__
-rw-r--r-- 1 kurong staff 397 4 8 09:26 asgi.py
-rw-r--r-- 1 kurong staff 3956 4 8 10:55 settings.py
-rw-r--r-- 1 kurong staff 752 4 8 09:26 urls.py
-rw-r--r-- 1 kurong staff 397 4 8 09:26 wsgi.py
...
docker nginx+uwsgi+django 服务器部署
# uwsgi.ini
[uwsgi]
chdir = /ggjsfw
module = backend.wsgi
socket = 0.0.0.0:8000
master = True
processes = 4
harakiri = 60
max-requests = 5000
vacuum = True
pidfile = /data/uwsgi.pid
# Dockerfile
FROM freeyeti/dev-in-docker:pyinstaller-4.5-poetry AS django
RUN mkdir /statics && mkdir /data
RUN mkdir -p /deploydemo
WORKDIR /deploydemo
COPY . .
ENV DJANGO_SETTINGS_MODULE "deploydemo.settings_build"
RUN poetry export --output requirements.txt \
&& yes | pip3 install --no-cache-dir -i https://mirrors.cloud.tencent.com/pypi/simple -r requirements.txt \
&& python3 manage.py collectstatic --noinput
ENV DJANGO_SETTINGS_MODULE "deploydemo.settings"
ENV DJANGO_LOG_FILE "/data/logs/debug.log"
RUN chmod +x ./docker/start.sh
CMD ["sh", "./docker/start.sh"]
EXPOSE 8000
FROM nginx:mainline-alpine AS nginx
COPY --from=django /statics /statics
COPY ./docker/site.conf /etc/nginx/conf.d/default.conf
WORKDIR /
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
# site.conf
upstream website {
server 10.0.24.2:8000; # 10.0.24.2:内网IP
}
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /media;
}
location /static {
alias /statics;
}
location / {
uwsgi_pass website;
include /etc/nginx/uwsgi_params;
}
}
# start.sh
#!/bin/bash
mkdir -p /data/logs
if [ -f "$DJANGO_LOG_FILE" ]; then
echo "$DJANGO_LOG_FILE exists."
else
touch $DJANGO_LOG_FILE
echo "$DJANGO_LOG_FILE does not exist. created"
fi
python3 manage.py migrate && uwsgi --ini uwsgi.ini
# serverup.sh
CODETYPE=fullstack
DOMAINNAME=westdc.cn
EMAIL=service@westdc.cn
HOSTNAME=ggjsfw
IMAGESERVER=cr.westdc.cn
PROJECTNAME=ggjsfw
CI_COMMIT_SHORT_SHA=12766a
cp docker/* ./
docker build --target django -t deploydemo-django .
docker build --target nginx -t deploydemo-nginx .
docker run -itd --name $PROJECTNAME-django -p 8000:8000 \
-v /mnt/disk2/projects/ggjsfw/media:/ggjsfw/media \
-v /mnt/disk2/projects/ggjsfw/statics:/statics \
-v /mnt/disk2/projects/ggjsfw/data:/data \
$IMAGESERVER/$PROJECTNAME/django:$CI_COMMIT_SHORT_SHA
docker run -itd -p 8010:80 --name $PROJECTNAME-nginx \
-v /mnt/disk2/projects/ggjsfw/media:/media \
$IMAGESERVER/$PROJECTNAME/nginx:$CI_COMMIT_SHORT_SHA
➜ ggjsfw git:(ciupdate) ✗ tree -L 1
.
├── README.md
├── apps
├── backend
├── db.sqlite3
├── deploy
├── dev
├── docker
├── manage.py
├── media
├── poetry.lock
├── pyproject.toml
├── serverup.sh
├── static
├── templates
├── tmp
├── uwsgi.ini
└── yarn.lock
➜ ggjsfw git:(ciupdate) ✗ cd docker
➜ docker git:(ciupdate) ✗ tree -L 1
.
├── Dockerfile
├── docker-compose.dev.yml
├── docker-entrypoint.sh
├── freed.sh
├── site.conf
├── site.conf.backup
├── start.sh
├── startdjango.sh
└── startnginx.sh