我的目标是在Apache上运行我的Django项目,它是在虚拟环境中从“virtualenv”创建的。我遵循了这个tutorial,它运行得很好,直到我想将Apache作为Windows服务启动,结果是:
[Tue Mar 14 14:43:28.277072 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00455: Apache/2.4.56 (Win64) mod_wsgi/4.9.4 Python/3.10 configured -- resuming normal operations
[Tue Mar 14 14:43:28.278069 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00456: Apache Lounge VS17 Server built: Mar 6 2023 10:53:37
[Tue Mar 14 14:43:28.278069 2023] [core:notice] [pid 19800:tid 412] AH00094: Command line: 'C:\\Apache24\\bin\\httpd.exe -d C:/Apache24'
[Tue Mar 14 14:43:28.283041 2023] [mpm_winnt:notice] [pid 19800:tid 412] AH00418: Parent: Created child process 8896
Python path configuration:
PYTHONHOME = (not set)
PYTHONPATH = (not set)
program name = 'python'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = 'C:\\Apache24\\bin\\httpd.exe'
sys.base_prefix = 'C:\\miniconda3'
sys.base_exec_prefix = 'C:\\miniconda3'
sys.platlibdir = 'lib'
sys.executable = 'C:\\Apache24\\bin\\httpd.exe'
sys.prefix = 'C:\\miniconda3'
sys.exec_prefix = 'C:\\miniconda3'
sys.path = [
'C:\\miniconda3\\python310.zip',
'.\\DLLs',
'.\\lib',
'C:\\Apache24\\bin',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
Current thread 0x000050e4 (most recent call first):
<no Python frame>
[Tue Mar 14 14:43:28.946306 2023] [mpm_winnt:crit] [pid 19800:tid 412] AH00419: master_main: create child process failed. Exiting.
我的httpd.conf文件看起来像这样:
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
LoadFile "C:/miniconda3/python310.dll"
LoadModule wsgi_module "C:/Django/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/Django/venv/Scripts/python.exe"
WSGIPythonPath "C:/Django/Lib/site-packages"
<VirtualHost *:80>
ServerAlias www.server.com
ServerName server.com
ServerAdmin info@admin.com
SetEnv PYTHONUTF8 1
WSGIScriptAlias / "C:/Django/project/project/wsgi.py"
<Directory "C:/Django/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ "C:/Django/project/static/"
<Directory "C:/Django/project/static">
Require all granted
</Directory>
ErrorLog "C:/Apache24/logs/apache.error.log"
CustomLog "C:/Apache24/logs/apache.custom.log" common
</VirtualHost>
加载文件我也尝试过将python310.dll复制到.venv/Scripts路径(如教程中所述),但这会引发一个错误,即.dll无法找到。2此外,我尝试设置这部分:
LoadFile "C:/miniconda3/python310.dll"
LoadModule wsgi_module "C:/Django/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/Django/venv/Scripts/python.exe"
WSGIPythonPath "C:/Django/Lib/site-packages"
作为迷你图标路径,以防这可能导致问题。
最后我也试着让Django本身成为一个Windows服务,但是环境说它已经安装了pypiwin32
和pywin32
,但是无法导入
import win32serviceutil
import win32service
import win32event
import servicemanager
理想情况下,我可以修复Apache的第一个问题。但是,有几篇文章没有帮助,因为他们经常只是建议不要设置PYTHONHOME或PYTHONPATH(在可能的情况下,两者都没有设置),或者问题是基于Linux的。
此外,我怀疑系统前缀中的miniconda 3可能会导致问题,但是miniconda是不同项目所需要的。
有人知道我做错了什么吗?(可以提供进一步的代码,但这已经是一个很长的问题)
1条答案
按热度按时间dsekswqp1#
如果任何人遇到类似的问题,下面的工作现在:
我下载了一个新的Python并安装给所有用户,并将其添加(手动)到Systempathvariables中。对于LoadFile python310.dll,路径现在来自这个新的Python,并且WSGIPythonHome转到新Python中的Python.exe。
此外,我想补充的是,我遵循的Tutorial确实建议安装一个新的Python,但是LoadFile建议转到Apache找不到的Project-root/venv/Scripts路径。
此外,当创建venv和安装软件包时,我以管理员身份打开了VS 2022的CMD提示符(安装VS构建工具时会出现)。在此之前,cmd在安装mod_wsgi时会引发错误,但作为管理员,这并不是问题。
我希望这对以后的人有帮助。