本教程适用于以下操作系统版本

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)
  • Ubuntu 18.04(Bionic Beaver)
  • Ubuntu 16.04(Xenial Xerus)
  • Ubuntu 15.04(Vivid Vervet)

本页内容

  • 准备工作
  • 安装 Django:通过 Ubuntu 仓库安装 / 使用 pip 安装 / 安装开发版本
  • 创建一个示例项目
  • 测试开发服务器
  • 安装并测试 Gunicorn:使用 nohup 运行持久化 Django 服务器 / 安装 Gunicorn
  • 为 Gunicorn 创建 Socket 和服务文件
  • 安装 Nginx
  • 配置 Nginx
  • 安装 SSL
  • 结语
  • 通过 Ubuntu 仓库安装
  • 使用 pip 安装
  • 安装开发版本
  • 使用 nohup 运行持久化 Django 服务器
  • 安装 Gunicorn

Django 是一个用于开发动态网站和应用程序的 Python 框架。它遵循 MVC(Model-View-Controller,模型-视图-控制器)架构。使用 Django 可以加快开发进程,因为大部分底层任务都由它来处理。

本教程将教你如何在 Ubuntu 22.04 服务器上安装 Django 框架。你还将创建一个演示项目并对其进行测试。

准备工作

  • 一台运行 Ubuntu 22.04 的服务器。
  • 一个非 root 的 sudo 用户。
  • 确保系统所有软件包都已更新。 $ sudo apt update $ sudo apt upgrade

一台运行 Ubuntu 22.04 的服务器。

一个非 root 的 sudo 用户。

确保系统已全面更新。

$ sudo apt update 
$ sudo apt upgrade

安装 Django

有多种方法可以安装 Django。选择最适合你的方法取决于你希望如何配置开发环境以及你的需求。每种方法都有其自身的优缺点。让我们逐一了解这些方法。

通过 Ubuntu 仓库安装

安装 Django 最简单的方法是使用 Ubuntu 自带的仓库。Ubuntu 22.04 默认附带 Python 3.10。你可以使用以下命令进行验证。

$ python3 -V
Python 3.10.4

使用以下命令安装 Django。

$ sudo apt install python3-django

运行以下命令以验证安装是否成功。

$ django-admin --version
3.2.12

Ubuntu 随附的 Django 版本是当前受支持至 2024 年的 LTS(长期支持)版本。不过,它并非最新版本。如果你想安装较新的发行版,这种方法不适合你。

使用 pip 安装

这是安装 Django 最常见的方式。推荐的做法是创建一个 Python 虚拟环境。这样你可以在不影响系统的情况下安装 Python 软件包。

安装 pip 和 venv 模块。venv 用于创建 Python 虚拟环境,pip 用于安装 Python 软件包。

$ sudo apt install python3-pip python3-venv

让我们创建一个演示项目目录。

$ mkdir ~/sampleproject
$ cd ~/sampleproject

使用以下命令创建虚拟环境。将 sample_env 替换为你想要命名的虚拟环境名称。

$ python3 -m venv sample_env

这会在你的项目目录中安装一个可移植版本的 Python 和 pip。要向项目中安装任何软件包,你必须使用以下命令激活该环境。

$ source sample_env/bin/activate

你的 shell 提示符会发生变化以反映当前所处的虚拟环境。

(sample_env) navjot@django:~/sampleproject$

虚拟环境激活后,使用 pip 安装 Django。运行以下命令安装 Django。

(sample_env) $ pip install django

验证安装。

(sample_env) $ django-admin --version
4.0.5

根据你的项目需求,你可以通过以下方式安装不同版本的 Django。

(sample_env) $ pip install django==3.2.1

验证安装。

(sample_env) $ django-admin --version
3.2.1

如你所见,这种方法安装的 Django 版本比从 Ubuntu 仓库获取的版本更新。

要退出虚拟环境,运行以下命令。

