如何在 Debian 11 上使用 Postgres、Nginx 和 Gunicorn 设置 Django

介绍

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

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

前提和目标

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

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

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

让我们开始吧。

从 Debian 存储库中安装包

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

首先,您需要更新本地apt包索引,然后下载和安装包。

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/: 您之前创建的虚拟环境目录.

调整项目设置

您应该做的第一件事是调整您新创建的项目文件的设置. 使用nano或您最喜欢的文本编辑器打开设置文件:

1nano ~/myprojectdir/myproject/settings.py

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

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

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

1[label ~/myprojectdir/myproject/settings.py]
2. . .
3ALLOWED_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/')

完成后保存并关闭文件. 如果您正在使用nano,请按Ctrl+X,然后在提示时按Y,然后按Enter

完成初步项目设置

现在,您可以使用管理脚本将初始数据库方案迁移到我们的 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 Thu 2022-08-04 19:02:54 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 Thu 2022-08-04 19:03:51 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。 遵循此指南(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-11)在Debian 11上设置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