使用Nginx和Gunicorn部署Django项目

Django实践以及服务器部署

  • Django的安装以及环境配置可以通过 Django入门与实践 来学习。

  • Django入门指南

常见命令

  • 数据库移植
python manage.py makemigrations
python manage.py migrate
  • 创建超级管理员
python manage.py createsuperuser
  • 启动服务器

    python manage.py runserver(默认是8000端口)

     

  • 导出数据

    python manage.py dumpdata appname > appname.json
    python manage.py loaddata appname.json

     

  • 清空数据库

    python manage.py flush

     

  • Django项目环境终端

    python manage.py shell

     

  • 数据库命令行

    python manage.py dbshell

     

  • 创建新项目

    django-admin startproject project_name

     

  • 创建新App

    python manage.py startapp app_name

     

项目结构

Painting

mainapp

init.py

migrations

admin.py

apps.py

forms.py

models.py

serializers.py

tests.py

urls.py

views.py

media

Painting

init.py

settings.py

urls.py

wsgi.py

static

db.sqilte3

manage.py

requirements.txt

  • Painting

    • settings.py:app配置文件。

    • urls.py:URL配置文件,配置页面URL。

    • wsgi.py:python服务器网关接口。

  • manage.py:项目与命令行交互,项目管理器。

  • db.sqlite3:数据库

  • media:存储图片,音乐

  • static:存储静态文件,比如.jsp,.html,.css。

  • migrations:数据库移植模块,自动生成。

  • mainapp

    • admin.py:后台管理系统配置

    • apps.py:

    • models.py:数据库建立代码

    • forms.py:表结构代码

    • serializers.py:序列化数据

    • tests.py:自动化测试模块

    • urls.py:前端URL

    • views.py:执行响应的逻辑代码

