使用Postgres,Nginx和Gunicorn将Django配置到服务器上

先决条件

  首先你得先在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作为您的应用程序服务器进行网络访问。

            

原文地址:https://www.cnblogs.com/zhuminghui/p/9038949.html