最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Django2:Web项目开发入门笔记(14)

Django教程 小楼一夜听春语 4020浏览 0评论

这一篇教程,我们继续了解如何将Django项目部署到Web服务器。

既然是将项目部署到服务器,就需要有项目内容,例如把《Django2:Web项目开发入门笔记(10)》和《Django2:Web项目开发入门笔记(11)》部署到服务器上。

除此之外,如果拥有一个域名就更好了,将域名解析到主机的IP地址上,就能够通过域名进行访问了。

这里,我使用的域名是:www.qqtbb.com。

接下来,我们通过命令先给文件夹/var/www赋予可读写的权限。

执行命令:
sudo chmod 777 /var/www

然后,通过WinSCP将项目文件夹以及里面的内容上传到/var/www这个文件夹中。

注意,项目文件夹的名称是“MyWeb”,在这个文件夹中还有一个同名文件夹“MyWeb”,不要把这两个搞混。

在上面的图中,大家能够看到新建了“static”和“media”两个文件夹。

这两个文件夹的使用,需要在“settings.py”文件中添加配置。

示例代码:

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

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

提示:在“settings.py”文件的末尾已经包含了第一句代码,我们只需要加上后面3句代码就可以了。

三、创建配置文件

执行命令:
sudo vi /etc/apache2/sites-available/MyWeb.conf

在vi编辑器中写入配置文件内容。

配置文件内容:

<VirtualHost *:80>
        ServerName qqtbb.com  # 服务器名称
        ServerAlias www.qqtbb.com  # 服务器别名
        ServerAdmin 4907442@qq.com  # 管理员邮箱
        WSGIScriptAlias / /var/www/MyWeb/MyWeb/wsgi.py  # WSGI文件路径
        Alias /media/ /var/www/MyWeb/media/  # 媒体文件目录名称与路径
        Alias /static/ /var/www/MyWeb/static/  # 静态文件目录名称与路径

        <Directory /var/www/MyWeb/media>  # 媒体文件目录
                Require all granted  # 目录权限:准许所有请求
        </Directory>

        <Directory /var/www/MyWeb/static>  # 静态文件目录
                Require all granted
        </Directory>

        <Directory /var/www/MyWeb/MyWeb/>  # WAGI文件目录
                <Files wsgi.py>  # 文件权限设置
                        Require all granted  # 准许所有请求
                </Files>
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error-MyWeb.log  # 错误日志存放位置与名称
        CustomLog ${APACHE_LOG_DIR}/access-MyWeb.log combined  # 指令设置日志文件存放位置、名称与格式
</VirtualHost>

提示:使用时请删掉注释内容。

完成编辑后,按“ESC”键退出编辑模式,并输入“:wq”后按回车键保存退出。

接下来,我们让配置文件生效。

在目录/var/www/中默认有一个html文件夹,里面有一个文件“index.html”。

此时,我们通过域名或者ip地址访问站点,能够看到打开的是“Apache2 Ubuntu Default Page”这个页面,也就是“index.html”的文件内容。

那么,如何让我们的项目能够访问呢?

在/etc/apache2/sites-available/文件夹中包含了一个名为“000-default.conf”的配置文件,就是这个文件在起作用,所以访问时打开了“html”文件夹中的页面。

我们需要让我们刚刚添加的配置文件生效,并且禁用默认的配置文件。

执行命令:
sudo service apache2 reload
sudo a2dissite 000-default.conf && sudo a2ensite MyWeb.conf
sudo service apache2 restart

执行完上述命令,我们新建的配置文件就生效了。

这个时候,你会掉进一个大坑!

第20个坑:此时会报“Job for apache2.service failed because the control process exited with error code. See “systemctl status apache2.service” and “journalctl -xe” for details.”的错误,这个错误基本上搜索不到正确的解决方案。产生这个错误首先可能是配置文件内容有问题,导致Apache加载后不能正常工作;再有,就是没有添加一个必须的文件“wsgi.load”,不知道为什么,网上的教程都没提到这个文件的添加。

接下来,我们添加“wsgi.load”文件。

执行命令:
sudo vi /etc/apache2/mods-available/wsgi.load

在vi编辑器中,我们添加如下内容:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

添加完毕之后,我们保存退出。

然后,进入图形界面中,打开/etc/apache2/mods-available/文件夹,在“wsgi.load”文件上点击鼠标右键,发送到【Send To】桌面快捷方式【Desktop(Create Link)】。

回到命令行,我们把这个快捷方式放入/etc/apache2/mods-enabled/文件夹中。

执行命令:
cd /home/ubuntu/Desktop
sudo mv wsgi.load /etc/apache2/mods-enabled/wsgi.load

完成快捷方式的创建,我们就可以再次尝试启动服务器。

执行命令:
sudo a2dissite 000-default.conf && sudo a2ensite MyWeb.conf
sudo service apache2 restart

提示:如果添加了“wsgi.load”文件和快捷方式之后,重启Apache还报同样错误的话,那就需要检查配置文件是否内容有问题。

到这里,通过域名或者ip地址,就能够访问我们的项目了。

不过这个时候,如果访问后台的话,会发现后台没有样式。

这是因为样式文件都在Django的目录中,没有放到我们项目的目录中。

我们需要进行以下处理。

在项目目录下执行python命令:python manage.py collectstatic

这个命令能够把Django目录中的样式文件复制到“static”文件夹中。

然后,打开“urls.py”文件,添加新的URL分发配置,让请求静态文件的URL能够被正确处理。

示例代码:

from django.views.static import serve
re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})

