django+nginx+mod_wsgi+apache網站部署


軟件安裝

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庫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM