如何在 Ubuntu 22.04 上用 Postgres、Nginx 和 Gunicorn 设置 Django

介绍

Django 是一个强大的 Web 框架,可以帮助您将您的 Python 应用程序或网站从地面上获得。Django 包含一个简化开发服务器来本地测试您的代码,但对于任何与生产有关的内容,需要一个更安全、更强大的 Web 服务器。

在本指南中,您将安装并配置 Ubuntu 22.04 上的某些组件以支持和服务 Django 应用程序。您将设置一个 PostgreSQL 数据库,而不是使用默认 SQLite 数据库。您将配置 Gunicorn 应用程序服务器与您的应用程序接口。

前提和目标

要完成本指南,你应该有一个新的 Ubuntu 22.04 服务器实例,有一个基本的防火墙和一个配置了sudo特权的非根用户。

将 Django 安装在虚拟环境中,将 Django 安装到特定项目的环境中,将允许您的项目和其需求单独处理。

一旦您的数据库和应用程序启动并运行,您将安装和配置 Gunicorn 应用程序服务器. 这将作为我们的应用程序的界面,将客户端请求从 HTTP 转换为 Python 呼叫,我们的应用程序可以处理。

让我们开始吧。

从 Ubuntu 存储库中安装软件包

要开始这个过程,你会从Ubuntu存储库下载并安装你需要的所有项目,后来你会使用Python包管理器pip来安装额外的组件。

首先,您需要更新本地apt包索引,然后下载和安装包. 您安装的包取决于您的项目将使用哪个Python版本。

如果您正在使用 Django 和 Python 3,请键入:

1sudo apt update
2sudo apt install python3-venv python3-dev libpq-dev postgresql postgresql-contrib nginx curl

此命令将安装一个工具来为您的Python项目创建虚拟环境,用于后来构建Gunicorn所需的Python开发文件,Postgres数据库系统和与之交互所需的库,以及Nginx网络服务器。

创建 PostgreSQL 数据库和用户

现在你可以直接跳进来,为我们的Django应用程序创建一个数据库和数据库用户。

默认情况下,Postgres 使用一个名为对等身份验证的身份验证方案进行本地连接,这基本上意味着如果用户的操作系统用户名匹配一个有效的Postgres 用户名,则该用户可以无需进一步身份验证登录。

在 Postgres 安装过程中,创建了一个名为 postgres 的操作系统用户,以匹配 postgres 的 PostgreSQL 管理用户. 您需要使用这个用户来执行管理任务。

通过键入登录到一个互动的 Postgres 会话:

1sudo -u postgres psql

您将收到一个PostgreSQL提示,您可以设置我们的要求。

首先,为您的项目创建一个数据库:

1CREATE DATABASE myproject;

<$>[注] 注: 每个 Postgres 语句都必须以半列结束,因此,如果您遇到问题,请确保您的命令以一个结束。

接下来,为我们的项目创建一个数据库用户. 请确保选择安全密码:

1CREATE USER myprojectuser WITH PASSWORD 'password';

之后,您将更改您刚刚创建的用户的一些连接参数,从而加速数据库操作,以便每次建立连接时不需要查询和设置正确值。

您将默认的字符编码设置为UTF-8,Django 预计。您还将默认的交易隔离方案设置为读取承诺,即从未承诺的交易中读取区块。 最后,您将设置时区。 默认情况下,Django 项目将设置为使用UTC。 这些都是 [Django 项目本身]的建议(https://docs.djangoproject.com/en/3.0/ref/databases/#optimizing-postgresql-s-configuration):

1ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
2ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
3ALTER ROLE myprojectuser SET timezone TO 'UTC';

现在,您可以为新用户提供管理新数据库的访问权限:

1GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

完成后,通过键入退出 PostgreSQL 提示:

1\q

Postgres 现在已设置,以便 Django 可以连接并管理其数据库信息。

创建您的项目的Python虚拟环境

现在您已经准备好了数据库,您可以开始获得其余的项目要求,您将在虚拟环境中安装Python的要求,以便更容易管理。

首先,创建并更改到一个目录,您可以保留您的项目文件:

1mkdir ~/myprojectdir
2cd ~/myprojectdir

在项目目录中,通过键入创建一个Python虚拟环境:

1python3 -m venv myprojectenv

这将创建一个名为myprojectenv的目录在你的myprojectdir目录中。内部,它将安装一个本地版本的Python和一个本地版本的pip,以管理包。

在安装项目的 Python 要求之前,您需要激活虚拟环境,您可以通过键入:

1source myprojectenv/bin/activate

您的提示应更改,以表示您现在在Python虚拟环境中运行,它将看起来像这样: (myprojectenv)user@host:~/myprojectdir$

随着虚拟环境的启动,安装 Django、Gunicorn 和psycopg2 PostgreSQL 适配器,使用本地实例pip:

<$>[注] 注: 当虚拟环境被激活时(当您的提示有(myprojectenv)之前),使用pip而不是pip3,即使您正在使用Python 3. 虚拟环境的副本的工具总是被命名为pip,无论Python版本。

1pip install django gunicorn psycopg2-binary

您现在应该拥有启动 Django 项目所需的所有软件。

创建和配置一个新的Django项目

随着 Python 组件的安装,您现在可以创建实际的 Django 项目文件。

创建 Django 项目

因为你已经有一个项目目录,你会告诉Django在这里安装文件,它会创建一个与实际代码的第二级目录,这是正常的,并将管理脚本放入这个目录。

1django-admin startproject myproject ~/myprojectdir

在此时,您的项目目录(~/myprojectdir在本示例中)应该有以下内容:

  • ~/myprojectdir/manage.py: 一个 Django 项目管理脚本.
  • ~/myprojectdir/myproject/: 该 Django 项目包. 这应该包含 __init__.py, settings.py, urls.py, asgi.pywsgi.py 文件.
  • ~/myprojectdir/myprojectenv/: 您之前创建的虚拟环境目录.

调整项目设置

您应该做的第一件事,新创建的项目文件是调整设置. 在文本编辑器中打开设置文件:

1nano ~/myprojectdir/myproject/settings.py

首先,找出「ALLOWED_HOSTS」指令,定义了服务器的地址或域名列表,可以用来连接到Django实例,任何未列入此列表的 Host标题的输入请求都会引发例外。

在方块中,列出与您的 Django 服务器相关的 IP 地址或域名。每个项目都应该列入引文中,其中有条纹分开的条目。如果您希望对整个域和任何子域的请求,请预先预设一个时间段,以便开始输入。在下面的片段中,有几个被评论的示例用于示范:

<$>[注] 注: 请确保将localhost列为选项之一,因为您将通过本地 Nginx 实例代理连接。

1[label ~/myprojectdir/myproject/settings.py]
2. . .
3# The simplest case: just add the domain name(s) and IP addresses of your Django server
4# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
5# To respond to 'example.com' and any subdomains, start the domain with a dot
6# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
7ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']

接下来,找到配置数据库访问的部分. 它将从DATABASES开始。 文件中的配置是SQLite数据库。 您已经为我们的项目创建了一个PostgreSQL数据库,所以您需要调整设置。

用您的 PostgreSQL 数据库信息更改设置. 您告诉 Django 使用您用pip安装的psycopg2适配器. 您需要输入数据库名称、数据库用户名称、数据库用户密码,然后指定数据库位于本地计算机上。

 1[label ~/myprojectdir/myproject/settings.py]
 2. . .
 3
 4DATABASES = {
 5    'default': {
 6        'ENGINE': 'django.db.backends.postgresql_psycopg2',
 7        'NAME': 'myproject',
 8        'USER': 'myprojectuser',
 9        'PASSWORD': 'password',
10        'HOST': 'localhost',
11        'PORT': '',
12    }
13}
14
15. . .

接下来,移动到文件的底部,并添加一个设置,表示 static 文件应该放置在哪里。 这是必要的,以便 Nginx 能够处理这些项目的请求。

 1[label ~/myprojectdir/myproject/settings.py]
 2. . .
 3STATIC_URL = 'static/'
 4
 5# Default primary key field type
 6# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
 7
 8DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
 9
10import os
11STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

保存并关闭文件,当你完成。

完成初步项目设置

现在,您可以使用管理脚本将初始数据库方案迁移到我们的 PostgreSQL 数据库:

1~/myprojectdir/manage.py makemigrations
2~/myprojectdir/manage.py migrate

创建一个项目的管理用户,键入:

1~/myprojectdir/manage.py createsuperuser

您将需要选择用户名,提供电子邮件地址,并选择并确认密码。

您可以将所有静态内容收集到您通过键入配置的目录位置:

1~/myprojectdir/manage.py collectstatic

然后,静态文件将被放置在项目目录中的名为静态的目录中。

如果您遵循最初的服务器设置指南,您应该有一个 UFW 防火墙来保护您的服务器. 为了测试开发服务器,您需要允许访问您将使用的端口。

通过键入为端口 8000 创建例外:

1sudo ufw allow 8000

最后,您可以通过使用以下命令启动 Django 开发服务器来测试您的项目:

1~/myprojectdir/manage.py runserver 0.0.0.0:8000

在您的 Web 浏览器中,访问您的服务器的域名或 IP 地址,然后是 :8000:

1http://server_domain_or_IP:8000

您应该收到默认的 Django 索引页面:

Django index page

如果您在地址栏中添加/admin到URL的末尾,您将被提示使用createsuperuser命令创建的管理用户名和密码:

Django admin login

验证后,您可以访问默认的 Django admin 界面:

Django admin interface

当您完成探索时,请在终端窗口中按 CTRL-C 关闭开发服务器。

测试 Gunicorn 服务项目的能力

在离开虚拟环境之前,你需要做的最后一件事是测试Gunicorn,以确保它能为应用程序提供服务。

1cd ~/myprojectdir
2gunicorn --bind 0.0.0.0:8000 myproject.wsgi

这将启动Gunicorn在Django开发服务器正在运行的相同界面上,您可以在浏览器中重新测试应用程序。

<$>[注] 注: 管理员界面将没有应用任何的样式,因为Gunicorn不知道如何找到负责此的静态CSS内容。

您通过指定相对目录路径给 Django 的 wsgi.py 文件,这是您的应用程序的入口点,使用 Python 的模块语法。 在此文件中,定义了一个名为 application 的函数,用于与应用程序进行通信。

当您完成测试时,请在终端窗口中按 CTRL-C 以阻止 Gunicorn。

您现在已经完成了配置您的 Django 应用程序,您可以通过键入退出我们的虚拟环境:

1deactivate

提示中的虚拟环境指示器将被删除。

创建 Gunicorn 的 systemd 接口和服务文件

你已经测试了Gunicorn可以与我们的Django应用程序进行交互,但现在你应该实施一个更强大的启动和停止应用程序服务器的方式。

Gunicorn 接口将在启动时创建,并会听取连接。当发生连接时,systemd 会自动启动 Gunicorn 过程来处理连接。

首先,创建并打开有sudo特权的 Gunicorn 的 systemd 接口文件:

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

内部,您将创建一个[Unit]部分来描述插槽,一个[Socket]部分来定义插槽的位置,以及一个[Install]部分来确保插槽在正确的时间创建:

1[label /etc/systemd/system/gunicorn.socket]
2[Unit]
3Description=gunicorn socket
4
5[Socket]
6ListenStream=/run/gunicorn.sock
7
8[Install]
9WantedBy=sockets.target

保存并关闭文件,当你完成。

接下来,在文本编辑器中创建并打开一个用sudo权限的 Gunicorn 的 systemd 服务文件,该服务的文件名应该与插件文件名相匹配,除了扩展:

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

请从[单位]部分开始,该部分用于指定元数据和依赖性。 将服务的描述放到这里,并告诉 init 系统在实现网络目标后才启动此操作。

1[label /etc/systemd/system/gunicorn.service]
2[Unit]
3Description=gunicorn daemon
4Requires=gunicorn.socket
5After=network.target

接下来,您将打开[服务]部分。 指定您要处理的用户和组以运行。 您将赋予您的常规用户帐户所有权,因为它拥有所有相关文件。

然后您将绘制工作目录并指定使用的命令来启动服务. 在这种情况下,您必须指定在我们的虚拟环境中安装的Gunicorn可执行的完整路径。然后您将该过程绑定到您在/run目录中创建的Unix插件,以便该过程可以与Nginx进行通信。您将所有数据登录到标准输出,以便journald过程可以收集Gunicorn日志。

 1[label /etc/systemd/system/gunicorn.service]
 2[Unit]
 3Description=gunicorn daemon
 4Requires=gunicorn.socket
 5After=network.target
 6
 7[Service]
 8User=sammy
 9Group=www-data
10WorkingDirectory=/home/sammy/myprojectdir
11ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
12          --access-logfile - \
13          --workers 3 \
14          --bind unix:/run/gunicorn.sock \
15          myproject.wsgi:application

最后,您将添加一个[安装]部分,这将告诉系统d如果您允许该服务在启动时启动,该服务将链接到什么。

 1[label /etc/systemd/system/gunicorn.service]
 2[Unit]
 3Description=gunicorn daemon
 4Requires=gunicorn.socket
 5After=network.target
 6
 7[Service]
 8User=sammy
 9Group=www-data
10WorkingDirectory=/home/sammy/myprojectdir
11ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
12          --access-logfile - \
13          --workers 3 \
14          --bind unix:/run/gunicorn.sock \
15          myproject.wsgi:application
16
17[Install]
18WantedBy=multi-user.target

这样,你的 systemd 服务文件就完成了. 现在保存并关闭它。

您现在可以启动并启用 Gunicorn 接口,这将创建在 /run/gunicorn.sock’ 和启动时的接口文件,当连接到该接口时,systemd 将自动启动 gunicorn.service’ 来处理它:

1sudo systemctl start gunicorn.socket
2sudo systemctl enable gunicorn.socket

您可以通过检查插件文件来确认操作成功。

查找 Gunicorn Socket 文件

检查过程的状态,看看它是否能够开始:

1sudo systemctl status gunicorn.socket

你应该得到这样的输出:

1[secondary_label Output]
2 gunicorn.socket - gunicorn socket
3     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: enabled)
4     Active: active (listening) since Mon 2022-04-18 17:53:25 UTC; 5s ago
5   Triggers:  gunicorn.service
6     Listen: /run/gunicorn.sock (Stream)
7     CGroup: /system.slice/gunicorn.socket
8
9Apr 18 17:53:25 django systemd[1]: Listening on gunicorn socket.

