红联Linux门户
Linux帮助

ubuntu下配置Apache+mod_wsgi+Django项目(个人测试)

发布时间:2017-06-13 09:24:27来源:cnblogs.com/if-then作者:momoangel
经过了一个星期的摸索,查找资料以及实验,我搭建的环境基本能用(还有就是Django后台的静态文件加载的问题)
这里面只是介绍一下我的过程,因为对应Apache还不是很熟练,特别是配置文件。只能供大家参考一下。
网上的资料比较多,但是可能不适合自己,只能取其精华,但是没经验的话,不知道哪里是精华,所以就多试试吧。写这个文章,也是对自己这一段时间坚持学习的鼓励。
 
环境 Ubuntu16.04LTS
Apache 2.4.25
mod_wsgi :mod_wsgi-4.5.15.tar.gz
Django :1.8
 
Apache 搭建:
Apache搭建有两种方式
一,下载源码http://archive.apache.org/dist/httpd/,编译安装的方式
这种方式呢,我下载的是httpd-2.4.25.tar.gz
源码安装还是要看官方文档,它对应系统有依赖包主要有apr-util-1.5.4、pcre-8.38,下载编译前看看文档的注意事项,少走弯路!
 
二,sudo apt-get install apache2
这种安装方便,但是我安装完,配置文件与源码安装的方式不一样,要在site-enable下,而且是虚拟机方式的配置文件,我网上找资料的时候,多半是看到的httpd.conf配置的,所以这个没深入看。但是看到一个博客下的评论,有人是这样配置的,跟我的配置意思一样,可以借鉴,如下:
<VirtualHost *:80>
DocumentRoot /var/other/django/ibooklist/
ServerName *.chedushi.com
ServerAlias *.chedushi.com
WSGIScriptAlias / /var/other/django/ibooklist/ibooklist/wsgi.py
Alias /media/ /var/other/django/ibooklist/media/
Alias /static/ /var/other/django/ibooklist/static/
<Directory /var/other/django/ibooklist/static/>
Order deny,allow
Allow from all
</Directory>
<Directory /var/other/django/ibooklist/media/>
Order deny,allow
Allow from all
</Directory>
<Directory /var/other/django/ibooklist/>
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
网上资料有的写配置这个,和我配置httpd.conf文件意思一样(此段补加的20170613)。我只能不严谨的说应该差不多。
安装方式还是比较简单,不多说了!只有安装完,访问127.0.0.1 能看到it's works ?还是 it works?就行了!
 
安装mod_wsgi
注意:安装这个宝贝也需要一些依赖,也要先看官方文档!
下载了mod_wsgi-4.5.15.tar.gz
解压
tar -zxvf mod_wsgi-4.5.15.tar.gz
进入目录,./configure
遇到一个问题 /bin/sh: 1: apxs: not found
有的说要安装httpd-devel
但在Apache网站上,只有for fedora and  Centos 的rpm包
本U没有对应的包
再查查看。
上官方文档,也时有写的
If you are running Debian or Ubuntu Linux with Apache 2.4 system packages, regardless of which Apache MPM is being used, you would need both:
apache2 (此包应该不用,如果安装了相当于安装了一个应用服务,所以你在试的时候先装下面的dev,如果不行,再装吧)
apache2-dev
看来一切都得看官方文档的靠谱!将这个两个用  apt-get install 安装上
再编译结果还是不行
报错如下
/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; rec ompile with -fPIC
这是要重新安装python2.7 而且重新编译 用-fPIC参数(这里注意,安装的时候如果你用的是sqlite3的数据库,这里就一块弄了,否则django应用都起不来,先安装一个sudo apt-get install libsqlite3-dev,这样再./configure --prefix=/usr/local/ CFLAGS=-fPIC , make的时候就不会提示
Python build finished, but the necessary bits to build these modules were not found:
_bsddb   _sqlite3  _tkinter    ........
需要单独安装的这个提示了)
我因为这个和sqlite3安装的事情,多安装了好几遍python2.7 因为时个老电脑1cpu2核的,结果编译耗费了老久时间了。
命令如下:进入python源码目录下
./configure --prefix=/usr/local/   CFLAGS=-fPIC  ###ps:--enable-optimizations 这个参数可加可不加,加上的话make的时间长,我经过多次的话,后来在                                                                              test_logging 的过程就报错了,网上没查到,可能跟我的主机名有关,但不确定)
make
sudo make install
安装完的路径为  /usr/local/lib/下的python2.7
 
