第二篇 初步部署Django

282 阅读6分钟

「可以的话,想看看更好的自己」

下载python

Django是一个开放源代码的Web应用框架,由Python写成。本来想下载python3.6版本,没想到此Ubuntu自带了python3.8.10,通过指令python3 -V查看python版本,并通过apt install pip3 安装对应的pip。接着我就顺便安装了Python2.7, 直接apt install python2,针不戳。

然后我就发现,无法给python2安装pip,搜一下才发现,Ubuntu 20已经无法通过apt来安装python2的pip2了,只能安装python3的pip。网上有通过wget https://bootstrap.pypa.io/pip/2.7/get-pip.py python2 get-pip.py安装,但是我一直被拒绝连接,只能做罢。

幸运的是,安装python模块时,可以通过使用apt工具安装该模块的deb软件包,而且它们已经经过测试,可以在Ubuntu系统上正常工作。Python 3软件包以python3-开头,而Python 2软件包以python2-开头。

安装Django模块

Django版本与Python版本选择对应关系: LTS是长期支持(Long Term Support)的缩写,是官方长期维护的稳定版本,建议使用LTS版本

Django版本起始维护时间Python 版本
1.11(LTS)2017.4—2020.42.7、3.4、3.5、3.6、3.7 (added in 1.11.17)
2.2(LTS)2019.4—2022.43.5、3.6、3.7、3.8(在 2.2.8 中添加)、3.9(在 2.2.17 中添加)
3.2(LTS)2021.4—2024.43.6、3.7、3.8、3.9、3.10(在 3.2.9 中添加)
4.2(LTS)2023.4—2026.43.9、3.10

这里我想选择的是3.2版本。通过apt list|grep Django列出Django相关模块,太多了,不知道选啥,还是悬着通过pip安装。

1.venv创建虚拟环境

为了以后的项目不互相影响,我将使用虚拟环境。


因为我的python3.8指令不是python而是python3,以下命令全部换成python3
apt install python3.8-venv # 安装venv
python3 -m venv -h # 显示venv工具的用法
  --system-site-packages # 代表使用全局环境中的第三方库(否则虚拟环境直接是纯洁的第三方库)
  --without-pip # 代表不安装pip(一般都是要装的,所以默认就行)
python3 -m venv 安装路径 # 创建虚拟环境指令
source 安装路径/bin/activate # 激活虚拟环境
deactivate # 关闭虚拟环境

这里我切换到普通用户的家目录创建了venv_221030虚拟环境。

2.pip安装Django

激活虚拟环境后,使用pip安装。 因为pip下载是很慢的,可以使用国内的下载源,这里我使用的是豆瓣的,并且模块后面接==可以指定版本。 pip install -i https://pypi.doubanio.com/simple/ Django==3.2

安装完毕,通过pip list可以查看已经安装的模块。而退出虚拟环境后,pip list显示的是全局的,没有Django,实现项目之间互不干扰。

创建Django项目

在普通用户的家目录下:

django-admin startproject 项目名 # 创建新项目
python3 manage.py runserver 127.0.0.1:8000 # 8000端口运行程序
ctrl+c # 退出项目运行

然后访问本地8000端口网址,就可以看到:

文件作用:

manage.py:django项目的主管或入口文件,django项目启动时也是通过该入口启动(若非大佬不要动)
setting.py:全项目的配置文件,配置的参数作用范围是全局的(改动时需参考文献)
urls.py:所有地址/url/http请求和视图逻辑层具体函数的关联,定义某个url应该打开的是哪个文件
migrations文件夹:存放数据同步历史的地方(勿动)
admin.py:django自带后台数据库管理页面的控制
models.py:设置数据库表和字段的文件
test.py:django用来进行单元测试的文件
view.py:视图逻辑层 - 用来接收浏览器数据并清洗,整理后传递给业务层(若项目内没有新建业务层,则该文件默认用来接收前端数据并写后端代码)

与Nginx结合

uwsgi是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

这里需要uwsgi,pip安装一下uwsgi。

1.测试uwsgi

创建一个输出hello world的test.py测试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,可以访问本地8000号端口看到hello world:

2.在django项目内创建uwsgi配置文件

我的路径(普通用户):~/First_Django

[uwsgi]
# nginx连接时使用
socket = 127.0.0.1:8888

# 项目目录 
chdir = 路径/First_Django

# 项目中wsgi.py文件的目录
wsgi-file = 路径/First_Django/First_Django/wsgi.py
module = First_Django.wsgi
# 主进程
master = true

# 多进程&多线程
processes = 6
threads = 2

# 以守护进程的方式启动
vacuum = true

# 存储pid进程
pidfile=路径/First_Django/uwsgi.pid

# 存储log日志
daemonize=路径/First_Django/uwsgi.log

执行uwsgi --ini my_uwsgi.ini ,生成进程文件和日志文件,并导入相关配置。

注: 如果未部署nginx或者nginx服务只设置了别的,那么这里 socket = 127.0.0.1 改成 http = 192...(你的地址)

3.修改Nginx配置

在nginx文件夹下的conf文件夹下的nginx.conf

    server {
            ...

        location / {
            root   html;
            index  index.html index.htm;
            uwsgi_pass 127.0.0.1:8888; // ip addr and port is your open ip or loopback 127.0.0.1
            include uwsgi_params;
        }

由于修改了配置文件,必须进行重启nginx -s reload,或者你压根没启动,直接nginx 然后在虚拟机内直接输入127.0.0.1,出现了Django页面

4.加入地址到Django配置

虚拟机内正常了,但是我在外面window访问时(我已经在nginx配置加入的是IP地址)出现报错: 提示我未加入IP到ALLOWED_HOSTS。可以写入配置中,或者直接"*"。 路径:~/First_Django/First_Django/settings.py

ALLOWED_HOSTS = [我的IP]

但是,但是,人麻了,还是这个报错,执行nginx重启、uwsgi重新导入配置、kill杀对应进程都没有用,已经是开始掉头发了。

最后还是重启reboot,然后启动sudo nginx,进入虚拟环境启动uwsgi,然后它好了。
看来是uwsgi没重启,补充一下对应命令:

uwsgi --ini my_uwsgi.ini # 启动uwsgi
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid

并且在my_uwsgi.ini配置文件加入py-autoreload=1,无需重启,修改则生效。外瑞奈斯!

注意: uwsgi命令出现以下报错及解决办法:

No such process [core/uwsgi.c line 1693]

解决:通过 ps -ef | grep uwsgi 查到进程id(第三列),替换到 uwsgi.pid 文件内的id,重新执行命令即可。

5.Nginx开机自启

每次都要启动太麻烦了,加入自启吧。

root用户下:

使用rc.local。ubuntu18.04不再使用 inited 管理系统,改用 systemd,ubuntu20应该也是。所以没有这个文件,需要自己创建。

ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service # 建立软链接

vim /etc/systemd/system/rc-local.service # 编辑文件内容
# 添加以下三行
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

vim /etc/rc.local # 创建并编辑文件
# 以下两行
#!/bin/bash
/usr/local/nginx/sbin/nginx

# 此时rc.local没有可执行权限
chmod +x /etc/rc.local # 添加可执行权限

重启,执行ps -aux|grep nginx,存在进程。开机自启成功!

当然还有其他办法,但是以后可能加别的自启程序,直接加入rc.local可执行文件比较方便顺手。

自此,每次开机只需启动虚拟环境,并运行uwsgi就好(如果愿意,可以试试把这两玩意儿也加入开机自启)


今天又是十一点起床,十二点下床的一天。

球球别失眠了,想早睡早起,吃嘛嘛香。