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

介绍

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存储库,以便我们可以获得所需的组件:

sudo yum install epel-release

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

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数据库。我们可以通过键入:

sudo postgresql-setup initdb

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

sudo systemctl start postgresql

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

sudo nano /var/lib/pgsql/data/pg_hba.conf

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

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

. . .
​
# 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,以便它在开机时自动启动:

sudo systemctl restart postgresql
sudo systemctl enable postgresql

创建PostgreSQL数据库和用户

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

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

sudo su - postgres

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

psql

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

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

CREATE DATABASE myproject;

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

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

CREATE USER myprojectuser WITH PASSWORD 'password';

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

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

\q

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

exit

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

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

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

sudo pip install virtualenv

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

mkdir ~/myproject
cd ~/myproject

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

virtualenv myprojectenv

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

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

source myprojectenv/bin/activate

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

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

pip install django gunicorn psycopg2

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

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

创建Django项目

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

django-admin.py startproject myproject .

调整项目设置

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

nano myproject/settings.py

首先找到配置数据库访问的部分。它将从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_ROOT = os.path.join(BASE_DIR, "static/")

完成后保存并关闭文件。

完成初始项目设置

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

cd ~/myproject
./manage.py makemigrations
./manage.py migrate

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

./manage.py createsuperuser

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

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

./manage.py collectstatic

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

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

./manage.py runserver 0.0.0.0:8000

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

http://server_domain_or_IP:8000

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

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

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

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

测试Gunicorn服务项目的能力

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

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应用程序的配置。我们可以通过输入以下命令退出虚拟环境:

deactivate

创建一个Gunicorn系统服务文件

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

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

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

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

[Unit]
Description=gunicorn daemon
After=network.target

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

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

[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将此服务链接到何处。我们希望在常规多用户系统启动并运行时启动此服务:

[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服务并启用它以便它在开机时启动:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

将Nginx配置为代理传递给Gunicorn

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

修改Nginx配置文件

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

sudo nano /etc/nginx/nginx.conf

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

http {
    . . .

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

    server {
    }

    server {
        listen 80 default_server;

        . . .

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

server {
    listen 80;
    server_name server_domain_or_IP;
}

接下来,我们将告诉Nginx忽略找到图标的任何问题。我们还将告诉它在哪里可以找到我们在~/myproject/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/user/myproject;
    }
}

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

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

sudo usermod -a -G user nginx

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

chmod 710 /home/user

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

sudo nginx -t

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

sudo systemctl start nginx

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

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》

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

Eclipse各版本代号一览表以及官网上有很多版本的eclipse,下载哪个版本比较合适呢?

Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。

5641
来自专栏小二的折腾日记

Linux学习1-Linux的基本命令(1)

cat /etc/shells //查看当前系统有那些shell cat $SHELL

451
来自专栏CaiRui

memcached服务

介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用。它...

3718
来自专栏电光石火

eclipse配置tomcat运行时访问路径不要项目名称

1:双击打开tomcat 2:选择Modules,选择你要修改的项目 ? 3:点击Edit,把path修改成空或者你自己想要的路径即可! ?

3086
来自专栏闵开慧

tomcat里面的文件详细说明

如何安装tomcat服务器   安装Tomcat之前要先安装JDK,可从http://java.sun.com上下载最新版本的JDK。 Tomcat可从Apac...

40710
来自专栏云计算教程系列

如何在Debian 9上安装Apache Tomcat 9

Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。Tomcat是Apache Software Foundati...

4244
来自专栏学一学大数据

一文上手zabbix安装配置【运维篇】

1713
来自专栏北京马哥教育

汇总:Linux文件管理的50个命令

文 | 糖豆 图 | 来源网络 糖豆贴心提醒,本文阅读时间6分钟,文末有秘密! Linux cat命令 cat 命令用于连接文件并打印到标准输出设备上...

4986
来自专栏C/C++基础

Linux命令(5)——shutdown命令

使用shutdown命令时,在系统关机前,可以通知所有登录者系统将要关闭。此时login指令会被冻结,新用户将不能再登录,这是推荐使用的安全关机方式。关机之前,...

1064
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Redis

Redis是一个内存中的键值存储器,以其灵活性,性能和广泛的语言支持而闻名。它通常用作数据库,缓存和消息代理,并支持各种数据结构。

3562

扫码关注云+社区

领取腾讯云代金券