然后再安装mod_wsgi
安装完后,会在Apache 安装目录/usr/local/apache24/下的文件夹modules中存在 mod_wsgi.so,(主要就是为了它,网上有说下载so文件,拷贝到这个文件夹下,但我没找到哪里下载)
到此安装算成功了,但是我们还是测试一下,看可以用不
在 /usr/local/apache24/cgi-bin/下 建立一个测试脚本 test.wsgi(名字随便,叫wsgi.py更好吧,因为Django就是用这个呢!)
def application(environ, start_response):  
status = '200 OK'   
output = 'Hello World!'  
response_headers = [('Content-type', 'text/plain'),  
('Content-Length', str(len(output)))]  
start_response(status, response_headers)  
return [output]
以上脚本在官网上也有,我是在谁的博客里复制了一份。复制粘贴的时候,检查一下格式是否符合python
然后配置 sudo  vi /usr/local/apache24/conf/httpd.conf
找到一堆LoadModule  XXXXXXX的地方,增加一条
LoadModule wsgi_module modules/mod_wsgi.so
在 ScriptAlias /cgi-bin/ "/usr/local/apache24/cgi-bin/"  #当然了 注意路径可能不一样
加上
ScriptAlias /test "/usr/local/apache24/cgi-bin/test.wsgi"    #起了一个test的别名指向这个文本,可以在浏览器里访问http://127.0.0.1/test
 
如果出现Hello World!,就成功了,如果没有,再加一窜下面的访问控制权限的!
<Directory "/cgi-bin/">
<Files test.wsgi>
Require all granted
</Files>
</Directory>
到这,环境应该就没问题了,希望你能够顺利到这!
 
安装Django项目
这里要先说的是,我对与配置文件还不是很熟悉,怎么配置是最小及最优还不是很了解,只能说是能用
到这呢,就只是配置文件的事情了,如果你的python加载模块都正常的话,如果不正常,你看缺少什么模块就加什么,用pip安装很简单,但是pip建议还是源码安装吧
还有就是不要装多个python,就留一个就行了。
这里面主要先改一下
DocumentRoot "/usr/local/apache24/htdocs" 路径换成你的Django的路径,
指向项目目录,不要指向应用下,如 /usr/app/mystie/  
mysit
├── dbshell.bat
├── db.sqlite3
├── manage.py
├── migrate.bat    #bat文件是我在window上编写程序时写的,可以忽略!
├── mysit
  ├── __init__.py
  ├── __init__.pyc
  ├── settings.py
  ├── settings.pyc
  ├── urls.py
  ├── urls.pyc
  ├── wsgi.py
  └── wsgi.pyc
├── news       #我的model view等文件目录
├── static   #静态文件的文件目录
└── syncdb.bat
上面的路径很重要,就是写路径的问题了,我DocumentRoot改成下面 DocumentRoot "/usr/app/mysit"
<Directory "/mysit">  #紧邻的文件夹就改成这个,指向应用的目录,下面的目录都是相对于DocumentRoot的
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
Require all granted
</Directory>
里面配置这些就可以了,注意,网上说2.2版本和2.4版本的授权命令是不一样的,所以你如果查询了好多,会看到allow from all,这个是2.2的等同于 Require all granted在这条ScriptAlias /test "/usr/local/apache24/cgi-bin/test.wsgi"语句下,插入下面的语句,指定django项目的wsgi.py
 WSGIScriptAlias / "/usr/app/mysit/mysit/wsgi.py"     ###wsgi.py 不用做任何改动,网上好多要加路径的,我觉得既然django就支持这个方式,应该不用动的!
再加一段允许访问的权限,如下,(我没明白为什么还要再给一遍,或者<Directory "/mysit">为什么不行,因为是相对于DocumentRoot了啊?)
<Directory "/usr/app/mysit/mysit">
Require all granted
</Directory>因为我的static放在/usr/app/mysit下的static目录了,所以再加个权限,(我真不知道为什么还加,我就是因为这个问题,弄了2晚上)
<Directory "/usr/app/mysit/static/">
AllowOverride None
Options all
Require all granted
</Directory>
而且我前面的已经加了一个 /mysti的权限了!
 
到此,我访问127.0.0.1/index就可以访问我的程序了,(小问题是登后台,没有样式,并且sqlite3还是访问不了,目前还没解决,先把步骤写了)好了,就写到这吧,互相学习。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/31444.html