Apache伺服器上同時運行php的網站和django的網站,該如何配置Apache和Django的URL?
已經安裝的軟體:Apache2.2 mod_wsgi php5 等.
想要:1. 使用同一個埠,同一個domain。2. 把/django_site/* 這樣的url全部交給django處理無奈自己試了很多種配置方式,均出現古怪的錯誤。
謝邀,拖了好久。
我是接觸 nginx 之後才開始碰的 Python / Django,但之前用 Apache / mod_php 用了不少時間,所以下面的 Django 搭配是按照 nginx fastcgi_pass 的思路來的。本身也是新手,下面的目標就是「跑起來」,特此敬告注意。環境:Ubuntu 12.04 LTS, Apache 2.2.22 Prefork MPM, mod_php 都是系統 apt-get 安裝。Apache module:- php5
- proxy(/etc/apache2/mods-available 里看到了 proxy.load 和 proxy_scgi.log)
Python 模塊通過 pip 安裝,virtualenv 管理環境:
- django
- flup (Django 的 runfcgi 依賴 flup)
& echo phpinfo(); ?&>
3、修改 Apache 的配置,確保 proxy_scgi 載入正確
a2enmod proxy_scgi
這裡按道理應該是 proxy_wsgi,但我在 Ubuntu 1204 的默認安裝和 apt-cache 里都沒有搜到 mod_proxy_wsgi,所以直接用了 proxy_scgi。
然後修改站點配置(/etc/apache2/sites-enabled 下的 VirtualHost 對應文件)ProxyPass /djangoapp/ scgi://localhost:4000/
注意最後一個 /。我最初配置的時候這裡按照 nginx 的 fastcgi_pass 習慣沒寫 /,結果訪問 /djangoapp/abc 的時候發現 error.log 里訪問的地址是 scgi://localhost:4000abc,才明白這裡就是這麼字元串連接起來的。
當你通過 Apache 訪問的時候,ProxyPass 部分的路徑是被去掉的,即:/djangoapp/some/path 傳到 Django 的時候就是在訪問 /some/path,所以 urls.py 里配置的時候實際上是不需要考慮 Apache 把這個 WSGI app 掛在哪個路徑下了,非常好。3 | 平行世界、Nginx 亂入!
如果要在 nginx 做前置的 / 下運行 Django,只需要location / {
include fastcgi_params;
fastcgi_pass localhost:4000;
}
即可。fastcgi_params 是 /etc/nginx/fastcgi_params 自帶的,需要注釋掉 SCRIPT_FILENAME 和 SCRIPT_NAME 兩行。
如果要在一個子目錄下運行,需要對 REQUEST_URI 稍作替換:location ~ /app/(.*) {
include fastcgi_params;
fastcgi_param REQUEST_URI /$1;
fastcgi_pass localhost:4000;
}
這樣 Django WSGI 收到的 REQUEST_URI 就是去除了前面 /app/ 這部分之後的部分。
4、回 Django 站點目錄,啟動 scgi 服務./manage.py runfcgi protocol=scgi method=threaded host=127.0.0.1 port=4000
地址 / 埠號要和上面 Apache 配置中的地址對上。protocol=scgi 必須的,否則默認是 wsgi 協議。
Apache 本身有 mod_wsgi 不需要經過 flup 和 proxy_* 模塊走,常見配置也是這樣的,但如前文所說,這種 proxy 模式更接近我習慣的 nginx 配置,所以我就這麼做了。搜索時候看到 apache 是有 proxy_wsgi 的,但是 Ubuntu 里沒有搜到,所以我直接用了現成的 proxy_scgi。是不是有性能或者其它方面的考量,如何調優,需要專家判斷了。
參考:
proxy_scgi http://httpd.apache.org/docs/trunk/mod/mod_proxy_scgi.htmlDjango scgi 文檔 How to use Django with FastCGI, SCGI, or AJP
-配置httpd-vhosts.conf文件
&
WSGIScriptAlias /django_site "/path/to/www/django_site.wsgi"
&
Order Deny,Allow
Allow from all
&
Alias /images "/path/to/www/images"
Alias /layout "/path/to/www/layout"
&
import os
import sys
sys.stdout = sys.stderr
from os.path import abspath, dirname, join
from site import addsitedir
from django.core.handlers.wsgi import WSGIHandler
sys.path.insert(0, abspath(join(dirname(__file__), "../")))
sys.path.insert(0, abspath(join(dirname(__file__), ". . /. . /")))
os.environ["DJANGO_SETTINGS_MODULE"] = "django_site.settings"
application = WSGIHandler()
推薦閱讀:
※Linux 和 系統安全的前景?
※在 Python 中如何判斷輸入數字是實數(整型數字或者浮點型數字)?
※作為一個Python程序員,電腦上應該具備哪些軟體?
※PyQt5如何實現窗口關閉淡出效果?
※requests模塊的response.text與response.content有什麼區別?