企業業務需同時支援 PHP (既有系統) 與 Python Django (新專案) 開發框架,決定在同一伺服器建立 LAMP + Django 共存環境,共用 Apache 前端、MySQL 資料庫,透過 mod_wsgi 整合 Django。
/usr/local/apache、/usr/local/mysql、/usr/local/php、/usr/local/pythonyum -y install lib* freetype* zlib-devel openssl-devel pcre-devel libxml2-devel curl-devel libjpeg-devel libpng-devel sqlite-devel readline-develgroupadd htdocs
useradd -g htdocs -s /sbin/nologin htdocs
tar zxvf httpd-2.2.14.tar.gz
cd httpd-2.2.14
./configure \
--prefix=/usr/local/apache \
--enable-dav --enable-dav-fs \
--enable-so \
--enable-modules=most \
--enable-mods-shared=all \
--enable-info \
--enable-rewrite \
--enable-deflate \
--enable-ssl \
--with-mpm=prefork
make && make install
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql
tar zxvf mysql-5.1.45.tar.gz
cd mysql-5.1.45
./configure \
--prefix=/usr/local/mysql \
--with-charset=utf8 --with-collation=utf8_general_ci \
--with-extra-charsets=all \
--with-plugins=innobase,myisam,partition
make && make install
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld; chkconfig mysqld on
service mysqld start
tar zxvf php-5.2.5.tar.gz
cd php-5.2.5
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-config-file-path=/usr/local/php/etc \
--enable-mbstring --enable-sockets --enable-ftp --enable-gd-native-ttf \
--with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir \
--with-curl --with-openssl --with-mcrypt --with-mhash \
--enable-bcmath --enable-zip --enable-soap --enable-calendar
make && make install
cp php.ini-production /usr/local/php/etc/php.ini
# 編輯 php.ini 設定 date.timezone、error_log 等
wget https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz
tar zxvf Python-2.6.9.tgz
cd Python-2.6.9
./configure --prefix=/usr/local/python26 --enable-shared --enable-unicode=ucs4
make && make install
echo "/usr/local/python26/lib" > /etc/ld.so.conf.d/python26.conf
ldconfig
wget https://bootstrap.pypa.io/ez_setup.py -O - | /usr/local/python26/bin/python
wget https://bootstrap.pypa.io/get-pip.py -O - | /usr/local/python26/bin/python
/usr/local/python26/bin/pip install Django==1.2.5
tar zxvf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=/usr/local/python26/bin/python
make && make install
# 輸出:modules/mod_wsgi.so 已複製至 Apache modules 目錄
# httpd.conf 新增
LoadModule wsgi_module modules/mod_wsgi.so
# 虛擬主機範例
<VirtualHost *:80>
ServerName django.example.com
DocumentRoot /var/www/html/django_project/public
WSGIDaemonProcess django_project python-path=/var/www/html/django_project:/usr/local/python26/lib/python2.6/site-packages
WSGIProcessGroup django_project
WSGIScriptAlias / /var/www/html/django_project/django_project/wsgi.py
<Directory /var/www/html/django_project/django_project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /var/www/html/django_project/static/
<Directory /var/www/html/django_project/static>
Require all granted
</Directory>
Alias /media/ /var/www/html/django_project/media/
<Directory /var/www/html/django_project/media>
Require all granted
</Directory>
</VirtualHost>
/usr/local/apache/bin/apachectl restart
PHP 與 Django 共用同一 MySQL 實例,分別建立獨立資料庫與用戶:
-- PHP 應用
CREATE DATABASE php_app CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON php_app.* TO 'php_user'@'localhost' IDENTIFIED BY 'php_pass';
-- Django 應用
CREATE DATABASE django_app CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON django_app.* TO 'django_user'@'localhost' IDENTIFIED BY 'django_pass';
Django settings.py 配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_app',
'USER': 'django_user',
'PASSWORD': 'django_pass',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
}
}
| 問題 | 解決 |
|---|---|
| mod_wsgi 編譯報錯: Python.h not found | 安裝 python-devel 或指定 --with-python 指向含 headers 的安裝路徑 |
| Apache 啟動報錯: mod_wsgi.so undefined symbol: PyUnicodeUCS2_* | Python 編譯需加 --enable-unicode=ucs4,重編 mod_wsgi 綁定同一 Python |
| Django 靜態檔案 404 | 確認 collectstatic 已執行、Alias 路徑正確、目錄權限可讀 |
| PHP 與 Django 衝突 | 使用不同虛擬主機、不同 DocumentRoot、PHP 用 mod_php、Django 用 mod_wsgi 互不干擾 |
/usr/local/apache/conf、/usr/local/php/etc、/var/www/html、MySQL 資料目錄。error_log、Django logs/django.log、PHP error_log。