接下来,检查在/run目录中是否存在gunicorn.sock文件:

1file /run/gunicorn.sock
1[secondary_label Output]
2/run/gunicorn.sock: socket

如果systemctl status命令显示出现错误,或者您在目录中找不到gunicorn.sock文件,则表明Gunicorn插件无法正确创建。

1sudo journalctl -u gunicorn.socket

再看看您的 /etc/systemd/system/gunicorn.socket 文件,在继续之前修复任何问题。

测试 Socket 激活

目前,如果您刚刚启动了gunicorn.socket单元,则gunicorn.service将不会活跃,因为插件尚未接收任何连接。

1sudo systemctl status gunicorn
1[secondary_label Output]
2 gunicorn.service - gunicorn daemon
3     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
4     Active: inactive (dead)
5TriggeredBy:  gunicorn.socket

要测试插槽激活机制,您可以通过键入弯曲发送连接到插槽:

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

您应该从终端中收到您的应用程序的HTML输出。这表明Gunicorn已经启动并能够服务您的Django应用程序。您可以通过键入来验证Gunicorn服务正在运行:

1sudo systemctl status gunicorn
 1[secondary_label Output]
 2 gunicorn.service - gunicorn daemon
 3     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
 4     Active: active (running) since Mon 2022-04-18 17:54:49 UTC; 5s ago
 5TriggeredBy:  gunicorn.socket
 6   Main PID: 102674 (gunicorn)
 7      Tasks: 4 (limit: 4665)
 8     Memory: 94.2M
 9        CPU: 885ms
