如何在 Ubuntu 18.04 上使用 Postgres、Nginx 和 Gunicorn 设置 Django
介绍
Django 是一个功能强大的 Web 框架,可以帮助您启动 Python 应用程序或网站。 Django 包括一个简化的开发服务器,用于在本地测试您的代码。如果您更喜欢任何与生产相关的东西,即使是与生产相关的东西,也推荐使用更安全、功能更强大的 Web 服务器。
在本教程中,您将在 Ubuntu 18.04 上安装和配置一些组件以支持和服务 Django 应用程序,设置 PostgreSQL 数据库而不是使用默认的 SQLite 数据库,然后配置 Gunicorn 应用程序服务器以与您的应用程序交互。最后,您将设置 Nginx 以反向代理 Gunicorn,让您可以访问其安全和性能功能来为您的应用程序提供服务。
先决条件
要完成本教程,您需要设置 Ubuntu 18.04 服务器、配置了 sudo
权限的非根用户,并启用了防火墙。按照我们的 Ubuntu 18.04 初始服务器设置指南开始。
第 1 步 — 从 Ubuntu 存储库安装软件包
首先从 Ubuntu 存储库下载并安装您需要的所有项目。稍后使用 Python 包管理器 pip
安装其他组件。
首先,更新本地 apt
包索引,然后下载并安装包:
- sudo apt update
接下来,安装您的软件包。这取决于您的项目将使用哪个版本的 Python。
如果您将 Django 与 Python 3 一起使用,请运行以下命令:
- sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
Django 1.11 是最后一个支持 Python 2 的 Django 版本。如果您是开始新项目,强烈建议您选择 Python 3。如果您仍需要使用 Python 2,请运行以下命令:
- sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl
这将安装 pip
、稍后构建 Gunicorn 所需的 Python 开发文件、Postgres 数据库系统和与之交互所需的库,以及 Nginx Web 服务器。
第 2 步 — 创建 PostgreSQL 数据库和用户
在此步骤中,您将使用 PostgreSQL(也称为“Postgres”)为您的 Django 应用程序创建数据库和数据库用户。
默认情况下,Postgres 使用名为对等身份验证 的身份验证方案进行本地连接。这意味着如果用户的操作系统用户名与有效的 Postgres 用户名匹配,则该用户无需进一步身份验证即可登录。
在 Postgres 安装期间,创建了一个名为 postgres
的操作系统用户,以对应于 postgres
PostgreSQL 管理用户。您需要使用此用户来执行管理任务。使用 sudo
登录到交互式 Postgres 会话,并使用 -u
选项传入用户名:
- sudo -u postgres psql
您将收到一个 PostgreSQL 提示,您可以在其中设置您的要求。首先,为您的项目创建一个数据库:
- CREATE DATABASE myproject;
注意:每个 Postgres 语句都必须以分号结尾。如果您遇到问题,请确保您的命令以 1 结尾。
接下来,为您的项目创建一个数据库用户并选择一个安全密码:
- CREATE USER myprojectuser WITH PASSWORD 'password';
OutputCREATE ROLE
之后,为您创建的用户修改一些连接参数。这将加快数据库操作,这样就不必在每次建立连接时都查询和设置正确的值。
将默认编码设置为 Django 期望的 UTF-8
:
- ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
OutputALTER ROLE
然后将默认事务隔离方案设置为 read committed
以阻止未提交事务的读取:
- ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
OutputALTER ROLE
由于您的 Django 项目将默认设置为使用 UTC
,因此请设置相关时区:
- ALTER ROLE myprojectuser SET timezone TO 'UTC';
OutputALTER ROLE
这些都是 Django 项目的推荐。
现在给你的新用户访问权限来管理你的新数据库:
- GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
OutputGRANT
完成后,通过运行以下命令退出 PostgreSQL 提示符:
- \q
Postgres 现已成功设置,Django 可以连接并管理其数据库信息。
第 3 步 — 为您的项目创建 Python 虚拟环境
现在您已经有了数据库,您可以开始准备其余的项目需求了。这需要在虚拟环境中安装您的 Python 要求,以实现更高效的管理。将 Django 安装到特定于您的项目的虚拟环境中,将允许您的项目及其需求单独处理。
为此,您需要访问 virtualenv
命令。首先使用 pip
安装它。
如果您使用的是 Python 3,请升级 pip
:
- sudo -H pip3 install --upgrade pip
然后安装包:
- sudo -H pip3 install virtualenv
如果您使用的是 Python 2,请升级 pip
:
- sudo -H pip install --upgrade pip
然后安装包:
- sudo -H pip install virtualenv
安装 virtualenv
后,您就可以开始构建您的项目了。首先创建可以保存项目文件的目录。这里我们将其命名为 myprojectdir
,您可以随意命名它:
- mkdir ~/myprojectdir
接下来进入该目录:
- cd ~/myprojectdir
在项目目录中,创建一个 Python 虚拟环境:
- virtualenv myprojectenv
这将在您的 myprojectdir
目录中创建一个名为 myprojectenv
的目录。在内部,它将安装一个本地版本的 Python 和一个本地版本的 pip
。您可以使用它为您的项目安装和配置一个独立的 Python 环境。
但在安装项目的 Python 要求之前,您需要激活虚拟环境:
- source myprojectenv/bin/activate
您的提示应更改为表明您现在正在 Python 虚拟环境中操作。它将类似于以下内容:(myprojectenv)user@host:~/myprojectdir$
。
在虚拟环境处于活动状态的情况下,使用 pip
的本地实例安装 Django、Gunicorn 和 psycopg2
PostgreSQL 适配器:
注意:当虚拟环境被激活时(当你的提示符前面有 (myprojectenv)
时),使用 pip
而不是 pip3
,即使你正在使用 Python 3。无论 Python 版本如何,该工具的虚拟环境副本始终命名为 pip
。
- pip install django gunicorn psycopg2-binary
现在您拥有启动 Django 项目所需的所有软件。
第 4 步 — 创建和配置新的 Django 项目
安装 Python 组件后,现在您可以创建实际的 Django 项目文件。因为你已经有一个项目目录,告诉 Django 在这里安装文件。它会创建一个带有实际代码的二级目录,这是正常的,并在该目录下放置一个管理脚本。这很重要,因为您是在显式定义目录,而不是让 Django 相对于当前目录做出决定:
- django-admin.py startproject myproject ~/myprojectdir
此时,您的项目目录(在本例中为 ~/myprojectdir
)将具有以下内容:
~/myprojectdir/manage.py
:一个Django项目管理脚本。~/myprojectdir/myproject/
:Django项目包。这将包含__init__.py
、settings.py
、urls.py
和wsgi.py
文件。~/myprojectdir/myprojectenv/
:您之前创建的虚拟环境目录。
对新创建的项目文件要做的下一件事是调整设置。在您喜欢的文本编辑器中打开设置文件。这里我们将使用 nano
:
- nano ~/myprojectdir/myproject/settings.py
首先找到 ALLOWED_HOSTS
指令。这定义了可用于连接到 Django 实例的服务器地址或域名列表。任何带有不在此列表中的 Host 标头的传入请求都将引发异常。 Django 要求您设置此项以防止某类安全漏洞。
在方括号中,列出与您的 Django 服务器关联的 IP 地址或域名。每一项都应在引号中列出,条目之间以逗号分隔。如果您更喜欢对整个域和任何子域的请求,请在条目的开头添加一个句点。在以下代码片段中,有一些用于演示的注释掉的示例:
注意:请务必将 localhost
作为选项之一,因为您将通过本地 Nginx 实例代理连接。
. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']
接下来,找到配置数据库访问的部分。它将以 DATABASES
开头。文件中的配置适用于 SQLite 数据库。由于您已经为您的项目创建了一个 PostgreSQL 数据库,因此您需要调整这些设置。
使用您的 PostgreSQL 数据库信息更新设置。然后告诉 Django 使用你用 pip
安装的 psycopg2
适配器。您还需要提供数据库名称,刚刚创建的数据库用户的用户名,数据库用户的密码,并指定可以在本地计算机上找到该数据库。您可以将 PORT
设置保留为空字符串:
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
接下来,转到文件末尾并添加一个设置,指示应放置静态文件的位置。这是必要的,以便 Nginx 可以处理对这些项目的请求。以下行告诉 Django 将它们放在基础项目目录中名为 static
的目录中:
. . .
STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
完成后保存并关闭文件。如果您使用的是 nano
,则可以通过按 CTRL + X
然后按 Y
和 ENTER
来执行此操作。
第 5 步 — 完成初始项目设置
下一步将使用以下管理脚本将初始数据库架构迁移到您的 PostgreSQL 数据库:
- ~/myprojectdir/manage.py makemigrations
- ~/myprojectdir/manage.py migrate
为项目创建一个管理用户:
- ~/myprojectdir/manage.py createsuperuser
您必须选择一个用户名,提供一个电子邮件地址,然后选择然后确认密码。
通过运行以下命令将所有静态内容收集到您配置的目录位置:
- ~/myprojectdir/manage.py collectstatic
然后静态文件将被放置在项目目录中名为 static
的目录中。
如果您遵循初始服务器设置指南,您应该有一个 UFW 防火墙来保护您的服务器。为了测试开发服务器,您必须允许访问您将使用的端口。在这种情况下,为端口 8000
创建一个例外:
- sudo ufw allow 8000
最后,通过使用以下命令启动 Django 开发服务器来测试您的项目:
- ~/myprojectdir/manage.py runserver 0.0.0.0:8000
在您的网络浏览器中,访问您服务器的域名或 IP 地址,后跟 :8000
:
http://server_domain_or_IP:8000
您应该会收到以下默认的 Django 索引页面:

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