(sample_env) $ deactivate

安装开发版本

你也可以使用 pip 安装 Django 的开发版本。为此,我们将从 Django 的 Github 仓库获取开发版本。

使用以下命令将仓库克隆到 ~/django-dev 目录。

$ git clone https://github.com/django/django ~/django-dev

切换到新创建的目录。

$ cd ~/django-dev

创建虚拟环境。

$ python3 -m venv dev_django_env

激活环境。

$ source dev_django_env/bin/activate

使用 pip 安装 Django。-e 选项以可编辑模式安装它,如果你是从版本控制系统安装,则需要使用该选项。

(dev_django_dev) $ pip install -e ~/django-dev

验证安装。

(dev_django_dev) $ django-admin --version
4.2.dev20220628195651

如你所见,这里的版本是最新的开发版本。Django 的开发版本不适用于生产环境。

创建一个示例项目

让我们构建一个示例 Django 项目。为示例项目创建一个目录。

$ mkdir ~/dj-sample
$ cd ~/dj-sample

创建一个 Python 虚拟环境。

$ python3 -m venv sample_proj

激活环境。

$ source sample_proj/bin/activate

安装 Django。

(sample_proj) $ pip install django

要构建项目,我们需要使用 startproject 命令。该命令会创建另一个包含以下内容的目录:

  • 一个用于管理 Django 专属任务的管理脚本 manage.py。
  • 一个与项目同名的目录,其中包含项目代码。

我们将在当前工作目录中创建项目目录。为此,请在上一条命令的末尾使用点(.)字符。

(sample_proj) $ django-admin startproject demoproject .

接下来,我们需要使用 migrate 命令迁移数据库。Django 中的迁移会将你对模型所做的更改同步到数据库结构中。Python 默认使用 SQLite 数据库。

(sample_proj) $ python manage.py migrate

你将看到如下输出。

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

接下来,创建一个管理用户以访问 Django 的管理后台界面。

(sample_proj) $ python manage.py createsuperuser

系统会提示你输入用户名、电子邮件和密码。

Username (leave blank to use 'navjot'):
Email address: 
[email protected]

Password:
Password (again):
Superuser created successfully.

测试开发服务器

现在来测试应用程序。为此,你需要修改 Django 设置中的 ALLOWED_HOSTS 指令。该指令定义了被允许访问 Django 应用程序的 IP 地址和域名列表。

使用以下命令打开设置文件。

(sample_proj) $ nano demoproject/settings.py

找到以下条目。

ALLOWED_HOSTS = []

在方括号中输入你的服务器 IP 地址。每个条目都应放在引号内,多个条目之间需用逗号分隔。输入 www.example.com 将精确匹配。而输入 .example.com 将匹配 example.com 和 www.example.com,以及 example.com 的任何其他子域名。因此,建议在域名前加一个点号,以匹配该域名及其所有子域名。

ALLOWED_HOSTS = ['<yourserver_ip_address>']

我们使用 IP 地址来匹配我们的服务器。按 Ctrl + X 保存文件,并在提示时输入 Y。

在测试开发服务器之前,你需要配置防火墙以允许 Django 工作。Django 默认使用 8000 端口。使用 UFW(Uncomplicated Firewall,简易防火墙)开放该端口。

(sample_proj) $ sudo ufw allow 8000

启动开发服务器。

(sample_proj) $ python manage.py runserver 0.0.0.0:8000

在你的浏览器中打开 URL http://:8000,你将看到如下界面。

Ubuntu 系统上 Django 框架安装配置完整教程

你可以通过访问 URL http://:8000/admin/ 进入管理后台界面,你将看到如下登录界面。

Ubuntu 系统上 Django 框架安装配置完整教程

输入之前创建的凭据登录到下所示的管理面板。

Ubuntu 系统上 Django 框架安装配置完整教程

完成演示项目后,你可以在终端中按 Ctrl + C 关闭服务器。