10     CGroup: /system.slice/gunicorn.service
11             ├─102674 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
12             ├─102675 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
13             ├─102676 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
14             └─102677 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
15
16Apr 18 17:54:49 django systemd[1]: Started gunicorn daemon.
17Apr 18 17:54:49 django gunicorn[102674]: [2022-04-18 17:54:49 +0000] [102674] [INFO] Starting gunicorn 20.1.0
18Apr 18 17:54:49 django gunicorn[102674]: [2022-04-18 17:54:49 +0000] [102674] [INFO] Listening at: unix:/run/gunicorn.sock (102674)
19Apr 18 17:54:49 django gunicorn[102674]: [2022-04-18 17:54:49 +0000] [102674] [INFO] Using worker: sync
20Apr 18 17:54:49 django gunicorn[102675]: [2022-04-18 17:54:49 +0000] [102675] [INFO] Booting worker with pid: 102675
21Apr 18 17:54:49 django gunicorn[102676]: [2022-04-18 17:54:49 +0000] [102676] [INFO] Booting worker with pid: 102676
22Apr 18 17:54:50 django gunicorn[102677]: [2022-04-18 17:54:50 +0000] [102677] [INFO] Booting worker with pid: 102677
23Apr 18 17:54:50 django gunicorn[102675]:  - - [18/Apr/2022:17:54:50 +0000] "GET / HTTP/1.1" 200 10697 "-" "curl/7.81.0"

