zoukankan      html  css  js  c++  java
  • 使用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作为您的应用程序服务器进行网络访问。

                

  • 相关阅读:
    git 实践(二) push的使用
    git 实践(一) pull的使用
    redux项目实战应用笔录
    浅谈ES6的Object.assign()浅拷贝
    React下reducer中处理数组&&对象的赋值改动
    git pull与git clone
    (0)网络编程基础(网络基本知识)
    (1)什么是socket(套接字)
    (12)异常处理
    (11)类的内置函数
  • 原文地址:https://www.cnblogs.com/zhuminghui/p/9038949.html
Copyright © 2011-2022 走看看