将Django部署到服务器

时间:2017-10-09 10:55:55

标签: django django-rest-framework web-deployment

这是我原始问题的编辑,这是如何将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
  6. 我跟着这些信件,我到了~/myproject/manage.py runserver 0.0.0.0:8000的部分,然后他们显示导航到端口8000上的服务器IP地址显示一个'It working'页面,我得不到回复。我也跑了

    # 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应用程序结合起来。我只是设法让它工作,所以我将在下面发布一个详细的解决方案,我将如何做到这一点,希望它可以帮助其他人,因为我发现互联网上的大部分说明都没有解释我认为需要解释的事情完全理解发生了什么。这足以作为问答,......

    虽然在旁注,我仍然感兴趣,为什么没有安装网络服务器,我仍然无法访问使用该命令运行的Django应用程序runserver,如果您知道,请发表评论。

2 个答案:

答案 0 :(得分:0)

让我们先来看看DigitalOcean上Droplet的配置。您使用的是哪种Linux版本? (Ubuntu或Debian等)和哪个webserver(Nginx或Apache2等) 几个月前我在Digitalocean上设置了一个Debian Droplet,用Apache webserver做我自己的安装,它运行良好。我总是在我的项目库中安装virtualenv并点击安装我需要的所有内容。所以我建议回到这个安排,而不是把它放在项目的外部。一旦我的结构到位,将我的settings.py文件设置为我的wsgi.py文件并收集了我的静态文件等,然后我使用迁移等配置我的数据库。然后我配置我的网络服务器以找到项目的位置。在apache2中,您需要在/ etc / apache2 / sites-available /中配置.conf文件,然后使用sudo a2ensite .conf在启用的站点中启用它。在nginx中会有类似的设置,你可能比我过去部署Angular应用程序更了解它。因此,请检查这些主要步骤,看看它是否标记了您可能错过的任何内容。

答案 1 :(得分:0)

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

  1. 使用Ubuntu 16.04.3 x64在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]让安装程序在.bashrc <中将安装位置添加到PATH / em>
  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,我们需要一些操作系统包,以便编译uWSGI需要的C代码:
    (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. 检查服务是否正常运行:
    (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
      然后放置以下
    3. 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。
        现在已正确安装,将其切换到其余框架应该非常轻松。