Ubuntu 14.04 下配置 Apache2 + Django 1.11技巧总结

1. 前期需求

    用户需求:需要有root用户,外加一个非root用户,普通情况下,使用非root用户进行配置。
本文中假设非root用户为ubuntu
    安装内容:Apache2  Django  Python2.7(ubuntu默认已经安装)
    版本适配性:
    ubuntu  14.04
    Django  1.11
    Python  2.7 (3不支持Django1系列,仅支持>=2版本)
2. 安装软件
    更新apt-get:
    sudo apt-get update
    
    安装apache、pip:
    sudo apt-get install python-pip apache2 libapache2-mod-wsgi
    
    检查是否安装了Python
    $ python
    如果显示 >>> 则已经安装了python
    输入
    >>> import sys
    >>> print sys.path
    可以检查python的安装路径以及path的配置信息
    
    如果需要安装python,则:
    sudo apt-get install python2.7

    安装其他的软件包,例如numpy 和scipy

    sudo python -m pip install --user numpy scipy    
3. 配置Django
(1) 安装独立的python运行环境(虚拟运行环境)
    $sudo pip install virtualenv
(2) 进入到自己项目需要保存的位置,建立目录,注意EC2最好不要在/home/文件夹下面建,因为会有密钥问题
    Django建立的文件夹有了两层,第一层只有项目名称和manage.py,第二层是项目同名文件夹,里面有settings.py view.py url.py等文件,未来的网站也配置在这个文件夹中。
    假设新建的项目名称为"myproject",且项目在/var/下建立
    $cd /var
    $mkdir myproject
    $cd myproject
(3) 建立虚拟运行环境
    $virtualenv myprojectenv
    此句会在第一层myproject 文件夹下面建立一个myprojectenv文件夹,并将系统中的python等文件重新在这个文件夹中部署一次。注意如果python中安装了其它的包,这里需要重新安装一次,比如numpy
(4)启动虚拟环境
    $source myprojectenv/bin/activate
    正常运行之后,命令行前缀改为: (myprojectenv)user@host:~/myproject$.
(5) 安装Django
    sudo pip install Django==1.11  (注意这里,一定带上版本号,此处为2个等号 )
(6) 建立新项目
    (myprojectenv)$ django-admin.py startproject myproject .
    注意命令最后有个句点,而且句点之前要有至少一个空格,这句话代表新建一个叫做myproject的项目,这里会生成第二层的myproject文件夹
(7) Django基本配置,如果ubuntu能够进入到可视化GUI,建立直接文本编辑器打开,否则可以使用 gedit或者nano
    文件: myproject/settings.py
    修改内容: 
    ALLOWED_HOSTS = ["*"]
    STATIC_URL = '/static/' (默认这行已有)
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

    默认文件是不可写的,应该修改一下权限
    (myprojectenv)$  sudo chmod 777 myproject/settings.py
    对文件夹修改权限为:
    (myprojectenv)$  sudo chmod -R 777 myproject
    
    修改完成后保存,退出。
(8) 尝试启动Django
    更细数据库(默认使用qlite3数据库,位于第一层myproject文件夹下)
    (myprojectenv)$  python manage.py makemigrations
    (myprojectenv)$  python manage.py migrate
    注意上述两条命令在每次修改完项目的model之后,最好都执行一次。当将自己的项目复制到其他项目下之后,一定要执行一次,不然会报找不到对象的错误(单身狗无限伤害^_^)
    
    (可选)建立Django web管理账户
    (myprojectenv)$  python.py manage.py createsuperuser
    根据提示输入用户名和两次密码
    这个账号用户在  http://IP/admin/  下管理Django
    
    整理网站中的静态文件(static),Django不能直接读取myproject文件夹中的静态文件(图片、css、js),需要将这些文件放在 第一层Myproject文件夹下的 static文件中,正式发布时,系统会进行映射
    (myprojectenv)$ python manage.py collectstatic  项目部署完成后,本命令推荐再次执行
    
