本教程适用于以下操作系统版本
- 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://

你可以通过访问 URL http://

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

完成演示项目后,你可以在终端中按 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://
测试完成后,在终端按 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 项目的安全性。如果你有任何疑问,请在下方评论区留言。