如何将本地Django应用程序部署到VPS
先决条件
本教程假设您已经使用您选择的操作系统设置了虚拟专用服务器(本教程使用了 Debian 7;Ubuntu 也可以使用)。 如果你还没有这样做,你可以按照这个教程。 在开始之前,请确保您的云服务器已正确配置为托管已安装数据库服务器、Web 服务器和 virtualenv 的 Django 应用程序。 如果您还没有这样做,请按照关于 为 Django 设置服务器的步骤 1 - 6。
第一步:更新软件包
在做任何事情之前,确保通过 apt 管理的所有包或任何您选择的包管理器都是最新的始终是一个好习惯。 您可以通过 SSH 连接到您的 VPS 并运行以下命令来执行此操作:
sudo apt-get update
sudo apt-get upgrade
第一个命令下载通过 apt-get 管理的软件包的所有更新。 第二个命令安装已下载的更新。 运行上述命令后,如果有要安装的更新,可能会提示您指示是否要安装这些更新。 如果发生这种情况,只需键入“y”,然后在出现提示时按“回车”。
第二步:设置你的 Virtualenv
如果您完成了先决条件,则应该已经设置好,您可以跳过此步骤。
现在我们需要设置我们的虚拟环境,我们的项目文件和 Python 包将存在。 如果您不使用 virtualenv,则只需创建 Django 项目所在的目录并移至第三步。
要创建您的 virtualenv,请运行以下命令。 请记住将路径替换为虚拟专用服务器上项目项目的所需路径:
virtualenv /opt/myproject
现在您已经设置了 virtualenv,您可以激活您的 virtualenv 并使用 pip 安装 Django 和您可能需要的任何其他 Python 包。 以下是如何激活您的 virtualenv 并使用 pip 安装 Django 的示例:
source /opt/myproject/bin/activate
pip install django
现在我们已经准备好为我们的项目创建一个数据库了!
第三步:创建数据库
本教程假设您使用 PostgreSQL 作为数据库服务器。 如果没有,您将需要查看有关如何为您选择的数据库服务器创建数据库的文档。
要使用 PostgreSQL 创建数据库,首先运行以下命令:
sudo su - postgres
你的终端提示现在应该说“postgres@yourserver”。 如果是这样,请运行此命令来创建您的数据库,确保将“mydb”替换为您想要的数据库名称:
createdb mydb
现在使用以下命令创建您的数据库用户:
createuser -P
您现在将遇到一系列六个提示。 第一个将询问您新用户的名称(使用您想要的任何名称)。 接下来的两个提示是输入您的密码和确认新用户的密码。 对于最后三个提示,只需输入“n”并按“回车”即可。 这可确保您的新用户只能访问您授予其访问权限的内容,而不能访问其他内容。 现在像这样激活 PostgreSQL 命令行界面:
psql
最后,使用以下命令授予此新用户对新数据库的访问权限:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
您现在设置了一个数据库和一个访问该数据库的用户。 接下来,我们可以配置我们的网络服务器来提供我们的静态文件!
第四步:配置你的 VPS
我们需要为我们的站点创建一个新的配置文件。 本教程假设您使用 NGINX 作为您的云服务器。 如果不是这种情况,您将需要检查您选择的 Web 服务器的文档才能完成此步骤。
对于 NGINX,运行以下命令来创建和编辑站点的 Web 服务器配置文件,确保将命令末尾的“myproject”替换为您的项目名称:
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,您应该设置:
sudo service nginx restart
重新启动时可能会看到以下错误:
server_names_hash, you should increase server_names_hash_bucket_size: 32
您可以通过编辑'/etc/nginx/nginx.conf'来解决这个问题
打开文件并取消注释以下行:
server_names_hash_bucket_size 64;
现在让我们将项目文件推送到我们的 droplet!
第五步:将本地 Django 项目移动到 Droplet
我们在这里有几个选项:FTP、SFTP、SCP、Git、SVN 等。 我们将使用 Git 将您的本地项目文件传输到您的虚拟专用服务器。
找到您设置 virtualenv 的目录或您希望项目所在的目录。 使用以下命令切换到此目录:
cd /opt/myproject
在那里,创建一个新目录,您的项目文件将存放在其中。 您可以使用以下命令执行此操作:
mkdir myproject
拥有两个同名目录似乎是多余的。 但是,它使您的 virtualenv 名称和项目名称相同。
现在使用以下命令切换到新目录:
cd myproject
如果您的项目已经在 Git 存储库中,只需确保您的代码全部提交并推送。 您可以通过在终端(对于 Mac)或命令提示符(对于 PC)中本地运行以下命令来检查是否是这种情况:
git status
如果您在输出中没有看到任何文件,那么您应该一切顺利。 现在通过 SSH 连接到您的 droplet 并使用以下命令安装 Git:
sudo apt-get install git
确保通过输入“y”并点击“enter”对任何提示回答“是”。 安装 Git 后,使用以下命令将项目文件拉入项目目录:
git clone https://webaddressforyourrepo.com/path/to/repo .
如果您使用 Github 或 Bitbucket 托管 Git,则可以使用 clone 按钮来获取此命令。 一定要加上“。” 在末尾。 如果我们不这样做,那么 Git 将在您的项目目录中创建一个带有 repo 名称的目录,这是您不想要的。
如果您不使用 Git,则使用 FTP 或其他传输协议将文件传输到上述步骤中创建的项目目录。
现在剩下的就是设置您的应用服务器!
第六步:安装和配置应用服务器
如果您完成了先决条件,则应该已经设置好,您可以跳过此步骤。
现在我们需要安装我们的应用服务器并确保它在端口 8001 上侦听对我们的 Django 应用的请求。 我们将在此示例中使用 Gunicorn。 要安装 Gunicorn,首先激活你的 virtualenv:
source /opt/myproject/bin/activate
一旦您的 virtualenv 处于活动状态,运行以下命令来安装 Gunicorn:
pip install gunicorn
现在 Gunicorn 已安装,将您的域或 ip 的请求绑定到端口 8001:
gunicorn_django --bind yourdomainorip.com:8001
现在你可以点击“ctrl + z”然后输入“bg”来后台进程(如果你愿意的话)。 Gunicorn的更高级配置和设置可以在本教程的步骤九中找到。
现在您已准备好进行最后一步!
第七步:配置你的应用
最后一步是配置您的应用程序以进行生产。 我们需要进行的所有更改都在您的 Django 项目的“settings.py”文件中。 使用以下命令打开此文件:
sudo nano /opt/myproject/myproject/settings.py
设置文件的路径可能因项目的设置方式而异。 相应地修改上面命令中的路径。
打开设置文件后,将 DEBUG 设置更改为 False:
DEBUG = False
这将使错误向用户显示为 404 或 500 个错误页面,而不是为他们提供带有调试信息的堆栈跟踪。
现在编辑您的数据库设置,如下所示,使用您的数据库名称、用户和密码,而不是如下所示:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.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': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 'PORT': '', # Set to empty string for default. } }
现在编辑您的静态文件设置:
STATIC_ROOT = '/opt/myproject/static/' STATIC_URL = '/static/'
保存并退出文件。 现在我们需要做的就是收集我们的静态文件。 切换到“manage.py”脚本所在的目录并运行以下命令:
python manage.py collectstatic
该命令会将所有静态文件收集到我们在上面的 settings.py 文件中设置的目录中。
就是这样! 您现在已经将您的应用程序部署到生产环境并准备就绪。