(9) 启动Django
    (myprojectenv)$ sudo ufw allow 8000 (防火墙开启端口,端口号根据实际要求设置)
    (myprojectenv)$ python.py manage.py runserver 0.0.0.0:80000    (IP地址可以设置为127,也可以设置为本机固定IP,0000代表任何向本机发送的请求都处理)
    
    访问 http://server_IP:8000  如果能够看到蓝色页面,证明系统安装成功,万里长征第一步完成。 Cheers!
(10) 停掉虚拟环境,开始配置Apache

    考虑到这个部署了一个额外的enviroment,所以在其他地方已经安装的python包,此处必须重新安装一次,否则会报无法找到***包的错误。

    按ctrl+z 退出Django
    (myprojectenv)$  deactivate
    命令提示符重新恢复到 $.

4.(深坑若干) Apache配置
    写在前面,牢记在心:
    ----------------------------------------------
    Apache2 的错误日志位于 /var/log/apache2/Error.log中
    Apache2 的安装目录和配置文件位于 /etc/apache2/sites-available 中
    Apache2 的网页目录位于 /var/www/html/ 中
    Django出错时,只要python脚本不错误,在console中不显示错误信息,因此需要自行到apache日志中查看出错信息。
    ----------------------------------------------
(1) 配置Apache
    打开/etc/apache2/sites-available/000-default.conf
    注意需要先给这个文件 chmod 777 一下
    添加如下信息,注意开头和结尾文件中已有,80代表默认使用80端口,还需要注意myproject的个数
   
        Alias  /static   /var/myproject/static    这个是静态文件的存放位置
        Alias  /robots.txt   /var/myproject/static/robots.txt    可选
        Alias  /favicon.ico   /var/myproject/static/favicon.ico    可选
        Alias  /media    /var/myproject/media   这个是存放用户上传文件的文件夹
       
            Require all granted
       

        
       
           
                Require all granted
           

       

        WSGIDaemonProcess myproject   python-home=/var/myproject/myprojectenv    python-path=/var/myproject
        WSGIProcessGroup myproject
        WSGIScriptAlias   /   /var/myproject/myproject/wsgi.py
    
   
    DocumentRoot /var/myproject/myproject
   
    在 /var/myproject下面建立 static和media两个文件夹,注意名称不可修改,且需要为 :www-data 赋权
(2) 修改默认数据库和文件夹访问权限
    $ cd /var/
    $ sudo chmod 664  ~/myproject/db.sqlite3
    $ sudo chown :www-data  ~/myproject/db.sqlite3
    $ sudo chown :www-data  ~/myproject
    
    此处的坑: 
    如果需要文件上传,则上传文件的位置以及上层文件夹(直至跟目录),都需要使用chown 和chmod 修改所有者以及操作权限,否则会报错
    chmod命令最好带上参数 -r,不然内部文件夹需要无限次重复 chmod chown
(3) 前面使用80端口,因此需要设置防火墙开启80,关闭8000
    sudo  ufw delete allow 8000
    sudo  ufw allow  "Apache Full"  或使用  sudo  ufw  allow  80
(4) 测试Apache配置是否正常
    sudo apache2ctl  configtest
    如果正常,则显示Syntax OK ,否则提示错误信息,并根据错误信息进一步修改配置文件
(5) 重启Apache
    sudo systemctl restart apache2
    坑:
    ubuntu 14.04不支持上述命令,应该改为:
    sudo service apache2 restart   根据需要可选 stop / start 
    ubuntu 16为systemctl

5. 将已经做好的Django项目导入到刚刚配置的myproject中
        
(1)将自己的项目(例如LibFinder)所有文件复制到 第二层myproject 文件夹中
(2)将LibFinder static文件夹复制到  myproject(第一层)/static 文件夹中
(3)修改settings.py

    增加项目名称:在INSTALLED_APPS中增加

    INSTALLED_APPS = [  .....

           'myproject.apps.myprojectConfig',

    ]

    WSGI_APPLICATION = 'myproject.wsgi.application'

