代码之家  ›  专栏  ›  技术社区  ›  jupiar

将Django部署到服务器

  •  3
  • jupiar  · 技术社区  · 7 年前

    这是对我最初问题的编辑,问题是如何将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

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


    另一方面,我仍感兴趣的是,为什么在没有安装Web服务器的情况下,我仍然无法访问使用该命令运行的Django应用程序 runserver ,如果你知道,请评论。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jupiar    7 年前

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

    1. 登录新服务器并设置新密码
      ➜ ssh root@10.11.12.13

      # sudo apt-get update
    2. 添加新用户 朱比尔 并授予其超级用户权限
      # sudo adduser jupiar && usermod -aG sudo jupiar
    3. 切换到用户
      # su - jupiar
    4. 安装NGINX-webserver
      $ sudo apt-get install nginx

    5. $ 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
    6. 现在重新启动bash:
      $ . .bashrc
      $ source .bashrc
    7. 现在,我创建了一个python虚拟环境,然后将其激活:
      $ conda create -n drfprojectenv python=3.6 anaconda
      $ source activate drfprojectenv
    8. 现在安装Django,然后启动一个新项目
      (drfprojectenv)$ pip install Django
      (drfprojectenv)$ django-admin.py startproject drfproject
    9. 设置数据库:
      (drfprojectenv)$ cd drfproject
      (drfprojectenv)~/drfproject$ ./manage.py migrate
    10. 设置静态目录:
      (drfprojectenv)~/drfproject$ echo 'STATIC_ROOT = os.path.join(BASE_DIR, "static/")' >> drfproject/settings.py

    11. (drfprojectenv)~/drfproject$ ./manage.py collectstatic
    12. 现在要安装uWSGI,我们需要几个操作系统包来编译C代码,uWSGI需要:
      (drfprojectenv)~/drfproject$ sudo apt-get install build-essential python-dev python3-dev
      (drfprojectenv)~/drfproject$ cd
      (drfprojectenv)$ pip install uwsgi
    13. 好的,现在有点有趣了:我们现在需要为Django项目创建一个初始化文件(.ini):
      (drfprojectenv)$ sudo mkdir -p /etc/uwsgi/sites
      (The -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
      

    14. (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
      
    15. 现在,我们希望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

    16. 使用以下工具检查服务是否正常运行:
      (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_主机具有以下ip地址的某些组合:
        ALLOWED_HOSTS = ['10.11.12.13', '*', 'localhost', '127.0.0.1']

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

      3. 大致就是这样,我可以回溯的所有步骤都在那里。您可能还需要做的一件事是在Anaconda的全局安装上以及在虚拟环境中安装Django和uwsgi。

        2
  •  0
  •   cander    7 年前

    让我们从DigitalOcean上的水滴配置开始。你使用的是哪种风格的linux?(Ubuntu或Debian等)和哪个Web服务器(Nginx或Apache2等)