通过身份验证后,您可以访问默认的 Django 管理界面:

完成探索后,在终端窗口中按 CTRL + C
关闭开发服务器。
第 6 步——测试 Gunicorn 为项目服务的能力
在离开虚拟环境之前,测试 Gunicorn 以确保它可以为应用程序提供服务。您可以通过首先进入您的项目目录来执行此操作:
- cd ~/myprojectdir
然后运行gunicorn
加载项目的WSGI模块:
- gunicorn --bind 0.0.0.0:8000 myproject.wsgi
这将在运行 Django 开发服务器的同一界面上启动 Gunicorn。您可以返回并再次测试该应用程序。
注意:管理界面不会应用任何样式,因为 Gunicorn 不知道如何找到负责此的静态 CSS 内容。
回顾一下,您通过指定 Django 的 wsgi.py
文件的相对目录路径向 Gunicorn 传递了一个模块,该文件是您的应用程序的入口点,使用 Python 的模块语法。 Gunicorn 充当您的应用程序的接口,将客户端请求从 HTTP 转换为您的应用程序可以处理的 Python 调用。在该文件中,定义了一个名为 application
的函数,用于与应用程序通信。如果您有兴趣,可以了解更多有关 WSGI 规范的信息。
完成测试后,在终端窗口中按 CTRL + C
停止 Gunicorn。
现在您已经完成了 Django 应用程序的配置,可以停用您的虚拟环境:
- deactivate
提示中的虚拟环境指示器将被删除。
第 7 步 — 为 Gunicorn 创建 systemd 套接字和服务文件
现在您已经测试了 Gunicorn 可以与您的 Django 应用程序交互,您应该实现一种更健壮的方式来启动和停止应用程序服务器。为此,您将创建 systemd 服务和套接字文件。
Gunicorn 套接字将在启动时创建并监听连接。当有连接发生时,systemd 会自动启动 Gunicorn 进程来处理连接。
首先在您首选的文本编辑器中使用 sudo
权限为 Gunicorn 创建并打开一个 systemd 套接字文件:
- sudo nano /etc/systemd/system/gunicorn.socket
在内部,创建一个 [Unit]
部分来描述套接字,一个 [Socket]
部分来定义套接字位置,以及一个 [Install]
部分以确保在正确的时间创建套接字:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
完成后保存并关闭文件。
接下来,在您首选的文本编辑器中使用 sudo
权限为 Gunicorn 创建并打开一个 systemd 服务文件。服务文件名应与套接字文件名匹配,但扩展名除外:
- sudo nano /etc/systemd/system/gunicorn.service
从 [Unit]
部分开始,该部分用于指定元数据和依赖项。在此处添加您的服务描述,并告诉 init 系统仅在达到网络目标后才启动此服务。因为您的服务依赖于套接字文件中的套接字,所以您需要包含一个 Requires
指令来指示该关系:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
接下来,添加一个 [Service]
部分并指定您希望进程在其下运行的用户和组。提供您对该流程的普通用户帐户所有权,因为它拥有所有相关文件。然后将组所有权赋予 www-data 组,以便 Nginx 可以与 Gunicorn 进行通信。
之后,映射出工作目录并指定要运行的命令以启动服务。在这种情况下,请指定安装在您的虚拟环境中的 Gunicorn 可执行文件的完整路径。然后将该进程绑定到您在 /run
目录中创建的 Unix 套接字,以便该进程可以与 Nginx 通信。将所有数据记录到标准输出,以便 journald
进程可以收集 Gunicorn 日志。您还可以在此处指定任何可选的 Gunicorn 调整。对于我们的示例,我们指定了 3 个工作进程:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
最后,添加一个 [Install]
部分。如果您允许它在引导时启动,这将告诉 systemd 将此服务链接到什么。您希望此服务在常规多用户系统启动并运行时启动:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
这样,您的 systemd 服务文件就完成了。现在保存并关闭文件。
接下来,启动 Gunicorn 套接字。这将在 /run/gunicorn.sock
现在和启动时创建套接字文件:
- sudo systemctl start gunicorn.socket
然后启用它,以便在与该套接字建立连接时,systemd 将自动启动 gunicorn.service
来处理它:
- sudo systemctl enable gunicorn.socket
您可以通过检查套接字文件来确认操作是否成功。
第 8 步 — 检查 Gunicorn 套接字文件
检查进程的状态以确定它是否能够启动:
- sudo systemctl status gunicorn.socket
Output● gunicorn.socket - gunicorn socket
Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese>
Active: active (listening) since Thu 2021-12-02 19:58:48 UTC; 14s ago
Triggers: ● gunicorn.service
Listen: /run/gunicorn.sock (Stream)
Tasks: 0 (limit: 1136)
Memory: 0B
CGroup: /system.slice/gunicorn.socket
Dec 02 19:58:48 gunicorn systemd[1]: Listening on gunicorn socket.
接下来,检查 /run
目录中是否存在 gunicorn.sock
文件:
- file /run/gunicorn.sock
Output/run/gunicorn.sock: socket
如果 systemctl status
命令指示发生错误,或者如果您在目录中找不到 gunicorn.sock
文件,则表示 Gunicorn 套接字未正确创建.通过运行以下命令检查 Gunicorn 套接字的日志:
- sudo journalctl -u gunicorn.socket
在继续之前检查您的 /etc/systemd/system/gunicorn.socket
文件以解决任何问题。
第 9 步 — 测试套接字激活
如果您只启动了 gunicorn.socket
单元,gunicorn.service
将不会激活,因为套接字尚未收到任何连接。检查状态:
- sudo systemctl status gunicorn
Output● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: inactive (dead)
要测试套接字激活机制,请通过 curl
向套接字发送连接:
- curl --unix-socket /run/gunicorn.sock localhost
您应该在终端中收到应用程序的 HTML 输出。这确认 Gunicorn 已启动并能够为您的 Django 应用程序提供服务。您可以通过再次检查状态来验证 Gunicorn 服务是否正在运行:
- sudo systemctl status gunicorn
Output● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset
Active: active (running) since Tue 2021-11-23 22:55:12 UTC; 11s ago
Main PID: 11002 (gunicorn)
Tasks: 4 (limit: 1151)
CGroup: /system.slice/gunicorn.service
├─11002 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/
├─11018 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/
├─11020 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/
└─11022 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/
. . .
如果 curl
的输出或 systemctl status
的输出指示出现问题,请检查日志以获取更多详细信息:
- sudo journalctl -u gunicorn
检查您的 /etc/systemd/system/gunicorn.service
文件是否存在问题。如果您更改了 /etc/systemd/system/gunicorn.service
文件,请重新加载守护进程以重新读取服务定义:
- sudo systemctl daemon-reload
然后重启Gunicorn进程:
- sudo systemctl restart gunicorn
如果出现诸如此类的任何问题,请在继续之前解决这些问题。
第 10 步 — 配置 Nginx 以代理传递给 Gunicorn
现在 Gunicorn 已设置,接下来您将配置 Nginx 以将流量传递给该进程。
首先在 Nginx 的 sites-available
目录中创建并打开一个新的服务器块:
- sudo nano /etc/nginx/sites-available/myproject
在里面,打开一个新的服务器块。首先指定此块应在普通端口 80
上侦听,并且它应响应您服务器的域名或 IP 地址:
server {
listen 80;
server_name server_domain_or_IP;
}
接下来,指示 Nginx 忽略查找图标的任何问题。此外,告诉它在哪里可以找到您在 ~/myprojectdir/static
目录中收集的静态资产。所有这些文件都有一个标准的 URI 前缀 /static
,因此您可以创建一个位置块来匹配这些请求:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}
}
最后,创建一个 location/{}
块来匹配所有其他请求。在此位置中,包含来自 Nginx 安装的标准 proxy_params
文件,然后将流量直接传递到 Gunicorn 套接字:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
完成后保存并关闭文件。现在,您可以通过将文件链接到 sites-enabled
目录来启用该文件:
- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
测试您的 Nginx 配置是否存在语法错误:
- sudo nginx -t
如果没有报错,继续并重启 Nginx:
- sudo systemctl restart nginx
由于您不再需要访问开发服务器,因此通过删除打开端口 8000
的规则来调整您的防火墙设置:
- sudo ufw delete allow 8000
然后允许端口 80
和 443
上的正常流量——从而分别允许 HTTP 和 HTTPS 连接——使用以下命令:
- sudo ufw allow 'Nginx Full'
您现在应该能够转到服务器的域或 IP 地址来查看您的应用程序。
注意:配置 Nginx 后,下一步应该是使用 SSL/TLS 保护到服务器的流量。这很重要,因为没有它,所有信息(包括密码)都将以纯文本形式通过网络发送。
如果您有域名,获取 SSL 证书以保护您的流量的最快方法是使用 Let's Encrypt。您可以按照我们关于如何在 Ubuntu 18.04 上使用 Nginx 保护 Let's Encrypt 的指南进行设置。按照指南使用您在本指南中创建的 Nginx 服务器块。
如果您没有域名,您仍然可以使用自签名 SSL 证书保护您的站点以进行测试和学习。同样,使用您在本教程中创建的 Nginx 服务器块执行该过程。
第 11 步 — Nginx 和 Gunicorn 故障排除
如果您的应用程序遇到问题,以下部分提供了有关如何对安装进行故障排除的指导。
Nginx 显示默认页面而不是 Django 应用程序
如果 Nginx 显示默认页面而不是代理到您的应用程序,这通常意味着您需要调整 /etc/nginx/sites-available/myproject中的
文件指向你服务器的IP地址或域名。server_name
mark>
Nginx 使用 server_name
指令来确定使用哪个服务器块来响应请求。如果您正在获取默认的 Nginx 页面,则表明 Nginx 无法将请求显式匹配到服务器块,因此它会返回到 /etc/nginx/sites-available 中定义的默认块/默认
。
项目服务器块中的 server_name
必须比要选择的默认服务器块中的服务器名称更具体。
Nginx 显示 502 Bad Gateway 错误而不是 Django 应用程序
502 错误表示 Nginx 无法成功代理该请求。范围广泛的配置问题会以 502 错误表示,因此需要更多信息才能正确排除故障。
查找更多信息的主要位置是 Nginx 的错误日志。通常,这会告诉您在代理事件期间是什么情况导致了问题。通过运行以下命令检查 Nginx 错误日志:
- sudo 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 套接字文件的部分,以完成 Gunicorn 的故障排除步骤。
另一条消息可能如下所示:
connect() 到 unix:/run/gunicorn.sock 失败(13:权限被拒绝)
这表明 Nginx 由于权限问题无法连接到 Gunicorn 套接字。当使用 root 用户而不是 sudo
用户执行该过程时,可能会发生这种情况。虽然 systemd 能够创建 Gunicorn 套接字文件,但 Nginx 无法访问它。
如果根目录 (/
) 和 gunicorn.sock
文件之间的任何位置的权限都有限,就会发生这种情况。您可以通过将套接字文件的绝对路径传递给 namei
命令来查看套接字文件及其每个父目录的权限和所有权值:
- namei -l /run/gunicorn.sock
Outputf: /run/gunicorn.sock
drwxr-xr-x root root /
drwxr-xr-x root root run
srw-rw-rw- root root gunicorn.sock
输出显示每个目录组件的权限。通过查看权限(第一列)、所有者(第二列)和组所有者(第三列),您可以确定允许对套接字文件进行何种类型的访问。
在此示例中,套接字文件和指向它的每个目录都具有全局读取和执行权限(目录的权限列以 r-x
而不是 ---
). Nginx 进程应该能够成功访问套接字。
如果通向套接字的任何目录没有世界读取和执行权限,则 Nginx 将无法在不允许世界读取和执行权限的情况下访问套接字,或者通过将组所有权授予 Nginx 所属的组.
Django 正在显示:“无法连接到服务器:连接被拒绝”
当您尝试在 Web 浏览器中访问应用程序的某些部分时,您可能会从 Django 收到一条消息:
OperationalError at /admin/login/
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
这表明 Django 无法连接到 Postgres 数据库。检查 Postgres 实例是否正在运行:
- sudo systemctl status postgresql
如果不是,您可以启动它并使其在启动时自动启动(如果尚未配置为这样做):
- sudo systemctl start postgresql
- sudo 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 进程以获取更改:
- sudo systemctl restart gunicorn
如果更改 Gunicorn 套接字或服务文件,请重新加载守护进程并通过运行以下命令重新启动进程:
- sudo systemctl daemon-reload
- sudo systemctl restart gunicorn.socket gunicorn.service
如果更改 Nginx 服务器块配置,请测试配置,然后运行以下命令测试 Nginx:
- sudo nginx -t && sudo systemctl restart nginx
这些命令有助于在您调整配置时应用更改。
结论
在本指南中,您在自己的虚拟环境中设置了一个 Django 项目,并配置 Gunicorn 来翻译客户端请求,以便 Django 可以处理它们。之后,您将 Nginx 设置为充当反向代理来处理客户端连接并根据客户端请求提供正确的项目。
Django 通过提供许多通用部分使创建项目和应用程序变得方便,让您专注于独特的元素。通过利用本教程中描述的通用工具链,您可以从单个服务器为您创建的应用程序提供服务。