安装并测试 Gunicorn

使用 nohup 运行持久化 Django 服务器

到目前为止,Django 的服务还不是持久化的。要使服务持久化,有两种方法。第一种方法是使用 nohup 工具。nohup 是一个 POSIX 命令,意为“不挂断”(no hang up)。它用于执行命令,即在用户注销后也不会停止运行。

确保你已通过按 Ctrl + C 从终端退出了服务器。

运行以下命令以启动 Django 的开发服务器。

(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &

现在,你的 Django 服务器将持续运行,直到你手动终止它。该命令会返回进程 ID 并输出另一条命令。

[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C

按 Ctrl + C 退出。原来的 Django 服务器将继续运行。你可以在浏览器中打开 URL 来验证。

完成后,你需要终止该进程。nohup 命令只返回一个进程 ID。但实际上,有两个进程在运行。要查找这两个进程的 ID,运行以下命令。

(sample_proj) $ ps aux | grep manage.py
navjot     42650  3.6  1.8  47792 38168 pts/0    S    02:28   0:00 python manage.py runserver 0.0.0.0.:8000
navjot     42651  7.9  2.0 344904 41708 pts/0    Sl   02:28   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot     42657  0.0  0.1   6612  2172 pts/0    S+   02:28   0:00 grep --color=auto manage.py

如你所见,有两个进程在运行,一个 ID 为 42650,另一个 ID 为 42651。

运行以下命令,使用上面获取的进程 ID 关闭服务器。

(sample_proj) $ sudo kill -9 42650 42651

安装 Gunicorn

运行持久化 Django 服务器的第二种方法需要你安装 Gunicorn 和 Nginx 网络服务器。Gunicorn 是一个 Python WSGI HTTP 服务器。它将与 Django 应用程序交互,然后 Nginx 作为 Gunicorn 的反向代理。这种方法还有一个额外的好处,即提供使用 Nginx 所带来的安全性和性能。

安装 Gunicorn。

(sample_proj) $ pip install gunicorn

在继续之前,我们需要测试 Gunicorn 为项目提供服务的能力。运行以下命令启动 Gunicorn。

(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi

这将在 Django 运行的同一接口上启动 Gunicorn。要验证,请在浏览器中打开 URL http://:8000,你将看到相同的 Django 主页。这意味着 Gunicorn 运行正常。

测试完成后,在终端按 Ctrl + C 退出 Gunicorn。

停用虚拟环境,回到常规 shell。

(sample_proj) $ deactivate

为 Gunicorn 创建 Socket 和服务文件

第一步是创建 Gunicorn socket 文件。Gunicorn socket 将在启动时创建并监听连接。当连接发生时,系统会自动启动 Gunicorn 进程来处理它。

创建并打开 Gunicorn socket 文件进行编辑。

$ sudo nano /etc/systemd/system/gunicorn.socket

将以下代码粘贴到其中。

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

按 Ctrl + X 保存文件,并在提示时输入 Y。

接下来,创建并打开 Gunicorn 服务文件进行编辑。

$ sudo nano /etc/systemd/system/gunicorn.service

将以下代码粘贴到其中。

[Unit]
Description=django gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          demoproject.wsgi:application

[Install]
WantedBy=multi-user.target

按 Ctrl + X 保存文件,并在提示时输入 Y。将 navjot 替换为你的系统用户名。nginx 组将允许 Nginx 服务器与 Django 通信。

重新加载 systemd 守护进程以刷新 systemd 文件。

$ sudo systemctl daemon-reload

启用并启动 Gunicorn socket 文件。

$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

检查 Gunicorn socket 的状态。

$ sudo systemctl status gunicorn.socket

你将收到类似的输出。

? gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; disabled; vendor preset: enabled)
     Active: active (listening) since Thu 2022-06-30 01:43:24 UTC; 20s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Jun 30 01:43:24 django systemd[1]: Listening on gunicorn socket.

如你所检查,Gunicorn 服务仍未运行。

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ? gunicorn.socket

要测试 socket 激活机制,运行以下命令。

$ curl --unix-socket /run/gunicorn.sock localhost

你将在终端中收到 Django 主页的 HTML 输出。这也会启动 Gunicorn 为应用程序提供服务。再次检查服务状态,你将看到它现在正在运行。

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-30 01:45:09 UTC; 12s ago
TriggeredBy: ? gunicorn.socket
   Main PID: 42365 (gunicorn)
      Tasks: 4 (limit: 2241)
     Memory: 91.7M
        CPU: 1.128s
     CGroup: /system.slice/gunicorn.service
             ??42365 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42366 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42367 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42368 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application

Jun 30 01:45:09 django systemd[1]: Started django gunicorn daemon.
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Starting gunicorn 20.1.0
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Listening at: unix:/run/gunicorn.sock (42365)
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Using worker: sync
Jun 30 01:45:09 django gunicorn[42366]: [2022-06-30 01:45:09 +0000] [42366] [INFO] Booting worker with pid: 42366
.......

安装 Nginx

最后一步是安装和配置 Nginx。Ubuntu 22.04 自带较旧版本的 Nginx。你需要下载官方 Nginx 仓库以安装最新版本。

导入 Nginx 的签名密钥。

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

为 Nginx 的稳定版本添加仓库。

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

更新系统仓库。

$ sudo apt update

安装 Nginx。

$ sudo apt install nginx

验证安装。

$ nginx -v
nginx version: nginx/1.22.0

配置 Nginx

创建并打开文件 /etc/nginx/conf.d/django-gunicorn.conf 进行编辑。

$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf

将以下代码粘贴到其中。

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/navjot/dj-sample;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

将上述文件中的 root 位置替换为你的服务器上的目录。

按 Ctrl + X 保存文件,并在提示时输入 Y。

打开文件 /etc/nginx/nginx.conf 进行编辑。

$ sudo nano /etc/nginx/nginx.conf

在 include /etc/nginx/conf.d/*.conf; 这一行之前添加以下行。

server_names_hash_bucket_size  64;

按 Ctrl + X 保存文件,并在提示时输入 Y。

验证你的 Nginx 配置。

$ sudo nginx -t

如果你没有看到任何错误,说明一切正常。

你还需要将域名添加到 ALLOWED_HOSTS 指令中。打开 settings.py 文件。

$ nano ~/dj-sample/demoproject/settings.py

修改 ALLOWED_HOSTS 变量的值。

ALLOWED_HOSTS = ['<yourserver_ip_address>','django.example.com']

按 Ctrl + X 保存文件,并在提示时输入 Y。

重启 Gunicorn Socket 和服务。

$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service

启动 Nginx 服务器。

$ sudo systemctl start nginx

开放 HTTP 端口。如果你不再使用 8000 端口,也可以将其删除。

$ sudo ufw delete allow 8000
$ sudo ufw allow http

通过打开 URL http://django.example.com 进行验证,Django 主页将会加载。

安装 SSL

到目前为止,你的 Django 应用程序是通过明文 HTTP 连接提供服务的。强烈建议你通过 SSL 证书对其进行保护。为此,请使用 Certbot 工具(通过 Snapd 工具安装)。它在 Ubuntu 22.04 系统上已默认安装。

安装核心 Snapd 仓库。

$ sudo snap install core

安装 Certbot。

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

生成证书。以下命令还会自动配置 Nginx。

$ sudo certbot --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d django.example.com

首先开放 HTTPS 端口。

$ sudo ufw allow https

在浏览器中访问 URL https://django.example.com 进行确认。

结语

本教程到此结束,你学习了如何在 Ubuntu 22.04 服务器上安装 Django、Gunicorn 和 Nginx。你还安装了 SSL 证书以增强 Django 项目的安全性。如果你有任何疑问,请在下方评论区留言。