如何建立与Django的Postgres的,Nginx等Gunicorn在CentOS 7

Django是一个功能强大的Web框架,可以帮助您得到您的Python应用程序或网站离地面。 Django包含局部测试代码的简化开发服务器,但对于任何稍微的生产有关,更安全,更强大的Web服务器...

介绍

Django是一个强大的网络框架,可以帮助你让你的Python应用程序或网站离地面。 Django包括一个用于在本地测试代码的简化开发服务器,但是对于与生产有关的任何事情,需要一个更安全和更强大的Web服务器。

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

先决条件和目标

为了完成这个指南,你应该有一个非root用户新鲜的CentOS 7服务器实例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

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

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

source myprojectenv/bin/activate

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

随着虚拟环境活跃,安装Django,Gunicorn和psycopg2与本地实例PostgreSQL的适配器pip

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使用psycopg2 ,我们在安装适配器pip 我们需要给出数据库名称,数据库用户名,数据库用户名密码,然后指定数据库位于本地计算机上。 您可以将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浏览器,访问你的服务器的域名或IP地址后面:8000

http://server_domain_or_IP:8000

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

Django索引页

如果您添加/admin在地址栏中的URL的最后,你会被提示输入您已创建的管理员用户名和密码createsuperuser命令:

Django管理员登录

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

Django管理界面

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

测试Gunicorn的能力服务项目

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

cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

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

我们通过指定Django的相对目录路径通过Gunicorn模块wsgi.py文件,该文件的入口点到我们的应用程序,使用Python的模块语法。 在这个文件中,一被调用的功能application被定义,其用于与应用程序进行通信。 要了解更多关于WSGI规范,请点击这里

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

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

deactivate

创建Gunicorn Systemd服务文件

我们测试了Gunicorn可以与我们的Django应用程序交互,但我们应该实现一个更可靠的方式启动和停止应用程序服务器。 为了实现这一点,我们将创建一个Systemd服务文件。

创建和打开Systemd服务文件Gunicorn与sudo在文本编辑器的权限:

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忽略找到一个favicon的任何问题。 我们也将告诉它在哪里可以找到,我们收集在我们的静态资产~/ 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通过提供许多常用的部分来简化创建项目和应用程序,使您能够专注于独特的元素。 通过利用本文中描述的通用工具链,您可以轻松地从单个服务器提供您创建的应用程序。