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)

步驟:Django -&> Apache / PHP -&> Apache proxy_scgi / Django SCGI

1、先搞定 Django app,確保用 manage.py runserver 可以啟動並正確訪問到你的 Django app (python manage.py runserver 0.0.0.0:8000)

2、之後是配置標準的 Apache / mod_php5 環境,Ubuntu 里基本什麼都不需要。在 DocumentRoot 下放一個 info.php 確保工作正常:

&

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.html

Django 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"
&

在www新建Django項目django_site,在django_site/django_site下新建文件django_site.wsgi,添加內容:

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()

重啟Apache.


推薦閱讀:

Linux 和 系統安全的前景?
在 Python 中如何判斷輸入數字是實數(整型數字或者浮點型數字)?
作為一個Python程序員,電腦上應該具備哪些軟體?
PyQt5如何實現窗口關閉淡出效果?
requests模塊的response.text與response.content有什麼區別?

TAG:Python | PHP | Django框架 | Apache | 伺服器配置 |