博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树莓派部署django项目 | 树莓派小无相系列
阅读量:6083 次
发布时间:2019-06-20

本文共 4216 字,大约阅读时间需要 14 分钟。

人生苦短,快用 python。因为刚刚接触到 django,实现项目之后,对部署不太熟悉,所以在树莓派上尝试一下。文中教程 Linux 通用。

部署概览

我们采用 nginx + uwsgi 的方案进行部署。整个系统架构图如下:

nginx-uwsgi

环境配置

首先需要安装 virtualenv 为其提供独立的环境,命令行如下:

pip3 install virtualenv

创建并生成环境,我的项目名为 demo,我决定将它放置在 /home/pi/www/demo 下,命令行如下:

cd ~/www/demopython3 -m virtualenv --no-site-packages venv

激活环境命令为:

source venv/bin/activate

注:激活环境后,输入命令的指示标志前会变成类似 (venv) pi@raspberrypi:~/www/demo $。

退出当前环境命令为:

deactivate

django 项目配置

环境配置好后,便可以准备项目的上传。该部分的所有命令皆是在激活虚拟环境(source venv/bin/activate)之后进行。

(1). 在编写 django 项目的测试机器上,进入项目根目录(存着 manage.py 文件的目录),cd 到该目录,之后运行如下命令生成扩展库信息列表:

pip freeze > requirements.txt

(2). 把 django 项目整个传到树莓派上,项目根目录(manage.py 同级目录)下的全部文件全部复制到树莓派项目目录,复制之后,情况大概是这样:

(venv) pi@raspberrypi:~/www/demo $ lsdemo  guestbook  manage.py  requirements.txt  venv

(3). 安装扩展库,记住在激活的环境下执行,命令行如下:

pip3 install -r requirements.txt

(4). 上传文件后把 /<项目名>/<app名>/migrations/ 下的类似00.. 的记录文件全部删除,但是不要删除别的文件。

(5). 配置 django 项目的设置,如果设置项存在便修改,不存在则添加,改动如下:

DEBUG = FalseALLOWED_HOSTS = ['192.168.1.37', '127.0.0.1', 'demo.pi.com']STATIC_ROOT = os.path.join(BASE_DIR, 'static')

ALLOWED_HOSTS:允许访问的主机,如果你想通过某个 host 访问,就将它添加到这里,假设你想通过树莓派 ip(192.168.1.37) 访问,就将 192.168.1.37 添加到这里。

STATIC_ROOT:只在部署环境下生效的配置。部署环境下,效率更高的 niginx 会根据该目录提供静态环境。

(6). 将网站生成静态文件:

python3 manage.py collectstatic

(7). 配置好上述后,便可以同步并创建数据库了,先进入项目根目录,之后执行如下命令:

python3 manage.py makemigrationspython3 manage.py migrate

(8). 建立管理员账号:

python3 manage.py createsuperuser

(9). 完成上述工作后,就可以跑一跑检查一下是否能够正常运行啦:

python manage.py runserver 0.0.0.0:8000

注:这时候打开网页会发现 css 样式都未应用,是因为静态文件已经不再是 django 管理了,之后我们会让 nginx 接管它。

uwsgi 配置

仍然是在激活的环境(source venv/bin/activate)中进行。

安装 uwsgi:

pip3 install uwsgi

注:如果安装出现错误,可以尝试先安装 python-dev 包:sudo apt-get install python-dev

配置 uwsgi,我们使用 .ini 文件配置。

新建一个 uwsgi 文件夹存放 uwsgi 相关的文件(配置、日志等),这个文件夹可以存放在任意位置,我将它放置在了 django 项目根目录下,其目录即为 /home/pi/www/uwsgi/,在文件夹下新建一个 uwsgi.ini 文件。文件内容如下:

# uwsgi使用配置文件启动[uwsgi]# 项目根目录,并非是app目录chdir=/home/pi/www/demo/# wsgi.py 的路径,demo是wsgi.py存在的目录名module=demo.wsgi:application# 指定sock的文件路径,用来与nginx通信       socket=/home/pi/www/uwsgi/uwsgi.sock# 进程个数       workers=4pidfile=/home/pi/www/uwsgi/uwsgi.pid# 指定IP端口,这里可以用来测试uwsgi与django项目之间是否准确连接。调试好后可以注释掉# 如果开启了可以不用开启nginx服务而直接通过 ip:8000       # http=192.168.1.37:8000# 这里使用上面收集的静态文件夹目录static-map=/static=/home/pi/www/demo/static# 启动uwsgi的用户名和用户组uid=pigid=root# 启用主进程master=true# 自动移除unix Socket和pid文件当服务停止的时候vacuum=true# 序列化接受的内容,如果可能的话thunder-lock=true# 启用线程enable-threads=true# 设置自中断时间harakiri=30# 设置缓冲post-buffering=4096# 设置日志目录daemonize=/home/pi/www/uwsgi/uwsgi.log

