将 Django 部署到服务器

Deploying Django to a server

这是对我的原始问题的编辑,该问题是如何将 Django 应用程序成功部署到服务器,因为这是我的第一次。 以下链接是我试过的:

  1. https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04
  2. https://simpleisbetterthancomplex.com/tutorial/2016/10/14/how-to-deploy-to-digital-ocean.html
  3. https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04
  4. https://www.linode.com/docs/web-servers/nginx/deploy-django-applications-using-uwsgi-and-nginx-on-ubuntu-14-04
  5. http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

我严格按照这些内容进行操作,我了解了 ~/myproject/manage.py runserver 0.0.0.0:8000 的部分,但是他们显示导航到端口 8000 上的服务器 ip 地址显示了一个 'It worked' 页面,我没有回复。我也运行

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

uwsgi --http :8000 --wsgi-file test.py,仍然没有反应。

因此,在用头撞墙一段时间后,我决定放弃并跳过那部分,直接结合 NGINX、uWSGI 和我的 Django 应用程序。我刚刚设法让它工作,所以我将在下面 post 详细说明我是如何做到的,希望它可以帮助其他人,因为我发现互联网上的大多数说明都没有解释一些事情我觉得需要解释才能完全理解正在发生的事情。这足以作为一个问题和答案,...


虽然在旁注,我仍然很想知道为什么没有安装网络服务器,我仍然无法访问Django 应用程序运行 与命令runserver,如果你知道,请评论。

那么让我们从在 DigitalOcean 上配置您的 Droplet 开始吧。您使用的 linux 是哪种口味? (Ubuntu 或 Debian 等)以及哪个网络服务器(Nginx 或 Apache2 等) 几个月前,我在 Digitalocean 上设置了一个 Debian Droplet,使用 Apache Web 服务器进行了自己的安装,一切正常 运行。我总是在我的项目库中安装一个 virtualenv,然后 pip 安装我需要的一切。所以我建议回到这种安排,而不是将其置于项目之外。一旦我的结构就位,设置我的 settings.py 文件我的 wsgi.py 文件并收集我的静态文件等,然后我使用迁移等配置我的数据库。最后我配置我的网络服务器以找到项目的位置。在 apache2 中,您需要在 /etc/apache2/sites-available/ 中配置一个 .conf 文件,然后使用 sudo a2ensite .conf 在站点启用中启用它。 nginx 中会有类似的设置,您可能比我过去部署 Angular 个应用程序更了解它。因此,请检查这些主要步骤,看看它是否标记了您可能遗漏的任何内容。