(4)修改项目中的代码
    由于在建立LibFinder项目时,所有的包引用都含有 import LibFinder.***model.py  字样,需要将所有的 LibFinder替换为 myproject,否则Django会报无法找到model错误
(5)为wsgi.py文件赋权
    这是一个很深的坑,Apache总是报告无法找到wsgi.py或者无法加载wsgi.py,其实是这个文件的权限和所属设置错误。

   Target WSGI script '/var/myproject/myproject/wsgi.py' cannot be loaded as Python module.
    这个文件要给 anyone 可写、可执行权限,另外own改为 :www-data

    $sudo chmod 777 /var/myproject/myproject/wsgi.py
    $sudo chown :www-data  /var/myproject/myproject/wsgi.py
    $sudo chmod u+x /var/myproject/myproject/wsgi.py 或者  a+x

    修改wsgi.py代码,增加:

    import sys

    path = '/var/myproject'

    if path not in sys.path:

             sys.path.append(path)

    .......
    os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
   
(6) 找不到***模块 的处理
    Django无法启动,Apache报告找不到某个模块,而这个模块恰好就是项目中建立的model文件
    
    解决方法:

    顺序执行:
    A.删除所有.pyc文件
    B.重新刷新数据库
    $ cd /var/myproject/
    $ source myprojectenv/bin/active
    (myprojectenv)$  python manage.py makemigrations
    (myprojectenv)$  python manage.py migrate
    (myprojectenv)$  deactive
    C.重启Apache
    $ sudo service apache2 restart (ubuntu14)
    $ sudo systemctl restart apache2
    为避免类似错误发生,每次修改py文件后,都重启一下apache,但是只要model不修改,不需要重新 makemigrations
(7) 将settings.py中的 debug = True 改为 Debug=Flase
    否则系统仅能使用内存数据库而且仅能一个web连接
 (8)修改Urls.py

     urlpatterns=[

        ......

       ]+static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

 (9)在第二级myproject文件夹中新建 app.py  (坑呀)

    内容:

    from django.apps   import   AppConfig

    class  myprojectConfig(AppConfig):

               name = 'myproject'

               verbose_name = 'myproject'
6. 完成配置。 Cheers!
7. 可能存在的问题:
    (1) 静态文件不显示
    静态文件需要放在第一层myproject文件夹下的static中
    在网页中引用时,需要绝对引用,即:  
    static需要给与 :www-data所有权(chown)
    static需要在settings.py 和 Apache conf文件中配置相应目录
    (2) 用户上传的文件
    上传文件需要放在第一层myproject文件夹下的media中,可以建立下一级或多级目录
    在网页中引用时,需要绝对引用,即:  
    media需要给与 :www-data所有权(chown)
    media需要给与 777权限
    media需要在settings.py 和 Apache conf文件中配置相应目录(settings.py配置目前为未试过,一个可行的方案是,在所有项目py文件中采用系统绝对目录引用,即 )
    (3)wsgi.py模块问题
    Apache conf文件中配置相应权限
    wsgi.py不仅要有写权限,还要有执行权限(这是个深坑)
    (4)找不到***类、模块
    删除pyc文件,重启apache
    (5)pip版本问题
    当前pip版本为18+,但是如果在配置过程中,安装的版本高于10,会出现python包含头文件错误,请写在pip,并安装pip 9(ubuntu有些已经默认安装)
    (6)Python版本问题
    Django 1.11及之前版本支持 Python <= 2.7
    Django 2+ 仅支持 Python 3,但是很多其他包在2.7中运行得更稳定,因此推荐安装Django 1.11

    (7)主要上文中所有的缩进应该满足 python的缩进要求

    如果apache日志中出现:IndentationError: unexpected indent 错误,则代表某个python文件中有缩进问题

你可能感兴趣的:(Ubuntu 14.04 下配置 Apache2 + Django 1.11技巧总结)