軟件安裝
0.如果對selunix不熟就先把它停掉
vi /etc/selinux/config
改動selinux=diabled
然后重啟計算機
1.編譯安裝python
mod_wsgi的安裝需要使用到python的共享庫,編譯安裝python時要啟用共享庫
./congifure --enable-shared
make &&make install
添加python鏈接庫到路徑
sudo vi /etc/ld.so.conf
/usr/local/Python2.7/lib #添加路徑到文件
sudo /sbin/ldconfig -v
2.安裝apache yum -y install apache
3.安裝mod_wsgi其實mod_wsgi有兩種安裝模式,除了單獨安裝(yum/編譯)之外,還可以通過pip install mod_wsgi方式進行安裝
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-python=/usr/local/bin/python
4.安裝django pip install django==1.8
三者的關系以及工作過程
mod_wsgi是apache的一個模塊,是遵循python的wsgi協議而開發的、用於連接python web框架的擴展。從這個關系可以看出,這幾個軟件的信息流是怎樣的?
首先,apache監控服務器主機的80端口,當接收到來自客戶端請求的時候,apache會判斷這個請求是否匹配,如果匹配其中的某個條件,那么apache就會將這個請求通過mod_wsgi來轉發給Django進程進行處理,Django會對這個請求進行進一步處理,執行業務邏輯,最后通過wsgi協議返回響應給apache,apache接收到這個響應之后就會發送給客戶端。注意,django再整個部署的過程中是不需要手動啟動的,平時我們開發的時候使用python manage.py runserver只是開發過程中調試用的。
配置
配置django
如果只采用默認的settings的話,是不需要再配置django文件的,如果想分別使用不同的進程來啟動同一個項目中的不同應用的話,需要配置wsgi.py中的django環境變量。
配置mod_wsgi
同樣,mod_wsgi默認也是不需要配置的,除非有高級的需求,否則初級的配置只需要默認即可。
配置apache
對apache這個服務器軟件的所有操作都在其配置文件中完成。
配置文件默認為/etc/httpd/conf/httpd.conf。
配置文件的具體寫法在其官方文檔中有詳細說明: http://httpd.apache.org/docs/2.2/configuring.html
apache是一個模塊化的軟件,除了一些必要的模塊在編譯時嵌入之外,其它模塊需要在配置文件中導入才能發揮作用,apache的所有模塊都以mod開頭。mod_wsgi毫無疑問需要導入才能使用:
LoadModule wsgi_module modules/mod_wsgi.so
另外,配置文件可以直接寫在這個配置文件中,也可以寫在別的地方,然后導入作為配置的一部分,例如可以把文件寫在django項目的根目錄下。在apache配置文件中導入這個文件
Include /root/test1/apache_django_wsgi.conf
這樣就跟全部寫在httpd.conf中一樣了。
最終的配置文件簡單地配置成下面這個樣子:
1 LoadModule wsgi_module modules/mod_wsgi.so 2 3 <IfModule mod_wsgi.c> 4 5 # '/' 代表你想服務你的應用的base URL路徑,'/'也就是root url 6 7 # /path/to.../wsgi.py代表使用WSGI應用來服務該url下的所有請求 8 9 # 如果應用在子目錄中(https://example.com/mysite in this example),使用下面的設置 10 11 #WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com 12 13 WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py 14 15 16 17 # 如果建立了虛擬環境,將此路徑指向虛擬環境的python path 18 19 WSGIPythonHome /path/to/venv 20 21 # WSGIPythonPath讓你的項目包能夠使用import導入到python path,也就是說import mysite能夠運行 22 23 WSGIPythonPath /path/to/mysite.com 24 25 26 27 # 下面的代碼保證apache能使用wsgi.py文件 28 29 <Directory /path/to/mysite.com/mysite> 30 31 <Files wsgi.py> 32 33 Order deny,allow 34 35 Allow from all 36 37 #apache2.4版本的命令 38 39 #Require all granted 40 41 </Files> 42 43 </Directory> 44 45 46 47 #守護模式下的配置,其中不能使用WSGIPythonHome和WSGIPythonPath,而要使用python-home和python-path 48 49 # 進程名字隨意起 50 51 WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com 52 53 user=apache group=apache 54 55 WSGIProcessGroup example.com 56 57 58 59 #由於django本身不會serve files,所以需要別的web server承擔這個工作,可以選擇其它沒有運行django的服務器來承擔 60 61 #但是如果必須用同一台apache的話,可以將一些url設置成靜態文件路徑 62 63 #例如 64 65 # 相當於 www.xxx.com/robot.txt -->/path/to/mysite.com/static/robots.txt 66 67 Alias /robots.txt /path/to/mysite.com/static/robots.txt 68 69 Alias /favicon.ico /path/to/mysite.com/static/favicon.ico 70 71 Alias /media/ /path/to/mysite.com/media/ 72 73 Alias /static/ /path/to/mysite.com/static/ 74 75 76 77 <Directory /path/to/mysite.com/static> 78 79 Require all granted 80 81 </Directory> 82 83 84 85 <Directory /path/to/mysite.com/media> 86 87 Require all granted 88 89 </Directory> 90 91 92 93 <Directory /path/to/mysite.com/mysite> 94 95 <Files wsgi.py> 96 97 Require all granted 98 99 </Files> 100 101 </Directory> 102 103 104 105 AddType text/html .py 106 107 WSGISocketPrefix /var/run/ 108 109 110 111 </IfModule>
當然也可以將相關的配置寫在虛擬主機的配置中。
apache配置文件:虛擬主機的配置參數(略)
mod_wgsi配置過程中可能遇到的問題:
5xx服務器內部錯誤
這種問題可以通過檢查apache的錯誤文件發現問題,錯誤文件/var/log/httpd/error.log中出現類似於 mod_wsgi (pid=20380): Target WSGI script '/var/www/test0/test0/wsgi.py' cannot be loaded as Python module.
問題很可能出在所安裝的mod_wsgi擴展沒有找到相應的鏈接庫。
解決方法:
1.檢查python編譯安裝要安裝共享庫
./configure --enabled-shared
make && make install
2.添加共享庫到路徑
sudo vi /etc/ld.so.conf
/usr/local/Python2.7/lib
sudo /sbin/ldconfig -v
3.使用編譯安裝mod_wsgi
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-python=/usr/local/bin/python
報錯:Permission denied: mod_wsgi (pid=2081): Unable to connect to WSGI daemon process 'autotester' on '/etc/httpd/logs/wsgi.2076.0.1.sock' after multiple attempts
可在apache配置文件或者wsgi.conf中添加
WSGISocketPrefix /var/run/
來自 <https://my.oschina.net/crazyharry/blog/336811>
使用.configure --enable-shared 安裝python2.7之后出現下面的報錯:
error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
解決方法如下:
來自 <http://blog.csdn.net/wanyanxgf/article/details/8021641>
1.編輯 vi /etc/ld.so.conf
如果是非root權限帳號登錄,使用 sudo vi /etc/ld.so.conf
添加上python2.7的lib庫地址,如我的/usr/local/Python2.7/lib,保存文件
2.執行 /sbin/ldconfig -v命令,如果是非root權限帳號登錄,使用 sudo /sbin/ldconfig -v。這樣 ldd 才能找到這個庫,執行python2.7就不會報錯了
/etc/ld.so.conf:
這個文件記錄了編譯時使用的動態鏈接庫的路徑。
默認情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的庫文件
如果你安裝了某些庫,沒有指定 --prefix=/usr 這樣lib庫就裝到了/usr/local下,而又沒有在/etc/ld.so.conf中添加/usr/local/lib,就會報錯了
ldconfig是個什么東東吧 :
它是一個程序,通常它位於/sbin下,是root用戶使用的東東。具體作用及用法可以man ldconfig查到
簡單的說,它的作用就是將/etc/ld.so.conf列出的路徑下的庫文件 緩存到/etc/ld.so.cache 以供使用
因此當安裝完一些庫文件,(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑后,需要運行一下/sbin/ldconfig
使所有的庫文件都被緩存到ld.so.cache中,如果沒做,即使庫文件明明就在/usr/lib下的,也是不會被使用的,結果編譯過程中抱錯,缺少xxx庫。