简单小例子

  • 建立一个博客系统,需要进行一下代码编码。

    • models.py

    class Blog(models.Model):
        BlogId = models.CharField(max_length=100, primary_key=True)  # Id
        BlogName = models.CharField(max_length=30)  # 博客名
        Author = models.CharField(max_length=30)  # 作者
    ​
        def __str__(self):
            return self.BlogId
    • serializers.py

    class BlogSerializer(serializers.ModelSerializer):
        class Meta:
            model = Blog
            fields = '__all__'
    • views.py

    class BlogSet(viewsets.ModelViewSet):
        queryset = Blog.objects.all()
        serializer_class = BlogSerializer
    • myBlog/urls.py

    url(r'blog/$',views.BlogSet)
    • settings.py

    INSTALLED_APPS = ['myBlog']
    
    LANGUAGE_CODE 设置为'zh_hans',也可以设置为'zh-Hans',但是在部署的时候第二个会出错,建议第一个。
    • blog/urls.py

    url(r'',include('myBlog.urls',namespqce='myBlog))

     

  • 以上代码就是建立一个博客系统,没有前端,可以通过127.0.0.1:8000/blog访问,返回json对象。

  • 访问static/media文件

    • settings.py

      STATIC_URL = '/static/'
      MEDIA_URL = '/media/'
      MEDIA_ROOT = os.path.join(BASE_DIR,'media')
      STATIC_ROOT = os.path.join(BASE_DIR,'static')

       

    • blog/urls.py

      url(r'^static/(?P.*)$', serve, {'document_root': settings.STATIC_ROOT}),
      url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

       

  • 以上就是编写简单的博客系统,下面讲解一下将博客系统部署到云服务器上,生产上线。

使用Nginx和Gunicorn部署Django项目

  • 满足条件

    • 可以通过外网访问的服务器

    • 域名(当然没有域名也可以,直接通过IP进行访问)

搭建服务器

  • 本教程使用的本地环境是Windows10,服务器环境为Ubuntu 16.01(64位)。

安装软件

  • 不懂Linux命令的可以先查看一下基本的使用命令。
  • 新的服务器的用户是root,我们需要新建一个拥有超级权限的新用户。
#在root下创建一个新用户,wangyufei是用户名
root@localhost:~# useradd -m -s /bin/bash wangyufei
​
#把新创建的用户加入到超级权限组
root@localhost:~# usermod -a -G sudo wangyufei
​
#为新用户设置密码
root@localhost:~# passwd wangyufei
​
#切换到新用户
root@localhost:~# su - wangyufei
​
#切换成功,注意到root已经变为wangyufei了
wangyuyfei@localhost:~$

 

  • 如果是新服务器的话,需要更新一下系统。

    wangyuyfei@localhost:~$ sudo apt-get update
    wangyuyfei@localhost:~$ sudo apt-get upgrade

     

  • 安装软件,用到的软件有NginxGitpipDjangovirtualenvAnaconda

    #安装Anaconda,找到最新的Anaconda版本https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
    ​
    #下载
    wangyuyfei@localhost:~$ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.0.1-Linux-x86_64.sh
    ​
    #安装
    wangyuyfei@localhost:~$ bash Anaconda3-5.0.1-Linux-x86_64.sh
    ​
    #Linux里面默认的是python2.7,我们需要切换到python3.6
    wangyuyfei@localhost:~$ echo 'export PATH="/home/hqy/anaconda2/bin:$PATH"' >> ~/.bashrc
    wangyuyfei@localhost:~$ source ~/.bashrc
    #检查一下,看是否是python3.6
    wangyuyfei@localhost:~$ python --version
    ​
    #安装Nginx
    wangyuyfei@localhost:~$ sudo apt-get install nginx
    ​
    #安装git
    wangyuyfei@localhost:~$ sudo apt-get install git
    ​
    #安装pip
    wangyuyfei@localhost:~$ sudo apr-get install python3-pip
    ​
    #安装virtualenv
    wangyuyfei@localhost:~$ sudo pip install virtualenv(可能需要更新pip,使用命令更新)
    ​
    #安装Django
    sudo pip install django

     

解析域名

  • 将域名和服务器的IP地址绑定后,可以通过域名访问服务器。

启动Nginx服务

  • Nginx是用来处理静态文件请求的,比如说访问一个博客文章的页面时,服务器会收到两种请求:

    • 显示文章的详细信息,这些信息保存在数据库中

    • 图片、CSS、js等存在服务器某个文件夹下的静态文件。

  • 前面我们已经安装了Nginx,并且域名已经和IP地址绑定了,运行下面的命令启动Nginx服务:

    wangyuyfei@localhost:~$ sudo service nginx start(这里需要注意一下,服务器需要开放80端口,外网才能进行访问)

    在浏览器输入域名,看到如下页面说明Nginx启动成功了。

使用Nginx和Gunicorn部署Django项目_第1张图片

部署代码

部署前的配置

  • Django项目中会有一些CSS、JS等静态文件,这个目录通常位于根目录下,命名为static,需要在项目的settings.py里做一些配置。

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR,'static)#指明静态文件的收集目录

    为了安全起见,在生产环境下关闭DEBUG选项以及设置允许访问的域名。

    DEBUG = False
    ALLOWED_HOSTS = ['127.0.0.1','localhost','39.105.110.19']

    ALLOWED_HOSTS是允许访问的域名列表,前两个是本地域名,最后一个是服务器IP地址。

    项目还会依赖一些第三方python库,为了在服务器上安装,我们需要将全部依赖写入requirements.txt文件中激活本地的虚拟环境,进入项目的根目录,运行pip freeze >requirements.txt命令。

    E:\Painting>
    pip freeze > requirements.txt

    这时项目的根目录下会生成一个requirement.txt的文本文件,里面是项目的所有依赖。

将代码上传到Github

  • 这里对于大多数人来说已经很熟悉了。

    git add .
    git commit -m "blog"
    git push origin master

     

设置服务器目录结构

  • 我的服务器上存放代码的目录结构是这样的:

    /home/wangyufei
        sites/
            39.105.110.19/
                env/    #python虚拟环境目录
                Painting/   #项目目录

    运行下面的命令:

    wangyuyfei@localhost:~$ mkdir -p ~/sites/39.105.110.19
    

    创建虚拟环境,进入到39.105.110.19目录下,运行virtualenv命令创建虚拟环境:

    wangyuyfei@localhost:~$ cd ~/sites/39.105.110.19
    wangyuyfei@localhost:~/sites/39.105.110.19$ virtualenv --python=python3 env

    检查一下虚拟环境是否创建成功,运行ls命令查看,看到env这个文件夹说明虚拟环境创建成功。

    wangyuyfei@localhost:~/sites/39.105.110.19$ ls
    env

    接着从代码仓库把项目拉取下来,git clone后面的地址换成自己项目的仓库地址。

    wangyuyfei@localhost:~/sites/39.105.110.19$ git clone https://github.com/wangyufei1006/Painting.git

    运行ls命令检查是否拉取成功。

    wangyuyfei@localhost:~/sites/39.105.110.19$ ls
    AICopyBook env

     

安装项目依赖

  • 激活虚拟环境,再进入到项目根目录,安装项目的全部依赖:

    wangyuyfei@localhost:~/sites/39.105.110.19$ source env/bin/activate
    (env) wangyuyfei@localhost:~/sites/39.105.110.19$ cd Painting/
    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ pip install -r requirements.txt 

     

收集静态文件

  • 虚拟环境下继续运行python manage.py collectstatic命令收集静态文件到static目录下:

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ python manage.py collectstatic

     

生成数据库

  • 虚拟环境下运行python manage.py migrate命令创建数据库文件:

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ python manage.py migrate

     

创建超级用户

  • 虚拟环境下运行python manage.py createsuperuser命令创建一个超级用户,方便进入Django管理 后台。

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ python manage.py createsuperuser

     

配置Nginx

  • 先在服务器的/etc/nginx/sites-available/目录下新建一个配置文件sudo vim 39.105.110.19,文件名设置为域名,写上下面的配置内容:

    /etc/nginx/sites-available/39.105.110.19
    
    server {
        charset utf-8;
        listen 80;
        server_name 39.105.110.19;	#服务器域名
        
        location /static {
            alias /home/wangyufei/sites/39.105.110.19/Painting/static		#指明静态文件存放目录
        }
        
        location / {
            proxy_set_header Host $host;
            proxy_pass http://unix:/tmp/39.105.110.19.socket; 	#使用Unix套接字,防止端口冲突
        }
    }

    接下来需要创建一个符号链接,把这个配置文件加入到启用的网站列表中去,被启用网站的目录在/etc/nginx/sites-enabled/,具体命令如下:

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ sudo ln -s /etc/nginx/sites-available/39.105.110.19 /etc/nginx/sites-enabled/39.105.110.19

     

使用Gunicorn

  • Gunicorn一般用来管理多个进程。

  • 在虚拟环境下,安装Gunicorn:

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ pip install gunicorn

     

  • 用Gunicorn启动服务器进程:

    (env) wangyuyfei@localhost:~/sites/39.105.110.19/Painting$ gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application

    浏览器输入域名,可以看到访问成功了。

   注意:此时如果访问到的还是Nginx的欢迎界面,需要删除/etc/nginx/sites_available/default/etc/nginx/sites_enabled/default

自启动Gunicorn

  • 现在Gunicorn是我们手动启动的,万一哪天服务器重启了我们又得手工启动。为此写一个脚本,当服务器重新启动后,脚本会帮我们重启Gunicorn,按Ctrl+c停止服务器进程。

    写一个启动脚本,脚本位于/etc/init目录下,且脚本文件名必须以.conf结尾:

    /etc/init/gunicorn-39.105.110.19.conf
    
    start on net-device-up	#在服务器联网时才启动gunicorn
    stop on shutdown	
    
    respawn		#重启gunicorn
    
    setuid wangyufei	#用户名
    chdir /home/wangyufei/static/39.105.110.19/Painting	#进入到指定目录
    
    exec ../env/bin/gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application	#执行进程

    通过start命令启动gunicorn:

    sudo start gunicorn-39.105.110.19

    以后代码更新了,只要运行下面的命令重启一下Nginx和Gunicorn可以使新的代码生效了:

    sudo service nginx reload 
    sudo restrt gunicorn-39.105.110.19

     

  • 还有另外一种方法也可以实现自启动:

# 新建目录
sudo mkdir -p /usr/lib/systemd/system

# 新建自启动的服务文件
sudo vim /usr/lib/systemd/system/39.105.110.19.service
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=wangyufei
# 你的目录
WorkingDirectory=/home/wangyufei/sites/39.105.110.19/Painting
# gunicorn启动命令
ExecStart=/home/wangyufei/sites/env/bin/gunicorn --bind unix:/tmp/39.105.110.19.socket Painting.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl start 39.105.110.19

# 添加服务到开机自动运行
sudo systemctl enable 39.105.110.19.service

# 查看进程,看看gunicorn是否已经启动,有两个进程
ps -ef | grep gunicorn

好了,基本的部署到生产中已经完成了,可以通过域名或者IP地址访问了。不懂的欢迎大家留言或者查看我的项目代码。

Github欢迎star。

你可能感兴趣的:(使用Nginx和Gunicorn部署Django项目)