启动 uwsgi 服务:

uwsgi --ini uwsgi.ini

nginx 配置

安装 nginx:

sudo apt-get install nginx

因为我之前在树莓派上做了 dns 解析,将 pi 的 ip 地址解析到了 pi.com 这个域名上,所以我为这个项目配置的域名为 demo.pi.com,编辑 nginx 对项目的配置文件:

sudo nano /etc/nginx/sites-available/demo.pi.com

注:ctrl+o 之后回车保存,ctrl+x 退出。

文件内容如下:

server {     listen 80;     server_name demo.pi.com; #如果解析到域名便填写域名,否则填写ip地址即可    charset utf-8;    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;    error_page 404 /404.html;    error_page 500 502 503 504 /50x.html;    # 指定项目路径uwsgi    location / {        # uwsgi_params在nginx文件夹下        include /etc/nginx/uwsgi_params;         # 设置连接uWSGI超时时间        uwsgi_connect_timeout 30;         # nginx与uwsgi的通信方式,动态请求会通过sock传递给uwsgi处理        uwsgi_pass unix:/home/pi/www/uwsgi/uwsgi.sock;    }    # 这里使用上面收集的静态文件夹目录    location /static/ {      alias /home/pi/www/demo/static/;      index index.html index.htm;    }}

接下来创建一个软链接到 /etc/nginx/sites-enabled/ 目录下,使配置文件生效:

sudo ln -s /etc/nginx/sites-available/demo.pi.com /etc/nginx/sites-enabled/

重启 nginx 使其生效:

sudo nginx restart

一键重启脚本

每次网站有变动时,总要在做这么几个事,关闭原有 uwsgi 服务,启动 uwsgi 服务,重启 nginx,太繁琐,我们写个脚本搞定它,我把脚本放在了 ~/www/uwsgi/ 这个目录,方便管理。脚本名为 run.sh,内容如下:

#!/bin/shsudo killall -9 uwsgi/home/pi/www/demo/venv/bin/uwsgi --ini /home/pi/www/uwsgi/uwsgi.inisudo /etc/init.d/nginx restart

当中第三行的 uwsgi 相关路径换为你的项目对应的就 OK。

别忘了给这个文件执行权限:

chmod +x run.sh

以上完成之后,运行 ./run.sh 重启整个项目,然后在其他设备访问试试。

参考

系列说明

小无相功是小说《天龙八部》中「逍遥派」的一门内功,讲究不着形相,无迹可寻,熟悉后再了解其他武功招式便可依仗威力习得,甚至青出于蓝而胜于蓝。而树莓派形似小无相功,同具无限可能,了解一些基础便可轻松上手,去探寻其他更多未知。因此,系列以此为题,带来一系列树莓派相关的教程,同时也是对个人长期折腾树莓派以来的一个归档整理。

注:本作品采用进行许可。

转载地址:http://kqkwa.baihongyu.com/

你可能感兴趣的文章
‘char* maxn(const char**, int)’ does not match any template declaration
查看>>
打造企业级应用--邮件服务器postfix+dovecot+extmail
查看>>
微软开发者解释为什么Windows内核落后于Linux
查看>>
HP DL380G5安装Win2012后开启Hyper-V
查看>>
信息系统项目管理师系统集成项目管理工程师相关法律法规
查看>>
标准io和管道
查看>>
微会动平台免费开放多种活动场景现场抽奖功能产品助力企业市场活动
查看>>
Project:如何分析项目中的资源分配情况
查看>>
IT男的悲惨命运(自己写的连载中)2
查看>>
SQL server网络数据库的简单应用
查看>>
OpenBSD忘记root密码恢复
查看>>
jdbc报java.lang.ClassNotFoundException: com.mysql.jdbc.Drive
查看>>
从地址栏输入url到页面显示的步骤
查看>>
iOS快速集成支付宝
查看>>
深入理解编译注解(五)RetentionPolicy.SOURCE 和 RetentionPolicy.CLASS区别讨论
查看>>
nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景
查看>>
移动端 输入框 如果类型是number,用户也可以输入汉字和字母
查看>>
Security
查看>>
【排序算法】基于交换的排序算法(冒泡排序和快速排序)
查看>>
iOS 地图定位 定位
查看>>