Django是一个功能强大的Web框架,可以帮助您启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码,但是对于任何与生产相关的细节,都需要一个更安全,更强大的Web服务器。
在本指南中,我们将演示如何在CentOS 7上安装和配置某些组件以支持和服务Django应用程序。我们将设置PostgreSQL数据库,而不是使用默认的SQLite数据库。我们将配置Gunicorn应用程序服务器以与我们的应用程序连接。然后,我们将设置Nginx以反向代理Gunicorn,让我们可以访问其安全性和性能功能来为我们的应用程序提供服务。
为了完成本指南,您应该拥有一个全新的CentOS 7服务器实例,其中非root用户具有已sudo
配置的权限。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
我们将在虚拟环境中安装Django。将Django安装到特定于项目的环境中将允许单独处理您的项目及其需求。
一旦我们启动并运行了数据库和应用程序,我们将安装和配置Gunicorn应用程序服务器。这将作为我们应用程序的接口,将HTTP中的客户端请求转换为我们的应用程序可以处理的Python调用。然后,我们将在Gunicorn面前设置Nginx,以利用其高性能连接处理机制及其易于实现的安全功能。
让我们开始吧。
要开始这个过程,我们将从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作为我们安装的反向代理。
我们将直接进入并为我们的安装设置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,我们可以为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需求,以便于管理。
为此,我们首先需要访问该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
安装我们的Python组件后,我们可以创建实际的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以确保它可以为应用程序提供服务。我们可以通过输入以下内容轻松完成
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可以与我们的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
现在Gunicorn已经建立,我们需要配置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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。