前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CentOS 7上使用Postgres,Nginx和Gunicorn设置Django

如何在CentOS 7上使用Postgres,Nginx和Gunicorn设置Django

原创
作者头像
angel_郁
修改2018-10-25 11:02:13
2.2K0
修改2018-10-25 11:02:13
举报
文章被收录于专栏:云计算教程系列

介绍

Django是一个功能强大的Web框架,可以帮助您启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码,但是对于任何与生产相关的细节,都需要一个更安全,更强大的Web服务器。

在本指南中,我们将演示如何在CentOS 7上安装和配置某些组件以支持和服务Django应用程序。我们将设置PostgreSQL数据库,而不是使用默认的SQLite数据库。我们将配置Gunicorn应用程序服务器以与我们的应用程序连接。然后,我们将设置Nginx以反向代理Gunicorn,让我们可以访问其安全性和性能功能来为我们的应用程序提供服务。

先决条件和目标

为了完成本指南,您应该拥有一个全新的CentOS 7服务器实例,其中非root用户具有已sudo配置的权限。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

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

一旦我们启动并运行了数据库和应用程序,我们将安装和配置Gunicorn应用程序服务器。这将作为我们应用程序的接口,将HTTP中的客户端请求转换为我们的应用程序可以处理的Python调用。然后,我们将在Gunicorn面前设置Nginx,以利用其高性能连接处理机制及其易于实现的安全功能。

让我们开始吧。

从EPEL和CentOS存储库安装软件包

要开始这个过程,我们将从CentOS存储库下载并安装我们需要的所有项目。我们还需要使用EPEL存储库,其中包含未包含在CentOS主存储库中的额外软件包。稍后我们将使用Python包管理器pip来安装一些额外的组件。

首先,启用EPEL存储库,以便我们可以获得所需的组件:

代码语言:javascript
复制
sudo yum install epel-release

有了新的存储库,我们可以在一个命令中安装我们需要的所有部分:

代码语言:javascript
复制
sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx 

这将安装pip,它是一个Python包管理器。它还将安装PostgreSQL数据库系统以及我们需要与它交互并构建它的一些库和其他文件。我们包含了GCC编译器,因此pip可以构建软件,我们安装了Nginx作为我们安装的反向代理。

为Django设置PostgreSQL

我们将直接进入并为我们的安装设置PostgreSQL。

配置并启动PostgreSQL

首先,我们需要初始化PostgreSQL数据库。我们可以通过键入:

代码语言:javascript
复制
sudo postgresql-setup initdb

数据库初始化后,我们可以通过输入以下命令来启动PostgreSQL服务:

代码语言:javascript
复制
sudo systemctl start postgresql

启动数据库后,我们实际上需要调整已填充的配置文件中的值。使用编辑器和sudo命令立即打开文件:

代码语言:javascript
复制
sudo nano /var/lib/pgsql/data/pg_hba.conf

此文件负责配置数据库系统的身份验证方法。目前,它被配置为仅在系统用户与数据库用户匹配时才允许连接。这对于本地维护任务是可以的,但我们的Django实例将为另一个用户配置密码。

我们可以通过修改host文件底部的两行来配置它。将最后一列(身份验证方法)更改为md5。这将允许密码验证:

代码语言:javascript
复制
. . .
​
# TYPE  DATABASE        USER            ADDRESS                 METHOD
​
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

完成后,保存并关闭文件。

通过我们的新配置更改,我们需要重新启动服务。我们还将启用PostgreSQL,以便它在开机时自动启动:

代码语言:javascript
复制
sudo systemctl restart postgresql
sudo systemctl enable postgresql

创建PostgreSQL数据库和用户

现在我们已经按照我们想要的方式运行PostgreSQL,我们可以为Django应用程序创建数据库和数据库用户。

要在本地使用Postgres,最好暂时更改为postgres系统用户。现在输入以下命令:

代码语言:javascript
复制
sudo su - postgres

作为postgres用户操作时,您可以直接登录PostgreSQL交互式会话而无需进一步的身份验证。这是由于我们在pg_hba.conf文件中有一行更改:

代码语言:javascript
复制
psql

您将获得PostgreSQL提示,我们可以在其中设置我们的要求。

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

代码语言:javascript
复制
CREATE DATABASE myproject;

每个命令必须以分号结尾,因此如果遇到问题,请检查命令是否以一个结尾。

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

代码语言:javascript
复制
CREATE USER myprojectuser WITH PASSWORD 'password';

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

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

完成后,键入以下内容退出PostgreSQL提示符:

代码语言:javascript
复制
\q

现在,退出postgres用户的shell会话以通过键入以下内容返回到普通用户的shell会话:

代码语言:javascript
复制
exit

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

现在我们已准备好数据库,我们就可以开始准备其余的项目需求了。我们将在虚拟环境中安装我们的Python需求,以便于管理。

为此,我们首先需要访问该virtualenv命令。我们可以用pip来安装这个:

代码语言:javascript
复制
sudo pip install virtualenv

随着virtualenv的安装,我们可以开始形成我们的项目。创建一个您希望保留项目的目录,然后进入目录:

代码语言:javascript
复制
mkdir ~/myproject
cd ~/myproject

在项目目录中,键入以下命令创建Python虚拟环境:

代码语言:javascript
复制
virtualenv myprojectenv

这将在您的myproject目录中创建一个名为myprojectenv的目录。在里面,它将安装本地版本的Python和本地的pip版本。我们可以使用它为我们的项目安装和配置一个独立的Python环境。

在我们安装项目的Python需求之前,我们需要激活虚拟环境。您可以通过键入以下内容来执行:

代码语言:javascript
复制
source myprojectenv/bin/activate

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

在您的虚拟环境处于活动状态时,psycopg2使用以下本地实例pip安装Django,Gunicorn和PostgreSQL适配器:

代码语言:javascript
复制
pip install django gunicorn psycopg2

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

安装我们的Python组件后,我们可以创建实际的Django项目文件。

创建Django项目

由于我们已经有了一个项目目录,我们将告诉Django在这里安装文件。它将使用实际代码创建第二级目录,这是正常的,并将管理脚本放在此目录中。关键是最后的点告诉Django在当前目录中创建文件:

代码语言:javascript
复制
django-admin.py startproject myproject .

调整项目设置

我们应该对新创建的项目文件做的第一件事就是调整设置。在文本编辑器中打开设置文件:

代码语言:javascript
复制
nano myproject/settings.py

首先找到配置数据库访问的部分。它将从DATABASES开始。该文件中的配置适用于SQLite数据库。我们已经为项目创建了PostgreSQL数据库,因此我们需要调整设置。

使用PostgreSQL数据库信息更改设置。我们告诉Django使用我们用pip安装的psycopg2适配器。我们需要提供数据库名称,数据库用户名,数据库用户名密码,然后指定数据库位于本地计算机上。您可以将PORT设置保留为空字符串:

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

接下来,向下移动到文件的底部,并添加一个设置,指示应放置静态文件的位置。这是必要的,以便Nginx可以处理这些项目的请求。以下行告诉Django将它们放在基础项目目录中调用的static目录中:

代码语言:javascript
复制
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

完成后保存并关闭文件。

完成初始项目设置

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

代码语言:javascript
复制
cd ~/myproject
./manage.py makemigrations
./manage.py migrate

键入以下内容为项目创建管理用户:

代码语言:javascript
复制
./manage.py createsuperuser

您必须选择用户名,提供电子邮件地址,然后选择并确认密码。

我们可以通过输入以下内容将所有静态内容收集到我们配置的目录位置:

代码语言:javascript
复制
./manage.py collectstatic

您必须确认操作。然后,静态文件将放在项目目录中调用的 static 目录中。

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

代码语言:javascript
复制
./manage.py runserver 0.0.0.0:8000

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

代码语言:javascript
复制
http://server_domain_or_IP:8000

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

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

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

完成浏览后,在终端窗口中按CTRL-C关闭开发服务器。

测试Gunicorn服务项目的能力

在离开我们的虚拟环境之前,我们要做的最后一件事是测试Gunicorn以确保它可以为应用程序提供服务。我们可以通过输入以下内容轻松完成

代码语言:javascript
复制
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

这将在运行Django开发服务器的同一界面上启动Gunicorn。您可以返回并再次测试应用程序。请注意,管理界面不会应用任何样式,因为Gunicorn不知道负责此操作的静态内容。

我们通过使用Python的模块语法指定Django 的wsgi.py文件的相对目录路径来传递Gunicorn模块,该文件是我们应用程序的入口点。在此文件内部,定义了一个名为application的函数,用于与应用程序通信。

完成测试后,在终端窗口中按CTRL-C以停止Gunicorn。

我们现在已经完成了Django应用程序的配置。我们可以通过输入以下命令退出虚拟环境:

代码语言:javascript
复制
deactivate

创建一个Gunicorn系统服务文件

我们已经测试过Gunicorn可以与我们的Django应用程序进行交互,但是我们应该实现一种更强大的启动和停止应用程序服务器的方法。为此,我们将制作一个Systemd服务文件。

使用sudo文本编辑器中的权限为Gunicorn创建并打开Systemd服务文件:

代码语言:javascript
复制
sudo nano /etc/systemd/system/gunicorn.service

从该[Unit]部分开始,该部分用于指定元数据和依赖项。我们将在此处描述我们的服务并告诉init系统仅在达到网络目标后启动它:

代码语言:javascript
复制
[Unit]
Description=gunicorn daemon
After=network.target

接下来,我们将打开该[Service]部分。我们将指定要在其下运行的用户和组。我们将为该流程提供常规用户帐户所有权,因为它拥有所有相关文件。我们将授予Nginx用户组所有权,以便它可以轻松地与Gunicorn进行通信。

然后,我们将映射工作目录并指定用于启动服务的命令。在这种情况下,我们必须指定Gunicorn可执行文件的完整路径,该文件安装在我们的虚拟环境中。我们将它绑定到项目目录中的Unix套接字,因为Nginx安装在同一台计算机上。这比使用网络端口更安全,更快捷。我们还可以在这里指定任何可选的Gunicorn调整。例如,在这种情况下我们指定了3个工作进程:

代码语言:javascript
复制
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

最后,我们将添加一个[Install]部分。如果我们在启动时启动它,这将告诉Systemd将此服务链接到何处。我们希望在常规多用户系统启动并运行时启动此服务:

代码语言:javascript
复制
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

这样,我们的Systemd服务文件就完成了。立即保存并关闭它。

我们现在可以启动我们创建的Gunicorn服务并启用它以便它在开机时启动:

代码语言:javascript
复制
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

将Nginx配置为代理传递给Gunicorn

现在Gunicorn已经建立,我们需要配置Nginx以将流量传递给进程。

修改Nginx配置文件

我们可以通过编辑主Nginx配置文件继续修改服务器块配置:

代码语言:javascript
复制
sudo nano /etc/nginx/nginx.conf

在内部,在已经存在的服务器块上方打开一个新的服务器块:

代码语言:javascript
复制
http {
    . . .

    include /etc/nginx/conf.d/*.conf;

    server {
    }

    server {
        listen 80 default_server;

        . . .

我们将把Django应用程序的所有配置放在这个新块中。我们将首先指定此块应该侦听正常端口80,并且它应该响应我们服务器的域名或IP地址:

代码语言:javascript
复制
server {
    listen 80;
    server_name server_domain_or_IP;
}

接下来,我们将告诉Nginx忽略找到图标的任何问题。我们还将告诉它在哪里可以找到我们在~/myproject/static目录中收集的静态资产。所有这些文件都有一个标准的URI前缀“/ static”,因此我们可以创建一个位置块来匹配这些请求:

代码语言:javascript
复制
server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/myproject;
    }
}

最后,我们将创建一个location / {}块来匹配所有其他请求。在这个位置的内部,我们将设置一些标准的代理HTTP头,以便Gunicorn可以获得有关远程客户端连接的一些信息。然后我们将流量传递给我们在Gunicorn Systemd单元文件中指定的套接字:

代码语言:javascript
复制
server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/myproject;
    }

    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:/home/user/myproject/myproject.sock;
    }
}

完成后保存并关闭文件。

调整组成员身份和权限

nginx用户必须能够访问我们的应用程序目录,以便它可以提供静态文件,访问套接字文件等的CentOS非常严格地锁定了每个用户的主目录,因此我们将添加nginx用户到我们的用户群,这样我们就可以打开获得使其运行所需的最低权限。

使用以下命令将nginx用户添加到组中。用命令中的自己的用户名替换user

代码语言:javascript
复制
sudo usermod -a -G user nginx

现在,我们可以在我们的主目录上为我们的用户组授予执行权限。这将允许Nginx进程输入和访问以下内容:

代码语言:javascript
复制
chmod 710 /home/user

设置权限后,我们可以测试我们的Nginx配置文件是否存在语法错误:

代码语言:javascript
复制
sudo nginx -t

如果没有错误,请键入以下命令重新启动Nginx服务:

代码语言:javascript
复制
sudo systemctl start nginx

通过键入以下内容告诉init系统在启动时启动Nginx服务器:

代码语言:javascript
复制
sudo systemctl enable nginx

您现在应该可以通过服务器的域名或IP地址在浏览器中访问Django应用程序,而无需指定端口。

结论

在本指南中,我们在自己的虚拟环境中设置了一个Django项目。我们已经配置了Gunicorn来翻译客户端请求,以便Django可以处理它们。之后,我们设置Nginx作为反向代理来处理客户端连接并根据客户端请求提供正确的项目。

Django通过提供许多常见的部分使创建项目和应用程序变得简单,使您可以专注于独特的元素。通过利用本文中介绍的常规工具链,您可以轻松地为从单个服务器创建的应用程序提供服务。

更多CentOS教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up Django with Postgres, Nginx, and Gunicorn on CentOS 7》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 先决条件和目标
  • 从EPEL和CentOS存储库安装软件包
  • 为Django设置PostgreSQL
    • 配置并启动PostgreSQL
      • 创建PostgreSQL数据库和用户
      • 为您的项目创建Python虚拟环境
      • 创建和配置一个新的Django项目
        • 创建Django项目
          • 调整项目设置
            • 完成初始项目设置
              • 测试Gunicorn服务项目的能力
              • 创建一个Gunicorn系统服务文件
              • 将Nginx配置为代理传递给Gunicorn
                • 修改Nginx配置文件
                  • 调整组成员身份和权限
                  • 结论
                  相关产品与服务
                  云数据库 PostgreSQL
                  腾讯云数据库 PostgreSQL(TencentDB for PostgreSQL,云 API 使用 postgres 作为简称)能够让您在云端轻松设置、操作和扩展目前功能最强大的开源数据库 PostgreSQL。腾讯云将负责绝大部分处理复杂而耗时的管理工作,如 PostgreSQL 软件安装、存储管理、高可用复制、以及为灾难恢复而进行的数据备份,让您更专注于业务程序开发。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档