写在前面
因为不同版本的apache等软件文件夹和配置文件的名称设置都不尽相同,网上累死累活查了好多个博客就没一个能成功配出来的。
所以本文也不一定能帮到你,请在确定对自己有用之前不要盲目转载,以免给后来人制造更多的信息筛选负担。
Made By:CSGrandeur
写本文时各软件的版本
apache2:2.4
Django:1.6.1
MySQL:5.5.37
Python:2.7.6
apache版本不同,配置文件的地方和名称可能不同。比如看网上的教程,作死也找不到httpd.conf。。。
各种安装
先考虑要不要
sudo apt-get update sudo apt-get upgrade
然后
python是预装的,python --version查看
装Apache、wsgi、Django、MySQL、MySQLdb
sudo apt-get install apache2 sudo apt-get install libapache2-mod-wsgi sudo apt-get install python-django sudo apt-get install mysql-server mysql-client sudo apt-get install python-mysqldb
设置apache文件夹权限
cd /etc/apache2 sudo nano apache2.conf
找到
<Directory /> Options FollowSymLinks AllowOverride None #Require all denied Allow from all </Directory>
井号是我加的,Alow from all也是加的,改成这个样子就是了。
建立Django工程目录
不建议建在/var/www,如果系统设置问题导致不识别.py为网页文件时,/var/www作为Apache默认Web文件夹,.py源文件将可以被下载而泄漏。
我把文件放在了/home/djangoapps/
sudo mkdir /home/djangoapps sudo mkdir /home/djangoapps/work
创建Django工程(网页文件夹)
cd /home/djangoapps/work
django-admin startproject mysite
建wsgi
在随便哪里建wsgi,比如sudo nano /home/djangoapps/work/mysite/apache/django.wsgi
填入如下内容
import os import sys path = '/home/djangoapps/work/mysite' if path not in sys.path: sys.path.insert(0, '/home/djangoapps/work/mysite') os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
path是刚创建的工程文件夹位置,对应"mysite"的地方都是对应那个工程的名字。
建站点设置文件
去/etc/apache2/sites-available/建站点设置文件
cd /etc/apache2/sites-available sudo nano mysite.conf
填入如下内容
<VirtualHost *:80> #ServerName hello.djangoserver DocumentRoot /home/djangoapps/work/mysite <Directory /home/djangoapps/work/mysite> Order allow,deny Allow from all </Directory> WSGIDaemonProcess mydjangosite processes=2 threads=15 display-name=%{GROUP} WSGIProcessGroup mydjangosite WSGIScriptAlias / /home/djangoapps/work/mysite/apache/django.wsgi </VirtualHost>
为了让内容干净,解释就在外面说了:
ServerName这里注释掉了,可以设置域名的,设置这里的话其他地方也要配合设置
两个路径都是刚刚建的工程的路径
关于WSGIxxxx三条设置后面再说。
WSGIScriptAlias 空格 / 空格 /wsgi的路径。前面那个'/'可以是/xxxx什么的,访问的方式是 localhost/xxxx,不过我没成功@_@,所以就一个孤零零的 '/'吧。
启动站点
别离开/etc/apache2/sites-available
sudo a2ensite mysite sudo service apache2 reload
Django站点已经配置好了,但是这时访问127.0.0.1看到的是apache页面。
————————————————————————————————————————
关于端口
在/etc/apache2/sites-available可以看到000-default.conf,这个就是apache默认的站点,对应/var/www/html
如果都用80端口的话,访问到的是apache,而不是刚建的django。
可以关闭这个站点,
sudo a2dissite 000-default sudo service apache2 reload
这时就能正常访问刚建的django站点了。
也可以换个端口,在mysite.conf文件中,<VirtualHost *:80>改成<VirtualHost *:xxxx>自己要的端口,比如8000。
然后改ports.conf
cd /etc/apache2 sudo nano ports.conf
看到Listen 80了吧,下面加一行 Listen 8000,就能用8000端口了。
sudo service apache2 reload
这样127.0.0.1访问的是apache站点,127.0.0.1:8000访问的就是我们的django站点了。
关于WSGIxxxx
mod_wsgi 有两种运行模式, 第一种是嵌入模式,类似于mod_python,直接在apache进程中运行,这样的好处是不需要另外增加进程,但是坏处也很明显,所有内存都和apache共享,如果和mod_python一样造成内存漏洞的话,就会危害整个apache。而且如果apache是用worker mpm,mod_wsgi也就强制进入了线程模式,这样子对于非线程安全的程序来说就没法用了。 这种模式下只需要在apache下面设置 WSGIScriptAlias /path /path-to-wsgi 即可生效,对于小型脚本的话,直接用这种模式即可。 第二种是后台模式,类似于FastCGI的后台,mod_wsgi会借apache的外壳,另外启动一个或多个进程,然后通过socket通信和apache的进程联系。 这种方式只要使用以下配置即可开启: #启动WSGI后台,site1是后台名字 WSGIDaemonProcess site1 processes=2 threads=15 display-name=%{GROUP} #分配当前上下文应该使用哪个WSGI后台,可以放在Location里面指定 WSGIProcessGroup site1 #根据当前上下文的ProcessGroup分配到对应的后台 WSGIScriptAlias /path /path-to-wsgi 后台模式由于是与apache进程分离了,内存独立,而且可以独立重启,不会影响apache的进程,如果你有多个项目(django),可以选择建立多个后台或者共同使用一个后台。 比如在同一个VirtualHost里面,不同的path对应不同的django项目,可以同时使用一个Daemon: WSGIDaemonProcess default processes=1 threads=1 display-name=%{GROUP} WSGIProcessGroup default WSGIScriptAlias /project1 “/home/website/project1.wsgi” WSGIScriptAlias /project2 “/home/website/project2.wsgi” 这样子两个django都使用同一个WSGI后台。 也可以把不同的项目分开,分开使用不同的后台,这样开销比较大,但就不会耦合在一起了。 display-name是后台进程的名字,这样方便重启对应的进程,而不需要全部杀掉。 WSGIDaemonProcess site1 processes=1 threads=1 display-name=%{GROUP} WSGIDaemonProcess site2 processes=1 threads=1 display-name=%{GROUP} <Location “/project1″> WSGIProcessGroup site1 </Location> WSGIScriptAlias /project1 “/home/website/project1.wsgi” <Location “/project1″> WSGIProcessGroup site2 </Location> WSGIScriptAlias /project2 “/home/website/project2.wsgi” 对于django 1.0以下的版本,由于官方认定不是线程安全的,所以建议使用多进程单线程模式 processes=n threads=1 但是我自己在用django 0.9.6,使用多线程模式在很多项目里面基本都没有问题,包括在worker模式下面使用mod_python,其实是一样的道理,呵呵。 升级到django 1.0以后,就可以放心的使用多进程多线程模式了: processes=2 threads=64 这样子性能会更好。 下面是两种模式的英文原文: When hosting WSGI applications using mod_wsgi, one of two primary modes of operation can be used. In ‘embedded’ mode, mod_wsgi works in a similar way to mod_python in that the Python application code will be executed within the context of the normal Apache child processes. WSGI applications when run in this mode will therefore share the same processes as other Apache hosted applications using Apache modules for PHP and Perl. An alternate mode of operation available with Apache 2.X on UNIX is ‘daemon’ mode. This mode operates in similar ways to FASTCGI/SCGI solutions, whereby distinct processes can be dedicated to run a WSGI application. Unlike FASTCGI/SCGI solutions however, a separate infrastructure is not needed when implementing the WSGI application and everything is handled automatically by mod_wsgi. Because the WSGI applications in daemon mode are being run in their own processes, the impact on the normal Apache child processes used to serve up static files and host applications using Apache modules for PHP, Perl or some other language is much reduced. Daemon processes may if required also be run as a distinct user ensuring that WSGI applications cannot interfere with each other or access information they shouldn’t be able to.