介绍
Django 是一个强大的 Web 框架,可以帮助您将您的 Python 应用程序或网站从地面上获得。Django 包含一个简化开发服务器来本地测试您的代码,但对于任何与生产有关的内容,需要一个更安全、更强大的 Web 服务器。
在本指南中,我们将展示如何在CentOS 7上安装和配置某些组件以支持和服务Django应用程序。我们将设置一个PostgreSQL数据库,而不是使用默认的SQLite数据库。我们将配置Gunicorn应用程序服务器与我们的应用程序进行交互。
前提和目标
要完成本指南,您应该有一个新的 CentOS 7 服务器实例,具有配置了sudo
权限的非根用户,您可以通过我们的 初始服务器设置指南来学习如何设置此设置。
将 Django 安装在虚拟环境中,而将 Django 安装在您项目的特定环境中,将使您的项目及其需求能够单独处理。
一旦我们的数据库和应用程序启动并运行,我们将安装和配置Gunicorn应用程序服务器,这将作为我们的应用程序的界面,将客户端请求翻译成HTTP到我们的应用程序可以处理的Python呼叫。
让我们开始吧。
安装来自 EPEL 和 CentOS 存储库的软件包
要开始这个过程,我们将从 CentOS 存储库下载并安装我们需要的所有项目,我们还需要使用 EPEL 存储库,该存储库包含不包括在主要 CentOS 存储库中的额外包。
首先,启用EPEL存储器,以便我们可以获得所需的组件:
1sudo yum install epel-release
有了新的存储库,我们可以在一个命令中安装所需的所有部件:
1sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx
它还会安装PostgreSQL数据库系统和一些库和其他文件,我们需要与之互动并构建它。
如何为 Django 设置 PostgreSQL
我们将直接跳入并为我们的安装设置PostgreSQL。
设置和启动PostgreSQL
要开始,我们需要初始化 PostgreSQL 数据库,我们可以通过键入:
1sudo postgresql-setup initdb
数据库初始化后,我们可以通过键入开始 PostgreSQL 服务:
1sudo systemctl start postgresql
随着数据库的启动,我们实际上需要调整已拥有的配置文件中的值。 使用您的编辑器和sudo
命令现在打开文件:
1sudo nano /var/lib/pgsql/data/pg_hba.conf
此文件负责为数据库系统配置身份验证方法。目前,它已配置为仅在系统用户匹配数据库用户时允许连接。
我们可以通过修改文件底部的两个主机
行来配置此功能,更改最后一列(身份验证方法)为md5
。
1. . .
2
3# TYPE DATABASE USER ADDRESS METHOD
4
5# "local" is for Unix domain socket connections only
6local all all peer
7# IPv4 local connections:
8#host all all 127.0.0.1/32 ident
9host all all 127.0.0.1/32 md5
10# IPv6 local connections:
11#host all all ::1/128 ident
12host all all ::1/128 md5
完成后,保存并关闭文件。
随着我们新的配置变化,我们需要重新启动服务,我们还将启用PostgreSQL,以便它在启动时自动启动:
1sudo systemctl restart postgresql
2sudo systemctl enable postgresql
创建 PostgreSQL 数据库和用户
现在我们有PostgreSQL并按照我们想要的方式运行,我们可以为我们的Django应用程序创建一个数据库和数据库用户。
要在本地使用 Postgres,最好暂时切换到postgres
系统用户。
1sudo su - postgres
当您作为postgres
用户运行时,您可以直接登录到 PostgreSQL 交互式会话中,而无需进一步验证。
1psql
您将收到一个PostgreSQL提示,我们可以设置我们的要求。
首先,为您的项目创建一个数据库:
1CREATE DATABASE myproject;
每个命令都必须以半列结束,因此如果您遇到问题,请确保命令以一个结束。
接下来,为我们的项目创建一个数据库用户. 请确保选择安全密码:
1CREATE USER myprojectuser WITH PASSWORD 'password';
现在,我们可以为我们的新用户提供访问权限来管理我们的新数据库:
1GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
完成后,通过键入退出 PostgreSQL 提示:
1\q
现在,退出postgres
用户的壳会话以通过键入返回正常用户的壳会话:
1exit
为您的项目创建一个Python虚拟环境
现在我们已经准备好了我们的数据库,我们可以开始准备剩下的项目要求,我们将在虚拟环境中安装我们的Python要求,以便更容易管理。
要做到这一点,我们首先需要访问virtualenv
命令,我们可以使用pip
来安装:
1sudo pip install virtualenv
安装了virtualenv
,我们可以开始创建我们的项目. 创建一个目录,您希望保留您的项目,然后移动到目录:
1mkdir ~/myproject
2cd ~/myproject
在项目目录中,通过键入创建一个Python虚拟环境:
1virtualenv myprojectenv
这将创建一个名为myprojectenv
的目录在你的myproject
目录中。内部,它将安装一个本地版本的Python和一个本地版本的pip
。
在我们安装项目的 Python 要求之前,我们需要激活虚拟环境,您可以通过键入:
1source myprojectenv/bin/activate
您的提示应更改,以表示您现在在Python虚拟环境中运行,它将看起来像这样: (myprojectenv)user@host:~/myproject$
。
随着虚拟环境的启动,安装 Django、Gunicorn 和psycopg2
PostgreSQL 适配器,使用本地实例pip
:
1pip install django gunicorn psycopg2
创建和配置一个新的Django项目
有了我们的Python组件安装,我们可以创建实际的Django项目文件。
创建 Django 项目
由于我们已经有一个项目目录,我们会告诉Django在这里安装文件,它将创建一个与实际代码的第二级目录,这是正常的,并在该目录中放置一个管理脚本。
1django-admin.py startproject myproject .
调整项目设置
我们应该做的第一件事与我们新创建的项目文件是调整设置. 在文本编辑器中打开设置文件:
1nano myproject/settings.py
首先,找到配置数据库访问的部分,它将从DATABASES
开始,文件中的配置是 SQLite 数据库,我们已经为我们的项目创建了一个 PostgreSQL 数据库,所以我们需要调整设置。
使用您的 PostgreSQL 数据库信息更改设置. 我们告诉 Django 使用我们与pip
安装的psycopg2
适配器. 我们需要输入数据库名称、数据库用户名、数据库用户名密码,然后指定数据库位于本地计算机上。
1DATABASES = {
2 'default': {
3 'ENGINE': 'django.db.backends.postgresql_psycopg2',
4 'NAME': 'myproject',
5 'USER': 'myprojectuser',
6 'PASSWORD': 'password',
7 'HOST': 'localhost',
8 'PORT': '',
9 }
10}
接下来,移动到文件的底部,并添加一个设置,表示 static 文件应该放置在哪里。 这是必要的,以便 Nginx 能够处理这些项目的请求。
1STATIC_ROOT = os.path.join(BASE_DIR, "static/")
保存并关闭文件,当你完成。
完整的初始项目设置
现在,我们可以使用管理脚本将初始数据库方案迁移到我们的PostgreSQL数据库:
1cd ~/myproject
2./manage.py makemigrations
3./manage.py migrate
创建一个项目的管理用户,键入:
1./manage.py createsuperuser
您将需要选择用户名,提供电子邮件地址,并选择并确认密码。
我们可以将所有静态内容收集到我们通过键入配置的目录位置:
1./manage.py collectstatic
然后,静态文件将被放置在项目目录中的名为静态
的目录中。
最后,您可以通过使用以下命令启动 Django 开发服务器来测试您的项目:
1./manage.py runserver 0.0.0.0:8000
在您的 Web 浏览器中,访问您的服务器的域名或 IP 地址,然后是 :8000
:
1http://server_domain_or_IP:8000
您应该看到默认的 Django 索引页面:
如果您在地址栏中添加/admin
到URL的末尾,您将被提示使用createsuperuser
命令创建的管理用户名和密码:
验证后,您可以访问默认的 Django admin 界面:
当您完成探索时,在终端窗口中按 CTRL-C 来关闭开发服务器。
测试 Gunicorn 服务项目的能力
在离开我们的虚拟环境之前,我们要做的最后一件事是测试Gunicorn,以确保它可以服务于应用程序。
1cd ~/myproject
2gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
这将启动Gunicorn在Django开发服务器正在运行的相同界面上。你可以返回并再次测试应用程序。 请注意,管理员界面将没有应用任何的样式,因为Gunicorn不知道负责此事的静态内容。
我们通过指定相对目录路径给Django的wsgi.py
文件,这是我们应用程序的入口点,使用Python的模块语法通过Gunicorn传递了一个模块。
当你完成测试时,在终端窗口中按 CTRL-C 来阻止 Gunicorn。
我们现在已经完成了我们的Django应用程序的配置,我们可以通过键入退出我们的虚拟环境:
1deactivate
创建 Gunicorn Systemd 服务文件
我们已经测试了Gunicorn可以与我们的Django应用程序进行交互,但我们应该实施一个更强大的启动和停止应用程序服务器的方式。
创建并在文本编辑器中使用sudo
特权打开 Gunicorn 的 Systemd 服务文件:
1sudo nano /etc/systemd/system/gunicorn.service
我们将在这里列出我们的服务的描述,并告诉 init 系统在实现网络目标后才启动此操作:
1[Unit]
2Description=gunicorn daemon
3After=network.target
接下来,我们将打开[服务]
部分,我们将指定我们想要处理的用户和组,我们将给我们的常规用户帐户所有权,因为它拥有所有相关的文件,我们将给 Nginx用户组所有权,以便它可以轻松地与Gunicorn进行通信。
然后我们将绘制工作目录并指定要使用的命令来启动服务. 在这种情况下,我们将不得不指定在我们的虚拟环境中安装的Gunicorn可执行的完整路径。我们将它绑定到项目目录中的Unix插槽,因为Nginx安装在同一台计算机上。这比使用网络端口更安全,更快。我们也可以在这里指定任何可选的Gunicorn调整。
1[Unit]
2Description=gunicorn daemon
3After=network.target
4
5[Service]
6User=user
7Group=nginx
8WorkingDirectory=/home/user/myproject
9ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
最后,我们将添加一个[安装]
部分,这将告诉Systemd如果我们允许该服务在启动时启动,将该服务链接到什么。
1[Unit]
2Description=gunicorn daemon
3After=network.target
4
5[Service]
6User=user
7Group=nginx
8WorkingDirectory=/home/user/myproject
9ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
10
11[Install]
12WantedBy=multi-user.target
这样,我们的 Systemd 服务文件就完成了. 现在保存并关闭它。
我们现在可以启动我们创建的Gunicorn服务,并启用它,以便它在启动时开始:
1sudo systemctl start gunicorn
2sudo systemctl enable gunicorn
配置 Nginx 到 Proxy Pass 到 Gunicorn
现在Gunicorn已设置,我们需要配置 Nginx 来将流量传输到进程中。
更改 Nginx 配置文件
我们可以通过编辑主 Nginx 配置文件来继续修改服务器块配置:
1sudo nano /etc/nginx/nginx.conf
内部,打开一个新的服务器块,就在已经存在的服务器块上方:
1http {
2 . . .
3
4 include /etc/nginx/conf.d/*.conf;
5
6 server {
7 }
8
9 server {
10 listen 80 default_server;
11
12 . . .
我们将把我们Django应用程序的所有配置放在这个新区块中,我们将首先指定该区块应该在正常端口80上收听,并应响应我们的服务器的域名或IP地址:
1server {
2 listen 80;
3 server_name server_domain_or_IP;
4}
接下来,我们会告诉 Nginx 忽略找到 favicon 的任何问题,我们还会告诉它在我们的 `~/myproject/static’ 目录中收集的静态资产在哪里找到。
1server {
2 listen 80;
3 server_name server_domain_or_IP;
4
5 location = /favicon.ico { access_log off; log_not_found off; }
6 location /static/ {
7 root /home/user/myproject;
8 }
9}
最后,我们将创建一个位置 / {}
块来匹配所有其他请求。在这个位置内,我们将设置一些标准的代理 HTTP 标题,以便 Gunicorn 可以有关于远程客户端连接的某些信息。
1server {
2 listen 80;
3 server_name server_domain_or_IP;
4
5 location = /favicon.ico { access_log off; log_not_found off; }
6 location /static/ {
7 root /home/user/myproject;
8 }
9
10 location / {
11 proxy_set_header Host $http_host;
12 proxy_set_header X-Real-IP $remote_addr;
13 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
14 proxy_set_header X-Forwarded-Proto $scheme;
15 proxy_pass http://unix:/home/user/myproject/myproject.sock;
16 }
17}
保存并关闭文件,当你完成。
调整组会员资格和许可
nginx
用户必须访问我们的应用程序目录,以便它可以服务静态文件,访问接口文件等 CentOS非常限制地锁定每个用户的家庭目录,所以我们会将nginx
用户添加到我们的用户组中,以便我们可以打开必要的最低权限来使此功能。
用以下命令将nginx
用户添加到您的组中,以命令中的用户
代替您自己的用户名:
1sudo usermod -a -G user nginx
现在,我们可以给我们的用户组在我们的主目录上执行权限,这将允许 Nginx 进程进入和访问内容:
1chmod 710 /home/user
使用设置的权限,我们可以测试我们的 Nginx 配置文件以检测语法错误:
1sudo nginx -t
如果没有错误,请通过键入以下方式重新启动 Nginx 服务:
1sudo systemctl start nginx
告诉 init 系统在启动时启动 Nginx 服务器,键入:
1sudo systemctl enable nginx
您现在应该通过服务器的域名或IP地址访问您的Django应用程序,而不指定端口。
结论
在本指南中,我们已经在自己的虚拟环境中设置了一个Django项目,我们已经配置了Gunicorn来翻译客户端请求,以便Django能够处理这些请求。
Django 通过提供许多常见元素来简化项目和应用程序的创建,使您能够专注于独特的元素,通过利用本文中描述的通用工具链,您可以轻松地从单一服务器中服务您创建的应用程序。