先决条件
首先你得先在Digital Ocean上有一台自己的服务器,如果还没有,可参考教程如何在Digital Ocean上申请服务器。
为了方便起见,我将本教程分为两部分。第一部分(步骤1 - 6)仅涵盖安装。如果您是一位更高级的Django用户,只需要帮助就可以安装,可以在第6步停止。如果已经安装了所有内容,并且只想知道如何配置所有内容,请跳到第7步。如果觉得自己喜欢需要从头到尾提供帮助,然后只需按顺序执行这些步骤即可。
本教程的服务器系统以Ubuntu为例,编程语言默认为python2。
如果想将ubuntu系统的默认python替换为python3,请点击Ubuntu如何修改默认python版本为python3。如果已将默认python版本修改为python3,文中以下用到pip命令的地方都自行替换为pip3。
第一步:更新软件包
在我们做任何事情之前,我们需要确保安装在我们VPS(服务器)上的所有软件包都是最新的。为此,先通过SSH连接到所需的VPS并运行以下命令:
不会用SSH连接的同志自觉点击教程:如何为DigitalOcean上的服务器配置SSH密钥
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”。这是我们的虚拟环境存在的地方。确保将“/ opt / myenv”替换为自己希望安装virtualenv的路径。有些会人在VPS的根目录下创建一个名为“webapps”的目录。选择最适合你的方法。
第三步:安装Django
现在我们需要激活我们的virtualenv,这样当我们安装Python包时,它们会安装到我们的virtualenv环境中:
source /opt/myenv/bin/activate
现在应该看到“(myenv)”已被添加到终端提示符的开头。这将帮助我们了解virtualenv是否处于激活状态,以及在VPS上有多个virtualenv时哪个virtualenv处于激活状态。
现在可以安装Django。
pip install django
第四步:安装PostgreSQL
不用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是一款令人难以置信的快速轻量级网络服务器。我们将使用它来为我们的Django应用程序提供我们的静态文件。要安装它,只需运行以下命令:
sudo apt-get install nginx
请记住,你仍然需要启动NGINX,但是当我们开始配置我们的VPS时,我们会继续这样做。
第六步:安装Gunicorn
如果你想直接在服务器上用python manage.py runserver来启动Django的话可以不用安装Gunicorn,但是使用Gunicorn启动服务会使得性能变得更好。
Gunicorn是一个非常强大的Python WSGI HTTP服务器。由于它是一个Python包,我们需要首先激活我们的virtualenv再安装它。
source /opt/myenv/bin/activate
确保在终端提示符的开头看到添加的“myenv”。现在virtualenv处于激活状态,用以下命令安装gunicorn:
pip install gunicorn
Gunicorn现在安装在你的virtualenv。
第七步:配置PostgreSQL
有了PostgreSQL,我们需要创建一个数据库,创建一个用户,并授予我们创建的用户访问权限。通过运行以下命令开始:
sudo su - postgres
终端提示现在应该说“postgres @ yourserver”。如果是这种情况,请运行以下命令来创建数据库:
createdb mydb
数据库现在已经创建,并且如果没有更改该命令,则会命名为“mydb”。现在使用以下命令创建数据库用户:
createuser -P myuser
这时将遇到一系列6个提示。第一个会要求你提供新用户的名字。使用任何你想要的名字。接下来的两个提示是为你的密码和新用户的密码确认。对于最后3个提示,只需输入“n”并点击“enter”。这只是确保新用户只能访问你访问的内容,而不是其他任何内容。现在激活PostgreSQL命令行界面:
psql
最后,使用以下命令授予新用户对新数据库的访问权限:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
退出命令行界面
q
你现在有一个PostgreSQL数据库和一个用户来访问该数据库。现在我们可以安装Django并将其设置为使用我们的新数据库。
第八步:创建一个Django项目
为了更进一步,我们需要一个Django项目来测试。这将使我们能够看到我们正在做的是否在工作。改变目录到你的virtualenv目录(在我的情况下/ opt / myenv),如下所示:
cd /opt/myenv
现在确保virtualenv是激活状态的。如果不确定,只需运行以下命令以确保已激活:
source /opt/myenv/bin/activate
运行以下命令启动一个新的Django项目:
django-admin.py startproject myproject
在virtualenv目录中可以看到多了一个名为“myproject”的新目录。这是我们的新Django项目文件所在的地方。
为了使Django能够与我们的数据库交谈,我们需要为PostgreSQL安装一个后端。确保virtualenv处于激活状态并运行以下命令以执行此操作:
pip install psycopg2
改变目录到新的“myproject”目录,然后进入它的子目录,这也被称为“myproject”,像这样:
cd /opt/myenv/myproject/myproject
使用编辑器编辑settings.py文件:(若数据库使用的不是PostgreSQL,请不要配置)
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处于激活状态时,运行以下命令,以便Django可以将其初始配置和其他表添加到数据库中:
python manage.py syncdb#Django高版本用migrate代替syncdb
应该看到一些输出描述了安装了哪些表,然后提示询问是否要创建超级用户。这是可选的,取决于是否将使用Django的身份验证系统或Django管理员。
第九步:配置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个被启动了。3可以替换为任意数字
由于我们运行命令以root身份启动Gunicorn,因此Gunicorn现在以root身份运行。如果不想要可以稍微改变上面的命令:
gunicorn_django --workers=3 --user=nobody --bind yourdomainorip.com:8001
如果想为Gunicorn设置更多选项,最好设置一个配置文件,可以在运行Gunicorn时调用该文件。这会使读取/配置Gunicorn命令更加简短和容易。
可以在任何想要的地方放置gunicorn的配置文件。为了简单起见,我们将它放在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”标志后传入。最后,我们传递一个Python点符号引用到我们的WSGI文件,以便Gunicorn知道我们的WSGI文件在哪里。
以这种方式运行Gunicorn需要在自己的屏幕会话中运行Gunicorn,或者在运行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/"
路径可以是在任何你想要的地方。
现在已经设置了静态文件的位置,让我们配置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"'; } }
保存并退出文件。在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 default'
我们需要重新启动NGINX,以便它知道要查找我们的更改。为此,请运行以下命令:
sudo service nginx restart
OK!现在已经安装了Django并使用PostgreSQL,并且应用程序可通过NGINX提供静态内容和Gunicorn作为您的应用程序服务器进行网络访问。