这样处理之后,Django的后台界面就又变得很漂亮了。

四、使用虚拟环境

如果使用虚拟环境的话,我们需要的只是创建虚拟环境,并创建虚拟环境的配置文件,启用就可以了。

因为在实例环境中,我们已经为Python3.6安装了Django2等必须的库,创建虚拟环境时,我们只需要将这些内容原原本本的复制一份就可以了。

1、安装虚拟环境

进入“/usr/local/lib/python3.6/site-packages/”目录,执行pip命令安装“virtualenv”库。

执行命令:
cd /usr/local/lib/python3.6/site-packages/
sudo python3.6 pip install virtualenv

安装完成之后,我们进入项目目录,创建虚拟环境。

例如,创建一个名为“venv”的虚拟环境。

执行命令:
cd /var/www/MyWeb/
sudo virtualenv -p /usr/local/bin/python3.6 venv

如果只想要一个未安装第三方库的虚拟环境,需要在创建命令后方加上参数“–no-site-packages”。

进入虚拟环境需要使用“source”命令,例如进入刚刚创建的“venv”。

执行命令:
cd /var/www/MyWeb/venv/bin
source activate

此时的命令行会变成“(venv)”开头。
如果要退出虚拟环境,直接在命令行输入“deactivate”即可。
另外,在虚拟环境中只有一个Python3.6,所以在虚拟环境的命令行下,可以直接使用“python”和“pip”命令。

第21个坑:虚拟环境的Django不能正常使用,需要重新安装!而且注意,虚拟环境安装第三方库时,需要先获取“root”权限,再进入虚拟环境。

执行命令:
sudo -i
source /var/www/MyWeb/venv/bin/activate
pip install pytz
cd /home/ubuntu/Downloads/Django-2.0.3
python setup.py install

照例测试一下:

2、创建虚拟环境的配置文件

配置文件内容:

<VirtualHost *:80>
   ServerName qqtbb.com
   ServerAlias www.qqtbb.com
   ServerAdmin 4907442@qq.com
   DocumentRoot /var/www/MyWeb/MyWeb  # 设置站点根目录
   WSGIScriptAlias / /var/www/MyWeb/MyWeb/wsgi.py
   WSGIDaemonProcess www.qqtbb.com python-path=/var/www/MyWeb/MyWeb:/var/www/MyWeb/venv/lib/python3.6/site-packages
   # 设置守护进程,指定Python路径。让虚拟环境的python解释器运行在单独的进程之中,互不干扰。
   WSGIProcessGroup www.qqtbb.com  # 设置WSGI进程组
   Alias /media/ /var/www/MyWeb/media/
   Alias /static/ /var/www/MyWeb/static/
   <Directory /var/www/MyWeb/media>
       Require all granted
   </Directory>
   <Directory /var/www/MyWeb/static>
       Require all granted 
   </Directory>
   <Directory /var/www/MyWeb/MyWeb/>
      <Files wsgi.py>
         Require all granted
      </Files>
   </Directory>
   ErrorLog ${APACHE_LOG_DIR}/error-MyWeb.log
   CustomLog ${APACHE_LOG_DIR}/access-MyWeb.log combined
</VirtualHost>

3、激活配置文件并重启Apache

执行命令:
sudo a2dissite MyWeb.conf && sudo a2ensite MyWeb_venv.conf
sudo service apache2 restart

提示:可以修改一下模板文件,可以明显看出启动的是虚拟环境的站点。

五、权限设置

大家之前使用了一句命令来改变文件夹的权限:sudo chmod 777 MyWeb

那么,“777”是什么意思呢?

这个数字,每一位都代表一类用户。

  • 第一位:拥有者
  • 第二位:组
  • 第三位:其它

而数字的大小,代表着权限组合的不同。

权限也分三种:

  • R:读取权限
  • W:写入权限
  • X:执行权限

数字0-7表示8种不同的级别。

一般来说,网站项目只需要用到“777”、“755”、“644”这三种权限,目录权限使用“755”,文件权限使用“644”。

接下来,为我们项目中的所有文件设置“644”权限。

执行命令:
cd /var/www/
sudo chmod -R 644 MyWeb

提示:参数“-R ”是指处理指定目录以及其子目录下的所有文件。

然后,再将所有的目录设置为“755”权限。

sudo find MyWeb -type d | xargs chmod 755

提示:参数“-type d”是指目录类型。

不过,当我们这么设置权限之后,会发现项目中对数据库的写入操作出现问题,无法使用类似商品添加删除的功能。

这是因为我们刚才的操作把数据库文件“db.sqlite3”的写入权限给取消了。

所以,我们还需要单独设置数据库文件的权限。

这里我们可以使用服务器中默认的组用户“www-data,具有比较好的安全性。

我们先把项目文件夹和“db.sqlite3”文件加入到“www-data”组。

执行命令:
cd /var/www/
sudo chgrp www-data MyWeb
sudo chgrp www-data MyWeb/db.sqlite3

然后,赋予项目文件夹和“db.sqlite3”文件写入权限。

执行命令:
sudo chmod g+w MyWeb
sudo chmod g+w MyWeb/db.sqlite3

通过这样的调整项目中对数据库的写入操作就正常了。

到这里,我们就完成了使用Ubuntu16.04系统和Apache2.4服务器进行Django2.0项目的部署。

转载请注明:魔力Python » Django2:Web项目开发入门笔记(14)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (1)

  1. 头像
    楼主,我运行不出来,500 ❓ o(╥﹏╥)o
    走路爱走神2年前 (2018-06-06)回复