所以经过一段时间摸不着头脑,我设法成功地将我的 Django 应用程序部署到托管在 Digitalocean 上的服务器上,使用 NGINX 和 uWSGI。我不会在这里 post 我的实际服务器的 IP,所以在这个答案中我将使用 10.11.12.13 作为我的 ubuntu 服务器的 IP 地址。我已经尽力回溯了我的步骤,以下按时间顺序排列:

  1. 使用 Ubuntu 16.04.3 x64 没有 'additional options' 在 Digitalocean 上创建了一个 droplet,然后通过电子邮件收到了 root 登录的密码:
  2. 登录新服务器并设置新密码
    ➜ ssh root@10.11.12.13
    更新系统:
    # sudo apt-get update
  3. 添加一个新用户jupiar并赋予其超级用户权限
    # sudo adduser jupiar && usermod -aG sudo jupiar
  4. 切换到用户jupiar
    # su - jupiar
  5. 安装 NGINX 网络服务器
    $ sudo apt-get install nginx
  6. 我在数据科学方面做了很多工作,我的 Django 应用程序使用了很多这些功能,所以我更喜欢使用 Anaconda python 因为它从一开始就更完整,所以在这里下载并安装 Anaconda python:
    $ wget https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86_64.sh
    $ bash Anaconda3-5.0.0.1-Linux-x86_64.sh
    注意在安装中,Anaconda3 安装到 /home/jupiar/anaconda3,我选择 [yes] 让安装程序将安装位置添加到 [=19= 中的 PATH ]
  7. 现在重新启动 bash:
    $ . .bashrc
    $ source .bashrc
  8. 现在我创建了一个python虚拟环境,然后激活它:
    $ conda create -n drfprojectenv python=3.6 anaconda
    $ source activate drfprojectenv
  9. 现在安装Django,然后开始一个新项目
    (drfprojectenv)$ pip install Django
    (drfprojectenv)$ django-admin.py startproject drfproject
  10. 设置数据库:
    (drfprojectenv)$ cd drfproject
    (drfprojectenv)~/drfproject$ ./manage.py migrate
  11. 设置静态目录:
    (drfprojectenv)~/drfproject$ echo 'STATIC_ROOT = os.path.join(BASE_DIR, "static/")' >> drfproject/settings.py
  12. 收集静态文件:
    (drfprojectenv)~/drfproject$ ./manage.py collectstatic
  13. 现在要安装uWSGI,我们需要一些操作系统包来编译C代码,为此uWSGI需要:
    (drfprojectenv)~/drfproject$ sudo apt-get install build-essential python-dev python3-dev
    (drfprojectenv)~/drfproject$ cd
    (drfprojectenv)$ pip install uwsgi
  14. 好的,现在是更有趣的地方了:我们现在需要为我们的 Django 项目创建一个初始化文件 (.ini):
    (drfprojectenv)$ sudo mkdir -p /etc/uwsgi/sites
    -p 刚好可以让我们创建所有必要的父目录)
    (drfprojectenv)$ sudo nano /etc/uwsgi/sites/drfproject.ini
    并在该文件中放置以下内容:

    [uwsgi]
    project = drfproject
    base = /home/jupiar
    
    chdir = %(base)/%(project)
    home = %(base)/Env/%(project)
    module = %(project).wsgi:application
    
    master = true
    processes = 2
    
    socket = %(base)/%(project)/%(project).sock
    chmod-socket = 666
    vacuum = true
    
  15. 现在我们需要创建一个 uWSGI 服务,我们可以通过以下方式实现:
    (drfprojectenv)$ sudo nano /etc/systemd/system/uwsgi.service
    然后在该文件中放置:

    [Unit]
    Description=uWSGI Emperor service
    After=syslog.target
    
    [Service]
    ExecStart=/home/jupiar/anaconda3/envs/drfprojectenv/bin/uwsgi --emperor /etc/uwsgi/sites/drfproject.ini
    Restart=always
    KillSignal=SIGQUIT
    Type=notify
    StandardError=syslog
    NotifyAccess=all
    
    [Install]
    WantedBy=multi-user.target
    
  16. 现在,我们希望 uWSGI 在系统重启时自动启动,并激活服务:
    (drfprojectenv)$ sudo systemctl uwsgi enable
    (drfprojectenv)$ sudo systemctl uwsgi start
    注意,您可能会看到:
    Warning: emperor.uwsgi.service changed on disk. Run 'systemctl daemon-reload' to reload units.
    我们只是 运行:
    (drfprojectenv)$ sudo systemctl daemon-reload

  17. 检查服务 运行ning 是否正确:
    (drfprojectenv)$ sudo systemctl status uwsgi.service
    我们应该在哪里看到类似的东西:

    uwsgi.service - uWSGI Emperor service
        Loaded: loaded (/etc/systemd/system/uwsgi.service; enabled; vendor preset: enabled)
        Active: active (running)
    
    1. 也用这个命令启动服务:
      (drfprojectenv)$ sudo service uwsgi start
    2. 现在我们需要配置 NGINX:
      (drfprojectenv)$ sudo nano /etc/nginx/sites-available/default
      然后放置下面的
    server {
        listen 80;
        server_name _;
    
    
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/drfproject;
    }
    
    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/home/jupiar/drfproject/drfproject.sock;
    }
    
    }
    1. 确保 Django 的 ALLOWED_HOSTS 具有以下 IP 地址的某种组合:
      ALLOWED_HOSTS = ['10.11.12.13', '*', 'localhost', '127.0.0.1']

    2. 现在停止并启动uWSGI服务,并重启nginx:
      (drfprojectenv)$ sudo service uwsgi stop
      (drfprojectenv)$ sudo service uwsgi start
      (drfprojectenv)$ sudo service nginx restart

    3. 大概就是这样,我可以回溯的所有步骤都在那里。您可能还需要做的一件事是在 Anaconda 的全局安装以及虚拟环境中安装 Django 和 uwsgi。
      现在已经正确安装,将它切换到 rest 框架应该很容易。