如何使用Postgres、Nginx和Gunicorn安装和配置Django
先决条件
本教程假设您已经使用 Debian 7 或类似的 Linux 发行版(例如 Ubuntu)设置了您的 droplet (VPS)。 如果您还没有这样做,请按照此处设置液滴的教程进行操作。
为方便起见,我将本教程分为两部分。 第一部分(步骤 1 - 6)仅涵盖安装。 如果你是一个更高级的 Django 用户,只需要帮助安装东西,你可以在第 6 步停止。 如果您已经安装了所有内容并且只想知道如何配置所有内容,请跳到第 7 步。 如果您觉得从头到尾都需要帮助,那么只需按顺序完成这些步骤,您应该没有问题。 让我们开始吧!
第一步:更新软件包
在我们做任何事情之前,我们需要确保我们的 VPS 上安装的所有软件包都是最新的。 为此,请通过 SSH 连接到所需的 VPS 并运行以下命令:
sudo apt-get update
sudo apt-get upgrade
第一个命令下载通过 apt-get 管理的软件包的所有更新。 第二个命令安装已下载的更新。 运行上述命令后,如果有要安装的更新,可能会提示您指示是否要安装更新。 如果发生这种情况,只需键入“y”,然后在出现提示时按“回车”。
第二步:安装和创建 Virtualenv
安装 virtualenv 非常简单。 只需运行以下命令:
sudo apt-get install python-virtualenv
这里的所有都是它的! 现在让我们创建我们的 virtualenv,以便我们可以在其中安装 Django 和其他 Python 包:
sudo virtualenv /opt/myenv
请注意,在“/opt”目录中创建了一个新目录“myenv”。 这就是我们的 virtualenv 所在的地方。 确保将“/opt/myenv”替换为您希望安装 virtualenv 的路径。 我通常将我的环境放在 /opt 中,但这是严格的偏好。 有些人在 VPS 的根目录下创建了一个名为“webapps”的目录。 选择对您最有意义的任何方法。
第三步:安装 Django
现在我们需要激活我们的 virtualenv,这样当我们安装 Python 包时,它们就会安装到我们的 virtualenv 中。 这是您激活 virtualenv 的方式:
source /opt/myenv/bin/activate
您现在应该看到“(myenv)”已附加到终端提示符的开头。 如果您在 VPS 上有多个 virtualenv,这将帮助您了解您的 virtualenv 何时处于活动状态以及哪个 virtualenv 处于活动状态。
随着您的 virtualenv 处于活动状态,我们现在可以安装 Django。 为此,我们将使用 pip,一个类似于 easy_install 的 Python 包管理器。 这是您将运行的命令:
pip install django
你现在已经在你的 virtualenv 中安装了 Django! 现在让我们的数据库服务器运行起来。
第四步:安装 PostgreSQL
大多数 Django 用户更喜欢使用 PostgreSQL 作为他们的数据库服务器。 它比 MySQL 更健壮,并且 Django ORM 在 PostgreSQL 上的工作比 MySQL、MSSQL 或其他更好。
由于我们不需要为此部分激活 virtualenv,请运行以下命令来停用:
deactivate
这将始终停用当前处于活动状态的任何 virtualenv。 现在我们需要为 PostgreSQL 安装依赖项以使用以下命令与 Django 一起工作:
sudo apt-get install libpq-dev python-dev
现在你已经完成了这个,像这样安装 PostgreSQL:
sudo apt-get install postgresql postgresql-contrib
PostgreSQL 现在已安装在您的机器上并准备就绪。
第五步:安装 NGINX
NGINX 是一个非常快速和轻量级的 Web 服务器。 我们将使用它为我们的 Django 应用程序提供静态文件。 要安装它,只需运行以下命令:
sudo apt-get install nginx
请记住,您仍然需要启动 NGINX,但是当我们开始配置我们的 VPS 时,我们将对此进行介绍。
第六步:安装 Gunicorn
Gunicorn 是一个非常强大的 Python WSGI HTTP 服务器。 由于它是一个 Python 包,我们需要首先激活我们的 virtualenv 来安装它。 以下是我们的做法:
source /opt/myenv/bin/activate
确保在终端提示符的开头看到添加的“myenv”。 随着您的 virtualenv 现在处于活动状态,运行以下命令:
pip install gunicorn
Gunicorn 现在已安装在您的 virtualenv 中。
如果您只想安装所有东西,请随时停止。 否则,请继续获取有关如何配置所有内容以协同工作并使您的应用程序可供网络上的其他人访问的说明。
第七步:配置 PostgreSQL
让我们从使用 PostgreSQL 开始我们的配置。 使用 PostgreSQL,我们需要创建一个数据库,创建一个用户,并授予我们创建的用户访问我们创建的数据库的权限。 通过运行以下命令开始:
sudo su - postgres
你的终端提示现在应该说“postgres@yourserver”。 如果是这种情况,请运行以下命令来创建您的数据库:
createdb mydb
如果您没有更改命令,您的数据库现已创建并命名为“mydb”。 您可以随意命名数据库。 现在使用以下命令创建您的数据库用户:
createuser -P
您现在将遇到一系列 6 个提示。 第一个会询问您新用户的姓名。 使用您喜欢的任何名称。 接下来的两个提示是输入您的密码和确认新用户的密码。 对于最后 3 个提示,只需输入“n”并点击“enter”。 这只是确保您的新用户只能访问您授予其访问权限的内容,而不能访问其他内容。 现在像这样激活 PostgreSQL 命令行界面:
psql
最后,使用以下命令授予此新用户对新数据库的访问权限:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
您现在有一个 PostgreSQL 数据库和一个用户来访问该数据库。 现在我们可以安装 Django 并将其设置为使用我们的新数据库。
第八步:创建一个 Django 项目
为了更进一步,我们需要一个 Django 项目来进行测试。 这将使我们能够看到我们正在做的事情是否有效。 将目录更改为您的 virtualenv 目录(在我的情况下为 /opt/myenv),如下所示:
cd /opt/myenv
现在确保您的 virtualenv 处于活动状态。 如果您不确定,只需运行以下命令以确保您已激活:
source /opt/myenv/bin/activate
现在您的 virtualenv 处于活动状态,运行以下命令来启动一个新的 Django 项目:
django-admin.py startproject myproject
您应该在 virtualenv 目录中看到一个名为“myproject”的新目录。 这是我们新的 Django 项目文件所在的位置。
为了让 Django 能够与我们的数据库对话,我们需要为 PostgreSQL 安装一个后端。 确保您的 virtualenv 处于活动状态并运行以下命令以执行此操作:
pip install psycopg2
将目录更改为新的“myproject”目录,然后进入它的子目录,也称为“myproject”,如下所示:
cd /opt/myenv/myproject/myproject
使用您选择的编辑器编辑 settings.py 文件:
nano settings.py
找到数据库设置并编辑它们,如下所示:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'mydb', # Or path to database file if using sqlite3. # The following settings are not used with sqlite3: 'USER': 'myuser', 'PASSWORD': 'password', 'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 'PORT': '', # Set to empty string for default. } }
保存并退出文件。 现在向上移动一个目录,这样您就可以进入主 Django 项目目录 (/opt/myenv/myproject)。
cd /opt/myenv/myproject
如果您还没有使用以下命令激活您的 virtualenv:
source /opt/myenv/bin/activate
在您的 virtualenv 处于活动状态时,运行以下命令,以便 Django 可以将其初始配置和其他表添加到您的数据库中:
python manage.py syncdb
您应该会看到一些描述安装了哪些表的输出,然后是询问您是否要创建超级用户的提示。 这是可选的,取决于您将使用 Django 的身份验证系统还是 Django 管理员。
第九步:配置 Gunicorn
Gunicorn 配置非常适合您的应用程序需求。 我将在这里简要介绍一些不同的设置运行 Gunicorn。
首先让我们回顾一下使用默认设置运行 Gunicorn。 这是运行默认 Gunicorn 的命令:
gunicorn_django --bind yourdomainorip.com:8001
请务必将“yourdomainorip.com”替换为您的域,或者您的 VPS 的 IP 地址(如果您愿意)。 现在转到您的网络浏览器并访问 yourdomainorip.com:8001 看看你得到了什么。 您应该会看到 Django 欢迎屏幕。
但是,如果您仔细查看上述命令的输出,您会注意到只启动了一个 Gunicorn 工作者。 如果您在大型 VPS 上启动大型应用程序怎么办? 没有恐惧! 我们需要做的就是像这样修改命令:
gunicorn_django --workers=3 --bind yourdomainorip.com:8001
现在您会注意到启动了 3 个工作人员,而不是只有 1 个工作人员。 您可以将此数字更改为适合您需要的任何数字。
由于我们以 root 身份运行了启动 Gunicorn 的命令,因此 Gunicorn 现在以 root 身份运行。 如果你不想要那个怎么办? 同样,我们可以稍微改变上面的命令以适应:
gunicorn_django --workers=3 --user=nobody --bind yourdomainorip.com:8001
如果您想为 Gunicorn 设置更多选项,那么最好设置一个配置文件,您可以在运行 Gunicorn 时调用该配置文件。 这将导致更短、更容易阅读/配置 Gunicorn 命令。
您可以将 gunicorn 的配置文件放置在您想要的任何位置。 为简单起见,我们将把它放在我们的 virtualenv 目录中。 像这样导航到您的 virtualenv 目录:
cd /opt/myenv
现在用你喜欢的编辑器打开你的配置文件(下面的例子中使用了 nano):
sudo nano gunicorn_config.py
将以下内容添加到文件中:
command = '/opt/myenv/bin/gunicorn' pythonpath = '/opt/myenv/myproject' bind = '127.0.0.1:8001' workers = 3 user = nobody
保存并退出文件。 这些选项的作用是设置 gunicorn 二进制文件的路径,将项目目录添加到 Python 路径,设置绑定 Gunicorn 的域和端口,设置 gunicorn 工作人员的数量并设置 Gunicorn 运行的用户。
为了运行服务器,这次我们需要更长的命令。 在提示符中输入以下命令:
/opt/myenv/bin/gunicorn -c /opt/myenv/gunicorn_config.py myproject.wsgi
你会注意到在上面的命令中我们传递了“-c”标志。 这告诉 gunicorn 我们有一个想要使用的配置文件,我们在“-c”标志之后传入该文件。 最后,我们向 WSGI 文件传递一个 Python 点符号引用,以便 Gunicorn 知道我们的 WSGI 文件在哪里。
以这种方式运行 Gunicorn 需要您在其自己的屏幕会话中运行 Gunicorn(如果您熟悉使用屏幕),或者通过点击“ctrl + z”然后键入“bg”和“enter”all在运行 Gunicorn 命令之后。 这将使进程在后台运行,因此即使在当前会话关闭后它也会继续运行。 如果您的 VPS 重新启动或由于某种原因崩溃,这也带来了需要手动启动或重新启动 Gunicorn 的问题。 为了解决这个问题,大多数人使用 supervisord 来管理 Gunicorn 并根据需要启动/重启它。 安装和配置 supervisord 已在另一篇文章中介绍,可在 here 找到。
最后,这绝不是 Gunicorn 配置选项的详尽列表。 请阅读 gunicorn.org 上的 Gunicorn 文档,了解有关此主题的更多信息。
第十步:配置 NGINX
在我们过于得意忘形之前,让我们首先像这样启动 NGINX:
sudo service nginx start
由于我们只设置 NGINX 来处理静态文件,我们需要首先决定我们的静态文件将存储在哪里。 打开 Django 项目的 settings.py 文件并编辑 STATIC_ROOT 行,如下所示:
STATIC_ROOT = "/opt/myenv/static/"
这条路可以在任何你想要的地方。 但是为了清洁,我通常把它放在我的 Django 项目文件夹之外,但在我的 virtualenv 目录中。
现在您已经设置了静态文件的位置,让我们配置 NGINX 来处理这些文件。 使用以下命令打开一个新的 NGINX 配置文件(您可以将“nano”替换为您选择的编辑器):
sudo nano /etc/nginx/sites-available/myproject
您可以随意命名文件,但标准通常是将其命名为与您正在配置的站点相关的名称。 现在将以下内容添加到文件中:
server { server_name yourdomainorip.com; access_log off; location /static/ { alias /opt/myenv/static/; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; } }
保存并退出文件。 上述配置已将 NGINX 设置为从我们为 Django 项目设置的静态目录中提供 yourdomainorip.com/static/ 请求的任何内容。 在 yourdomainorip.com 请求的任何内容都将代理到端口 8001 上的 localhost,这是我们告诉 Gunicorn 运行的地方。 其他行确保将请求的主机名和 IP 地址传递给 Gunicorn。 没有这个,每个请求的 IP 地址都会变成 127.0.0.1 并且主机名就是你的 VPS 主机名。
现在我们需要在 /etc/nginx/sites-enabled 目录中建立一个指向这个配置文件的符号链接。 这就是 NGINX 知道该站点处于活动状态的方式。 将目录更改为 /etc/nginx/sites-enabled,如下所示:
cd /etc/nginx/sites-enabled
到达那里后,运行以下命令:
sudo ln -s ../sites-available/myproject
这将创建我们需要的符号链接,以便 NGINX 知道遵守我们网站的新配置文件。
此外,删除默认的 nginx 服务器块:
`sudo rm 默认值'
我们需要重新启动 NGINX,以便它知道寻找我们的更改。 为此,请运行以下命令:
sudo service nginx restart
就是这样! 您现在已经安装了 Django 并使用 PostgreSQL,并且您的应用程序可以通过 NGINX 提供静态内容和 Gunicorn 作为您的应用程序服务器进行 Web 访问。 如果您有任何问题或进一步的建议,请务必将其留在评论部分。