阿里云ubuntu18.04
python3.6
Django2
MySQL5.7
为什么需要uWSGI部署Django
- Django runserver 可以直接对外服务,但只是用于测试,不安全,性能低。
- uWSGI可以很好的进行多线程调度,进程监控.监控Django应用,重启应用等功能。
- uWSGI提供完善的请求日志处理.
环境配置
项目环境的安装
- 进入项目目录
cd /home/deployment/django_deployment
- Ubuntu下安装项目所需的Python模块
pip install -r packages.txt
- 安装uwsgi
pip install uswgi
数据准备
- 创建数据库
create database db1 default charset 'utf8';
- 执行migrate命令创建表
python manage.py makemigrations
python manage.py migrate
- 导入公共基础数据。
收集静态文件
- 创建静态文件目录
root@iZ8vbgll9tzu0dgfcvf6s4Z:/home/deployment/django_deployment# mkdir static
root@iZ8vbgll9tzu0dgfcvf6s4Z:/home/deployment/django_deployment#
root@iZ8vbgll9tzu0dgfcvf6s4Z:/home/deployment/django_deployment# ll
total 32
drwxr-xr-x 6 root root 4096 Mar 30 11:05 ./
drwxr-xr-x 3 root root 4096 Mar 29 22:10 ../
-rw-r--r-- 1 root root 0 Mar 29 22:40 db.sqlite3
-rw-r--r-- 1 root root 330 Mar 30 10:53 django-uwsgi.ini
drwxr-xr-x 3 root root 4096 Mar 29 22:40 django_deployment/
drwxr-xr-x 2 root root 4096 Mar 29 23:21 log/
-rwxr-xr-x 1 root root 637 Mar 29 22:10 manage.py*
drwxr-xr-x 2 root root 4096 Mar 30 10:54 pid/
drwxr-xr-x 2 root root 4096 Mar 30 11:05 static/
root@iZ8vbgll9tzu0dgfcvf6s4Z:/home/deployment/django_deployment#
- 修改
settings.py
配置文件添加配置项
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'common_static'),)
- STATIC_ROOT 是在执行pyhtonmanage.pycollectstatic时所有的静态文件存放的目录,django会自动查找APP中static目录下的文件并复制到STATIC_ROOT目录下。
- STATICFILES_DIRS:STATICFILES_DIRS告诉django APP以外的静态文件位置。
- 执行命令收集静态文件
python manage.py collectstatic
uwsgi配置
命令行启动
# uwsgi --http :8000 --module django_deployment.wsgi --static-map /static=static &
# uwsgi --http :8000 --module django_deployment.wsgi --static-map /static=static
uwsgi --chdir /home/deployment/django_deployment --module django_deployment.wsgi --http-socket :8000 --max-requests 5000 --processes 4
- & 表示后台运行,也可不加。
配置文件启动
- 项目根目录下创建django-uwsgi.ini文件
[uwsgi]
chdir=/home/deployment/django_deployment
module=django_deployment.wsgi
# wsgi-file=django_deployment/wsgi.py
http-socket=:8000
# http = [ip]:port
master=true
processes=4
# workers=4 # 指定进程数,等同于processes
threads=2
vacuum=true
# 静态文件
# static-map=/static=static_file
# 后台启动
# 日志文件位置
daemonize=%(chdir)/log/uwsgi-8000.log
# 日志文件大小byte
log-maxsize = 1024000000 # 1G,单位字节byte
# 进程id信息
pidfile = %(chdir)/pid/uwsgi-8000.pid
-
- 创建对应文件夹
# cd /root/work/ds
# mkdir log
# mkdir pid
- 启动:
# uwsgi --ini django-uwsgi.ini
[uWSGI] getting INI configuration from django-uwsgi.ini
#
# ps -aux | grep uwsgi
root 1248 4.5 1.8 115064 36744 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1250 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1251 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1252 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1253 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1255 0.0 0.0 16156 1036 pts/1 S+ 10:45 0:00 grep --color=auto uwsgi
#
- 停止
# uwsgi --stop pid/uwsgi-8000.pid
#
# ps -aux | grep uwsgi
root 1238 0.0 0.0 16156 1084 pts/1 S+ 10:44 0:00 grep --color=auto uwsgi
#
查看uWSGI进程
# ps -aux | grep uwsgi
root 1248 4.5 1.8 115064 36744 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1250 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1251 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1252 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1253 0.0 1.4 115064 28856 ? S 10:45 0:00 uwsgi --ini django-uwsgi.ini
root 1255 0.0 0.0 16156 1036 pts/1 S+ 10:45 0:00 grep --color=auto uwsgi
#
一个主进程和4个配置文件设置的工作进程。
uWSGI参数说明
static-map
uWSGI服务器可以完美提供静态文件服务,但是并不如一个专用的web服务器,例如Nginx,那么快速有效。
使用uWSGI提供静态文件,设置静态文件挂载点的方式“映射”指定请求前缀到你的文件系统上的物理目录。
--static-map mountpoint=path
选项可以实现此目的。
例:--static-map /images=/var/www/img
如果你接收到一个对·/images/logo.png
的请求,并且本地文件系统中/var/www/img/logo.png
存在,那么将会提供它。否则,你的Django应用会管理这个请求。
你可以多次指定 --static-map 选项,即使是对于同一个挂载点。--static-map /images=/var/www/img --static-map /images=/var/www/img2 --static-map /images=/var/www/img3
。在找到文件之前会在每个目录中进行搜索,如果找不到,这个请求就会交由你的应用管理。
max-requests
max-requests = 5000
为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