Python: Windows 10上用Apache部署Django(含多端口映射多个Django网站)

最近有个Django项目需要部署,因为是需要在server上使用Office 365,所以时候用Win 10的机器来做server部署。

在网上找了一圈如何在Win 10上部署Django的教程,基本上都是用基于IIS来部署,然后就开始各种折腾,最后总是不能部署成功,访问的时候总是访问不了,但是步骤从头到尾和网上教程一模一样,然后就是漫长的各种debug,始终无解,最后终于放弃。后来看到有用Apache来部署的方法,就尝试了下,果然方便又快捷,特此记录,供有缘人参考。

一、系统环境信息:

OS: Win 10 64bit

Python: 3.9.6

Django:

二、Apache的安装配置

Apache HTTP server网址:The Apache HTTP Server Project

但是现在官网上只提供source code,不提供安装文件需要从其他网站上下载,官方提供了4个可以下载windows Apache的网址,不过还是建议从Apache Lounge上获取,因为后面需要用的mod_wsgi文档中建议从该网址获取。

本人下载的文件是:httpd-2.4.48-win64-VS16.zip

下载到本地后,只用解压缩即可,按照个人习惯放在C:\Apache24路径下。

此时,直接运行httpd.exe文件即可启动HTTP server,在浏览器中输入127.0.0.1会显示:It works!

网上有很多教程是教大家以service的形式启动,也可以,不过在实践过程中,如果Django项目中需要调用其他python文件的结果来处理的时候,会一直无法成功,后来发现以进程形式启动HTTP server就没有此问题,个人倾向用进程启动。官方2个方法都有提到,有兴趣的同学可以直接看官方文档:Using Apache HTTP Server on Microsoft Windows

三、Django配置

首先安装mod_wsgi,网上很多是进入,下载相应版本mod_wsgi Python的插件来安装,此方法也可行,但是该网站中的whl文件经常性无法下载。

看了mod_wsgi官网上信息,建议用pip install mod_wsgi方式来安装。

结果在安装的过程中提示error: Microsoft Visual C++ 14.0 or greater is required. 按照提示中的路径下载build tools后安装。WindowsCompilers - Python Wiki结果在安装的过程中提示error: Microsoft Visual C++ 14.0 or greater is required. 按照提示中的路径下载build tools后安装。

安装VC++的时候参考的是python wiki中要求,勾选了相应的文件进行安装。

安装完成后,再次用pip install mod_wsgi即可安装成功。

然后运行 mod_wsgi-express module-config 来获取配置信息,至此,mod_wsgi安装成功。

接下来配置Django项目设置:

把Django项目(eg: project_name)拷贝到该服务器机器上,例如:C:\Projects\project_name,在拷贝之前先把项目依赖库保存到requirements.txt中,用命令:

pip freeze > requirements.txt

 

然后在服务器机器上通过命令来安装依赖库

pip install -r requirements 

 

方法一:针对单项目单端口配置:

打开Apache中httpd.conf文件,把ServerName启用,然后在文件末尾处添加Django项目配置信息,如下:

ServerName 127.0.0.1
Listen 80
...

# 运行mod_wsgi-express module-config后的三行文字拷贝过来
LoadFile "c:/python39/python39.dll"
LoadModule wsgi_module "c:/python39/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"
WSGIPythonHome "c:/python39"

# 项目中用到了Pandas(使用numpy的依赖,numpy的底层是C),加入以下代码强制使用第一个子解释器
WSGIApplicationGroup %{GLOBAL}

#设置工程中的wsgi路径
WSGIScriptAlias / C:\projects\project_name\project_name\wsgi.py
#设置工程路径
WSGIPythonPath C:\projects\project_name
#设置wsgi路径
<Directory C:\projects\project_name\project_name>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>
#设置静态文件路径
Alias /static C:\projects\project_name\static
<Directory C:\projects\project_name\static>  
    AllowOverride None
    Options None
    Require all granted
</Directory>

 

如果使用mysql可能会遇到报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required;

可以直接简单粗暴,修改版本号,在setting.py的__init__.py里面加入如下代码:

import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()  # 使用pymysql代替mysqldb连接数据库

 

这样,运行httpd.exe就可以正常访问网站了: 127.0.0.1。

方法二:针对多项目多端口配置:

打开Apache中httpd.conf文件,把ServerName和端口号监听启用,然后在文件末尾处添加Django项目配置信息,如下:

ServerName 127.0.0.1
Listen 80
Listen 8000
...

# 运行mod_wsgi-express module-config后的三行文字拷贝过来
LoadFile "c:/python39/python39.dll"
LoadModule wsgi_module "c:/python39/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"
WSGIPythonHome "c:/python39"

# 项目中用到了Pandas(使用numpy的依赖,numpy的底层是C),加入以下代码强制使用第一个子解释器
WSGIApplicationGroup %{GLOBAL}

# 一个VirtualHost表示一个Django项目网站
<VirtualHost *:80>
    ServerName 127.0.0.1
    ErrorLog "logs/project_name-error.log"
    CustomLog "logs/project_name-access.log" common
 #设置工程中的wsgi路径
    WSGIScriptAlias / C:\projects\project_name\project_name\wsgi.py
 #设置wsgi路径
    <Directory C:\projects\project_name\project_name>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
 #设置静态文件路径
    Alias /static C:\projects\project_name\static
    <Directory C:\projects\project_name\static>  
        AllowOverride None
        Options None
        Require all granted
    </Directory>
 # 设置项目根目录
    DocumentRoot "C:\projects\project_name"
    <Directory "C:\projects\project_name">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:8000>
    ServerName 127.0.0.1
    ErrorLog "logs/test-error.log"
    CustomLog "logs/test-access.log" common
 #设置工程中的wsgi路径
    WSGIScriptAlias / C:\TestProjects\project_name\project_name\wsgi.py
 #设置wsgi路径
    <Directory C:\TestProjects\project_name\project_name>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
 #设置静态文件路径
    Alias /static C:\TestProjects\project_name\static
    <Directory C:\TestProjects\project_name\static>  
        AllowOverride None
        Options None
        Require all granted
    </Directory>
 # 设置项目根目录
    DocumentRoot "C:\TestProjects\project_name"
    <Directory "C:\TestProjects\project_name">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

 

同时需要在每个Django项目的wsgi.py文件中添加2行代码,不然会报Internal Server Error

import sys

sys.path.append('C:\Projects\project_name')

 

添加完后wsgi.py文件内容如下:

import os

from django.core.wsgi import get_wsgi_application
import sys

sys.path.append('C:\Projects\project_name')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")

application = get_wsgi_application()

 

这样,运行httpd.exe就可以正常访问2个网站了: 127.0.0.1 和 127.0.0.1:8000。

 

倘若想在局域网下访问该站点,可新建入站规则来控制端口的访问:打开Window防火墙 -> 点击 入站规则 -> 新建规则 -> 选择 端口 -> 选择TCP(默认选项),在特定本地端口中输入要开放的端口,直接下一步到结束即可。

posted @ 2021-07-01 17:22  danvy617  阅读(721)  评论(0编辑  收藏  举报