如果从弯曲的输出或systemctl 状态的输出表明出现问题,请检查日志以获取更多细节:

1sudo journalctl -u gunicorn

如果您对 /etc/systemd/systemd/system/gunicorn.service 文件进行更改,请重新加载 DAEMON 来重新读取服务定义,并通过键入重新启动 Gunicorn 过程:

1sudo systemctl daemon-reload
2sudo systemctl restart gunicorn

确保您在继续之前解决上述问题。

配置 Nginx 到 Proxy Pass 到 Gunicorn

现在Gunicorn已设置,您需要配置 Nginx 来将流量传输到进程中。

首先,在 Nginx 的可用站点目录中创建并打开一个新的服务器块:

1sudo nano /etc/nginx/sites-available/myproject

在内部,打开一个新的服务器块. 您将通过指定该块应该听到正常端口80并应响应您的服务器的域名或IP地址开始:

1[label /etc/nginx/sites-available/myproject]
2server {
3    listen 80;
4    server_name server_domain_or_IP;
5}

接下来,你会告诉 Nginx 忽略找到 favicon 的任何问题,你还会告诉它在你的 ~/myprojectdir/static 目录中收集的静态资产在哪里找到。

 1[label /etc/nginx/sites-available/myproject]
 2server {
 3    listen 80;
 4    server_name server_domain_or_IP;
 5
 6    location = /favicon.ico { access_log off; log_not_found off; }
 7    location /static/ {
 8        root /home/sammy/myprojectdir;
 9    }
10}

最后,创建一个位置 / {}块来匹配所有其他请求. 在这个位置内,您将包括标准的proxy_params文件,包括在 Nginx 安装中,然后将流量直接传输到 Gunicorn 接口:

 1[label /etc/nginx/sites-available/myproject]
 2server {
 3    listen 80;
 4    server_name server_domain_or_IP;
 5
 6    location = /favicon.ico { access_log off; log_not_found off; }
 7    location /static/ {
 8        root /home/sammy/myprojectdir;
 9    }
10
11    location / {
12        include proxy_params;
13        proxy_pass http://unix:/run/gunicorn.sock;
14    }
15}

完成后保存并关闭该文件. 现在,您可以通过链接到网站启用目录来启用该文件:

1sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

通过键入测试您的 Nginx 配置以检测语法错误:

1sudo nginx -t

如果没有报告错误,请继续通过键入重新启动 Nginx:

1sudo systemctl restart nginx

最后,您需要打开防火墙,以便在端口上正常流量 80. 由于您不再需要访问开发服务器,您也可以删除打开端口 8000 的规则:

1sudo ufw delete allow 8000
2sudo ufw allow 'Nginx Full'

您现在应该能够访问您的服务器的域或IP地址来查看您的应用程序。

<$>[注] 注: 配置 Nginx 后,下一步应该是通过 SSL/TLS 确保到服务器的流量,因为没有它,所有信息,包括密码,都通过网络以简单的文本发送。

如果您有域名,获取 SSL 证书以保护您的流量最简单的方法是使用 Let's Encrypt. 遵循 此指南在 Ubuntu 22.04 上设置 Let's Encrypt with Nginx。

解决问题 Nginx 和 Gunicorn

如果此最后一步未显示您的应用程序,则需要解决安装问题。

Nginx将显示默认页面而不是Django应用程序

如果 Nginx 显示默认页面而不是向您的应用程序代理,这通常意味着您需要在 /etc/nginx/sites-available/myproject’ 文件中调整 server_name` 以指向您的服务器的 IP 地址或域名。

Nginx 使用「server_name」来确定使用哪个服务器块来响应请求. 如果您收到默认的 Nginx 页面,这是一个迹象,表明 Nginx 无法明确匹配请求的 sever 区块,因此它会返回在 `/etc/nginx/sites-available/default 中定义的默认区块。

项目服务器块中的server_name必须比要选择的默认服务器块中的server_name更为具体。

Nginx 顯示 502 Bad Gateway 錯誤,而不是 Django 應用程式

502 错误表明 Nginx 无法成功代理请求. 各种配置问题以 502 错误表达,因此需要更多信息才能正确解决问题。

寻找更多信息的主要场所是在 Nginx 的错误日志中。 一般来说,这会告诉您在代理事件期间引起的问题的条件。

1sudo tail -F /var/log/nginx/error.log

现在,请在浏览器中提出另一个请求,以生成新错误(尝试刷新页面)。

你可能會收到以下訊息:

connect() 到 unix:/run/gunicorn.sock 失败了(2:没有此类文件或目录)

這表明 Nginx 無法在該位置找到「gunicorn.sock」檔案,您應該將在「/etc/nginx/sites-available/myproject」檔案中定義的「proxy_pass」位置與「gunicorn.sock」檔案的實際位置進行比較,而該檔案是由「gunicorn.socket」 systemd 單位生成的。

如果您无法在/run目录中找到一个gunicorn.sock文件,这通常意味着 systemd 接口文件无法创建它. 返回检查 Gunicorn 接口文件部分(#checking-for-the-gunicorn-socket-file)以完成 Gunicorn 的故障排除步骤。

connect() 到 unix:/run/gunicorn.sock 失败了(13:允许被拒绝)

这表明 Nginx 由于权限问题无法连接到 Gunicorn 接口,这可能发生在使用 root 用户而不是 sudo 用户时。

如果在 root 目录 (/) 和 'gunicorn.sock' 文件之间有有限的权限,则会发生这种情况,您可以通过将对您的 socket 文件的绝对路径转移到 'namei' 命令来查看 socket 文件及其每个母目录的权限和所有权值:

1namei -l /run/gunicorn.sock
1[secondary_label Output]
2f: /run/gunicorn.sock
3drwxr-xr-x root root /
4drwxr-xr-x root root run
5srw-rw-rw- root root gunicorn.sock

输出显示了每个目录组件的权限. 通过查看权限(第一列),所有者(第二列)和组所有者(第三列),您可以确定允许对插件文件的访问类型。

在上面的示例中,接口文件和导致接口文件的每个目录都有世界读取和执行权限(目录的权限列以r-x而不是---结束)。

如果连接到连接器的任何目录都没有世界读取和执行权限,那么 Nginx 将无法访问连接器,而不允许世界读取和执行权限,或者确保组所有权被赋予 Nginx 是组的一部分。

Django表示:无法连接到服务器:连接被拒绝

在 Web 浏览器中尝试访问应用程序的部分时,您可能收到 Django 的一个信息是:

1OperationalError at /admin/login/
2could not connect to server: Connection refused
3    Is the server running on host "localhost" (127.0.0.1) and accepting
4    TCP/IP connections on port 5432?

这表明 Django 无法连接到 Postgres 数据库,请通过键入确保 Postgres 实例正在运行:

1sudo systemctl status postgresql

如果不是,你可以启动它,并允许它在启动时自动启动(如果它尚未配置以这样做),键入:

1sudo systemctl start postgresql
2sudo systemctl enable postgresql

如果您仍然遇到问题,请确保在 ~/myprojectdir/myproject/settings.py 文件中定义的数据库设置正确。

进一步麻烦解决

为了进一步解决问题,日志可以帮助缩小根源原因,反过来检查每个原因,并寻找指示问题区域的消息。

以下日志可能有用:

  • 通过键入检查 Nginx 进程日志: sudo journalctl -u nginx
  • 通过键入检查 Nginx 访问日志: sudo less /var/log/nginx/access.log
  • 通过键入检查 Nginx 错误日志: sudo less /var/log/nginx/error.log
  • 通过键入检查 Gunicorn 应用日志: sudo journalctl -u gunicorn
  • 通过键入检查 Gunicorn 插槽日志: sudo journalctl -u gunicorn.socket

当您更新配置或应用程序时,您可能需要重新启动流程以适应您的更改。

如果您更新您的 Django 应用程序,您可以重新启动 Gunicorn 流程以通过键入获取更改:

1sudo systemctl restart gunicorn

如果您更改 Gunicorn 插槽或服务文件,请重新加载 DAEMON 并通过键入重新启动过程:

1sudo systemctl daemon-reload
2sudo systemctl restart gunicorn.socket gunicorn.service

如果您更改了 Nginx 服务器块配置,请测试配置,然后通过键入 Nginx:

1sudo nginx -t && sudo systemctl restart nginx

这些命令有助于在调整配置时获取更改。

结论

在本指南中,您将 Django 项目设置为自己的虚拟环境,您将 Gunicorn 配置为翻译客户端请求,以便 Django 能够处理这些请求,随后,您将 Nginx 设置为反向代理,以处理客户端连接并根据客户端请求服务正确的项目。

Django 通过提供许多常见元素来简化项目和应用程序的创建,使您能够专注于独特的元素,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。

Published At
Categories with 技术
comments powered by Disqus