如何在Ubuntu 18.04上设置Django开发环境
Django是一个强大的网络框架,可以从地面上获取Python应用程序或者。
Django包括一个简化的开发服务器,用于在本地测试代码,但对于甚至略微生产的任何内容,需要更安全,更强大的Web服务器(Nginx Apache)。
在本教程中,我们将演示如何在Ubuntu 18.04上安装和配置某些组件以支持和服务Django应用程序。
我们将设置PostgreSQL数据库而不是使用默认的SQLite数据库。
我们将配置Gunicorn Application Server连接到我们的应用程序。
然后,我们将为Nginx设置为对枪手的代理,请访问其安全性和性能功能以提供我们的应用程序。
使用sudo权限创建非root用户
- 登录root
- 创建新用户
# adduser bobby
- 授予管理权限以向我们的新用户添加这些权限,我们需要将新用户添加到Sudo组。默认情况下,在Ubuntu 18.04上,允许属于sudo组的用户使用sudo命令。
# usermod -aG sudo bobby
从Ubuntu存储库安装包
要开始该过程,我们将下载并安装来自Ubuntu存储库所需的所有项目。
我们将使用Python Packager Manager PIP稍后在稍后安装其他组件。
我们需要更新本地APT包索引,然后下载并安装包。
我们安装的软件包取决于项目将使用哪个版本的Python。
使用Python 3安装Django,键入:
$sudo apt-get update $sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
这将安装pip,稍后构建枪手所需的Python开发文件,Postgres数据库系统和与其交互所需的库和Nginx Web服务器。
创建PostgreSQL数据库和用户
我们将跳转并为Django应用程序创建数据库和数据库用户。
默认情况下,Postgres使用称为对等验证的身份验证方案进行本地连接。
基本上,这意味着,如果用户的操作系统用户名与用户名匹配,则该用户可以登录,而无需进一步的身份验证。
在Postgres安装期间,创建名为Postgres的操作系统用户以对应于Postgres PostgreSQL管理用户。
我们需要使用此用户执行管理任务。
我们可以使用sudo并通过-u选项传递用户名。
通过打字登录交互式Postgres会话:
$sudo -u postgres psql
我们将获得一个PostgreSQL提示,我们可以设置我们的要求。
首先,为项目创建一个数据库
Postgres=# CREATE DATABASE newproject;
注意:每个Postgres语句都必须以半冒号结束
接下来,为我们的项目创建数据库用户。
确保选择安全密码
Postgres=# CREATE USER newprojectuser WITH PASSWORD 'password';
之后,我们将修改我们刚刚创建的用户的一些连接参数。
这将加速数据库操作,以便每次建立连接时都不必查询并设置正确的值。
我们正在将默认编码设置为UTF-8,Django预期。
我们还在设置要读取的默认事务隔离方案,从未提交的事务读取。
最后,我们正在设置时区。
默认情况下,我们的Django项目将设置为使用UTC。
这些都是Django项目本身的所有建议。
Postgres=# ALTER ROLE newprojectuser SET client_encoding TO 'utf8'; Postgres=# ALTER ROLE newprojectuser SET default_transaction_isolation TO 'read committed'; Postgres=# ALTER ROLE newprojectuser SET timezone TO 'UTC';
现在,我们可以为我们的新用户访问提供我们的新数据库
Postgres=# GRANT ALL PRIVILEGES ON DATABASE newproject TO newprojectuser;
完成后,通过打字退出PostgreSQL提示符:
Postgres=# \q
为项目创建Python 3虚拟环境
现在我们拥有我们的数据库,我们可以开始让其余的项目要求准备好。
我们将在虚拟环境中安装我们的Python 3要求以进行更轻松的管理。
为此,我们首先需要访问virtualenv命令。
我们可以使用pip3安装。
升级PIP3并通过键入安装包:
$sudo -H pip3 install --upgrade pip $sudo -H pip3 install virtualenv
使用VirtualEnv安装,我们可以开始形成我们的项目。
创建并进入我们可以保留我们的项目文件的目录:
$mkdir ~/djangoproject $cd ~/djangoproject
在"项目目录"中,通过键入创建Python虚拟环境:
$virtualenv djangoprojectenv
这将创建一个名为"djangojectenenv""中的目录,其中djangoproject"目录中。
内部,它将安装一个本地版本的python和本地版本的pip。
我们可以使用它来安装和配置我们项目的孤立的Python环境。
在我们安装项目的Python要求之前,我们需要激活虚拟环境。
我们可以通过键入:
$source djangoproject/bin/activate
提示应更改为表示我们现在在Python虚拟环境中运行。
它看起来像这样:(djangoprojectenv)用户@ host:~/djangoproject $
。
使用虚拟环境,使用PIP的本地实例安装Django,Gunicorn和Psycopg2 PostgreSQL适配器:
注意:无论我们使用哪个版本的Python 3或者Python 2,当虚拟环境激活时,我们应该使用PIP命令(不是PIP3)。
(djangoprojectenv)$pip install django gunicorn psycopg2-binary
我们现在应该拥有启动Django项目所需的所有软件。
创建和配置新的Django项目
使用我们的Python组件安装了,我们可以创建实际的Django项目文件。
由于我们已经有一个项目目录,我们会告诉Django在这里安装文件。
它将创建一个具有实际代码的第二级目录,该目录是正常的,并在此目录中放置一个管理脚本。
这是关键是我们明确定义目录,而不是允许Django相对于我们当前目录做出决定:
(djangoprojectenv)$django-admin.py startproject djangoproject ~/djangoproject
此时,项目目录(我们的案例中的"~/djangoproject""应该具有以下内容:
~/djangoproject/manage.py
:Django项目管理脚本。~/djangoproject/myproject /
:django项目包。这应该包含"__init __。py",settings.py
,urls.py
和wsgi.py
文件。~/djangoproject/djangoprojectenv /
:我们之前创建的虚拟环境目录。
我们应该执行新创建的项目文件的第一件事是调整设置。
在文本编辑器中打开设置文件:
(djangoprojectenv)$nano ~/djangoproject/djangoproject/settings.py
首先找到允许的_Hosts指令。
这定义了服务器的地址或者域名可以用于连接到Django实例的列表。
任何具有此列表中未在此列表中的主机标头的任何传入请求都将引发异常。
Django要求我们设置此项以防止某类安全漏洞。
在方括号中,列出与Django服务器关联的IP地址或者域名。
每个项目应列在带有逗号分隔的条目的引号中。
如果我们希望请求整个域和任何子域,请将句点添加到条目的开头。
在下面的片段中,有一些用于演示的示例。
~/djangoproject/djangoproject/settings.py . . . # The simplest case: just add the domain name(s) and IP addresses of your Django server # ALLOWED_HOSTS = [ 'example.com', '203.0.113.5'] # To respond to 'example.com' and any subdomains, start the domain with a dot # ALLOWED_HOSTS = ['.example.com', '103.25.111.5'] ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
接下来,查找配置数据库访问的部分。
它将从数据库开始。
文件中的配置是用于SQLite数据库。
我们已经为我们的项目创建了一个PostgreSQL数据库,因此我们需要调整设置。
使用PostgreSQL数据库信息更改设置。
我们告诉Django使用我们安装的PSYCopg2Adapor。
我们需要提供数据库名称,数据库用户名,数据库用户的密码,然后指定数据库位于本地计算机上。
我们可以将端口设置留成空字符串:
~/djangoproject/djangoproject/settings.py . . . DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'newproject', 'USER': 'newprojectuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } } . . .
接下来,向下移动到文件的底部,然后添加指示应放置静态文件的设置。
这是必要的,因此nginx可以处理这些项目的请求。
以下行告诉Django将它们放在基本项目目录中称为静态的目录中:
~/djangoproject/djangoproject/settings.py . . . STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
通过键入`ctrl + x(完成后)保存和关闭。
现在,我们可以使用管理脚本将初始数据库架构迁移到我们的PostgreSQL数据库:
(djangoprojectenv)$~/djangoproject/manage.py makemigrations (djangoprojectenv)$~/djangoproject/manage.py migrate
通过键入创建项目的管理用户:
(djangoprojectenv)$~/djangoproject/manage.py createsuperuser
我们必须选择一个用户名,提供电子邮件地址,然后选择并确认密码。
我们可以通过键入将所有静态内容收集到我们配置的目录位置:
(djangoprojectenv)$~/djangoproject/manage.py collectstatic
我们必须确认操作。
然后,静态文件将放在项目目录中称为静态的目录中。
如果我们遵循初始服务器设置教程,则应使用UFW防火墙保护服务器。
为了测试开发服务器,我们必须允许访问我们正在使用的端口。
通过键入来创建端口8000的异常:
(djangoprojectenv)$sudo ufw allow 8000
最后,我们可以通过使用此命令启动Django开发服务器来测试项目:
(djangoprojectenv)$~/djangoproject/manage.py runserver 0.0.0.0:8000
在Web浏览器中,访问服务器的域名或者IP地址,后跟:8000:
http://server_domain_or_IP:8000
我们应该看到Django 2.0.7的默认Django索引页:
如果在地址列中键入http://server_domain_or_ip:8000/admin,则会提示我们使用createSuperUser命令创建的管理用户名和密码:
验证后,我们可以访问默认的Django管理员界面:
当我们完成探索时,在终端窗口中击中"Ctrl-C"以关闭开发服务器。
试验枪手服务项目的能力
在离开我们的虚拟环境之前,我们要做的最后一件事是测试枪手,以确保它可以服务于应用程序。
我们可以通过输入我们的项目目录并使用Gunicorn来加载项目的WSGI模块来执行此操作:
(djangoprojectenv)$cd ~/djangoproject (djangoprojectenv)$gunicorn --bind 0.0.0.0:8000 djangoproject.wsgi
这将在Django开发服务器运行的同一界面上启动鼠标。
我们可以再次回复并测试应用程序。
注意:管理界面不会有任何应用的造型,因为Gunicorn不知道静态CSS内容对此负责。
我们通过使用Python的模块语法指定了Django的WSGI.PY文件的相对目录路径来传递Gunicorn A模块,该路径是我们应用程序的入口点。
在此文件的内部,定义了一个名为应用程序的函数,用于与应用程序进行通信。
完成测试后,在终端窗口中点击Ctrl-C以停止鼠标。
我们现在完成了配置我们的Django应用程序。
我们可以通过打字来返回我们的虚拟环境:
(myprojectenv)$deactivate
将删除提示符中的虚拟环境指示符。
创建鼠标系统服务文件
我们已经测试了Gunicorn可以与我们的Django应用程序互动,但我们应该实现更强大的方式启动和停止应用程序服务器。
要完成此操作,我们将制作一个系统服务文件。
为文本编辑器中的sudo权限创建和打开systemd服务文件:
$sudo nano /etc/systemd/system/gunicorn.service
从"单位""部分开始,用于指定元数据和依赖项。
我们将在此处描述我们的服务,并告诉Init系统仅在达到网络目标后才启动。
接下来,我们将打开"[服务]"部分。
我们将指定要处理以运行的用户和组。
自从拥有所有相关文件,我们将提供我们的常规用户帐户所有权。
我们将为"WWW数据"组提供群组所有权,以便NGINX可以轻松地使用鼠标沟通。
然后,我们将映射工作目录并指定要用于启动服务的命令。
在这种情况下,我们必须指定Gunicorn可执行文件的完整路径,该路径已安装在我们的虚拟环境中。
由于NGINX安装在同一台计算机上,我们将把它绑定到项目目录中的UNIX套接字。
这比使用网络端口更安全且更快。
我们还可以在此处指定任何可选的鼠标调整。
例如,我们在这种情况下指定了3个工作进程。
最后,我们将添加一个[安装]
部分。
这将告诉Systemd将此服务链接到该服务,如果我们启用它以启动启动。
我们希望在常规多用户系统启动并运行时启动此服务:
/etc/systemd/system/gunicorn.service [Unit] Description=gunicorn daemon After=network.target [Service] User=bobby Group=www-data WorkingDirectory=/home/bobby/djangoproject ExecStart=/home/bobby/djangoproject/djangoproject/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/bobby/djangoproject/djangoproject.sock djangoproject.wsgi:application [Install] WantedBy=multi-user.target
通过,我们的系统服务文件已完成。
现在保存并关闭它。
我们应该将Bobby用户添加到www-data组:
$sudo usermod –a –G www-data bobby
我们现在可以启动我们创建的枪手服务并启用它,以便它以启动开始:
$sudo systemctl start gunicorn $sudo systemctl enable gunicorn
我们可以通过检查套接字文件确认操作成功。
检查进程的状态,以了解它是否能够启动:
$sudo systemctl status gunicorn
接下来,检查项目目录中的djangoproject.sock
文件的存在:
$ls /home/bobby/djangoproject Output manage.py djangoproject djangoprojectenv djangoproject.sock static
如果systemctl status命令表明发生错误或者如果我们没有在目录中找到djangoproject.sock
文件,则指示gunicorn无法正确启动。
通过键入:键入鼠标流程日志:
$sudo journalctl -u gunicorn
看看日志中的消息,了解枪手遇到问题的地方。
有许多原因可能遇到问题,但通常,如果枪手无法创建套接字文件,则它是其中一个原因:
- 项目文件由root用户拥有而不是sudo用户拥有
/etc/systemd/system/gunicorn.service
文件中的workingDirectory
路径没有指向项目目录- 给出了"execstart"指令"中的Gunicorn进程的配置选项不正确。检查以下项目:
- Gunicorn二进制指向虚拟环境中二进制的实际位置的路径
--bind
指令定义了一个文件来创建枪手可以访问的目录中- "djangoproject.wsgi:应用程序"是WSGI可调用的准确路径。这意味着当我们在工作指向源时,我们应该能够通过查看"Djangoproject.wsgi"模块(转换为名为"/djangoproject/wsgi.py")的文件来访问可调用的命名应用程序
如果我们对/etc/systemd/system/gunicorn.service文件进行更改,请重新加载守护程序以重新读取服务定义并通过键入键入:
$sudo systemctl daemon-reload $sudo systemctl restart gunicorn
确保在继续之前对上述任何问题进行故障排除。
将nginx配置为代理通行证
既然已经设置了Gunicorn,我们需要将nginx配置为将流量传递给进程。
首先在nginx的中创建和打开新的服务器块 - 可用目录:
$sudo nano /etc/nginx/sites-available/djangoproject
内部,打开一个新的服务器块。
我们将首先指定此块应侦听正常端口80,并且它应该响应我们的服务器的域名或者IP地址。
接下来,我们将告诉Nginx忽略查找Favicon的任何问题。
我们还将其中找到我们在我们的~/djangoproject/static
目录中收集的静态资产的地方。
所有这些文件都有一个"/静态""的标准URI前缀,因此我们可以创建一个位置块以匹配这些请求。
最后,我们将创建一个位置/{}块以匹配所有其他请求。
在此位置的内部,我们将包含Nginx安装中包含的标准proxy_params
文件,然后我们将流量传递给我们的枪手流程创建的套接字:
/etc/nginx/sites-available/djangoproject server { listen 80; server_name server_domain_or_IP; location = /favicon.ico { access_log off; log_not_found off; } location /static/{ root /home/bobby/djangoproject; } location/{ include proxy_params; proxy_pass http://unix:/home/bobby/djangoproject/djangoproject.sock; } }
完成后保存并关闭文件。
现在,我们可以通过将其链接到启用的"站点"目录来启用该文件:
$sudo ln -s /etc/nginx/sites-available/djangoproject /etc/nginx/sites-enabled
通过键入来测试nginx配置是否有语法错误:
$sudo nginx -t
如果没有报告错误,请通过键入键入并重新启动nginx:
$sudo systemctl restart nginx
最后,我们需要将我们的防火墙打开到端口80上的正常流量。
由于我们不再需要访问开发服务器,我们也可以将规则删除到打开端口8000:
$sudo ufw delete allow 8000 $sudo ufw allow 'Nginx Full'
我们现在应该能够转到服务器的域或者IP地址以查看应用程序。