先决条件
本教程假设您已经在Debian 7或类似的Linux发行版(如Ubuntu)上设置了您的droplet(VPS)。如果您还没有这样做,请按照此处的设置droplet的教程进行操作。
为方便起见,我将本教程分为两个部分。第一部分(步骤1-6)仅涵盖安装过程。如果您是一个更高级的Django用户,只需要帮助安装东西,您可以在第6步停下来。如果您已经安装了所有内容,只想知道如何配置一切,那么可以直接跳到第7步。如果您觉得需要从头到尾获得帮助,那么请按顺序进行步骤,您应该不会遇到问题。让我们开始吧!
第一步:更新软件包
在我们做任何事情之前,我们需要确保我们的VPS上安装的所有软件包都是最新的。为了做到这一点,通过SSH连接到您的VPS,并运行以下命令:
sudo apt-get update sudo apt-get upgrade
第一条命令下载通过apt-get管理的软件包的任何更新。第二条命令安装下载的更新。运行上述命令后,如果有更新可供安装,您可能会被提示是否要安装更新。如果发生这种情况,只需输入“y”,然后在提示时按“enter”。
第二步:安装并创建Virtualenv
安装virtualenv非常简单。只需运行以下命令:
sudo apt-get install python-virtualenv
就是这样!现在让我们创建我们的virtualenv,这样我们就可以在其中安装Django和其他Python软件包:
sudo virtualenv /opt/myenv
注意,在“/opt”目录中创建了一个名为“myenv”的新目录。这就是我们的virtualenv所在的位置。请确保用您想要安装virtualenv的路径替换“/opt/myenv”。我通常将我的env放在/opt中,但这纯粹是个人偏好。有些人在VPS的根目录下创建一个名为“webapps”的目录。选择对您来说最合理的方法。
第三步:安装Django
现在我们需要激活我们的virtualenv,这样当我们安装Python软件包时,它们会安装到我们的virtualenv中。这是如何激活您的virtualenv:
source /opt/myenv/bin/activate
现在您应该看到您的终端提示的开头附加了“(myenv)”。这将帮助您知道您的virtualenv何时处于活动状态,以及如果您在VPS上有多个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。现在我们需要安装与Django一起使用的PostgreSQL的依赖项,使用以下命令:
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 项目进行测试。这将使我们能够查看我们所做的工作是否有效。像这样更改目录到您的虚拟环境目录(在我的情况下是 /opt/myenv):
cd /opt/myenv
现在确保您的虚拟环境处于活动状态。如果您不确定,只需运行以下命令以确保您已激活:
source /opt/myenv/bin/activate
现在您的虚拟环境已经激活,请运行以下命令以开始一个新的 Django 项目:
django-admin.py startproject myproject
您应该会在您的虚拟环境目录中看到一个名为 “myproject” 的新目录。这是我们的新 Django 项目文件所在的地方。
为了使 Django 能够与我们的数据库通信,我们需要安装一个用于 PostgreSQL 的后端。确保您的虚拟环境处于活动状态,并运行以下命令以执行此操作:
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
如果您还没有激活您的虚拟环境,请使用以下命令激活:
source /opt/myenv/bin/activate
在您的虚拟环境处于活动状态时,运行以下命令,以便 Django 可以将其初始配置和其他表添加到您的数据库中:
python manage.py syncdb
您应该会看到一些输出,描述安装了哪些表,然后会提示您是否要创建超级用户。这是可选的,取决于您是否将使用 Django 的身份验证系统或 Django 管理界面。
第九步:配置 Gunicorn
Gunicorn 的配置非常特定于您的应用程序的需求。我将简要介绍在这里使用一些不同设置运行 Gunicorn。
首先,让我们仅仅介绍使用默认设置运行 Gunicorn。以下是仅运行默认 Gunicorn 的命令:
gunicorn_django --bind yourdomainorip.com:8001
确保用您的域名或者 VPS 的 IP 地址替换 “yourdomainorip.com”。现在转到您的网络浏览器,访问 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 的配置文件放在任何您喜欢的地方。为简单起见,我们将其放在我们的虚拟环境目录中。像这样导航到您的虚拟环境目录:
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” 标志之后传递了它。最后,我们传递了一个 Python 点符号引用我们的 WSGI 文件,以便 Gunicorn 知道我们的 WSGI 文件在哪里。
以这种方式运行 Gunicorn 需要您在自己的 screen 会话中运行 Gunicorn(如果您熟悉使用 screen),或者在运行 Gunicorn 后立即按 “ctrl + z” 并输入 “bg” 和 “enter” 将进程放入后台,以便它在当前会话关闭后继续运行。这也带来了一个问题,即如果您的 VPS 被重新启动或因某种原因崩溃,您需要手动启动或重新启动 Gunicorn。为了解决这个问题,大多数人使用 supervisord 来管理 Gunicorn 并根据需要启动/重新启动它。安装和配置 supervisord 已在另一篇文章中进行了介绍,可以在这里找到。
最后,这绝不是 Gunicorn 的配置选项的详尽列表。请阅读 gunicorn.org 上找到的 Gunicorn 文档以获取更多信息。
第十步:配置 NGINX
在我们继续之前,让我们首先启动 NGINX,命令如下:
sudo service nginx start
由于我们只是设置 NGINX 来处理静态文件,我们需要首先决定静态文件的存储位置。打开你的 Django 项目的 settings.py 文件,并编辑 STATIC_ROOT 行,使其如下所示:
STATIC_ROOT = "/opt/myenv/static/"
这个路径可以放在任何你喜欢的地方。但为了整洁起见,我通常将其放在 Django 项目文件夹的外部,但在虚拟环境目录内部。
现在,你已经设置了静态文件的存放位置,让我们配置 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端口,这是我们告诉 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 default
我们需要重新启动 NGINX,以便它知道要查找我们的更改。要做到这一点,请运行以下命令:
sudo service nginx restart
就是这样!现在你已经安装了 Django,并且与 PostgreSQL 配合工作,你的应用程序通过 NGINX 提供静态内容,并且 Gunicorn 作为你的应用程序服务器。如果你有任何问题或进一步的建议,请务必在评论区留言。