局域网访问本地网站……win10 Apache2.4+Django2.2+python3.7

本来是观看别人的文档然后轻松加愉悦的完成,结果搞了我差不多半天我整个人很恼火,决定写下来。

--

首先是环境的配置,这些就不提了,大致写一下步骤

1.下载Apache2.4,安装,然后在command line里面打

httpd.exe -k install -n "apache2.4"

一定得是管理员模式下,后面的是你所创建的服务名称,可不写(未测验)

这样就可以配置httpd.conf了,光是安装的话没有可启动的服务器 很傻的

2.打开httpd.conf,根据你安装的位置改这一行

Define SRVROOT "C:\Apache24"

 这样其他地方包含${SRVROOT}的都会自动替换了,别挨个把所有的地方都改了,没必要,不嫌累么(我特么就挨个改了一遍)

先搞到这里,然后我们需要一个神奇的mod_wsgi文件来解释?编译?一下我们的python代码,nginx对应的是uwsgi(这也不记得对不对了,哇,我真是什么都爱提一下,这是在为我论文凑字数预热么)

mod_wsgi在这里下载

虽然文件名蛮多的,但是选择版本号靠后、且对应自己运行环境的即可,例如

  • mod_wsgi‑4.6.7+ap24vc15‑cp37‑cp37m‑win_amd64.whl

这个指的是适用于apache2.4,运行环境visual c++ 15(大概,总之不重要,因为我没有特地去下载)cp37是python3.7,amd64是64位处理器

下载下来之后放在哪里无所谓,直接在你创建好的的虚拟环境中用pip install "你下载的这个文件的地址"

不过我们后面还需要一个命令

mod_wsgi-express module-config

去获得mod_wsgi所安装的位置来配置httpd.conf,而mod_wsgi-express这个文件在你的虚拟环境当中刚刚被创建好了,所以要cd到你的这个虚拟环境当中的/Scripts目录下运行上面的命令

如果一切顺利你将会获得三行地址,大概长这种亚子(我直接用的根目录,没进虚拟环境)

LoadFile "c:/python/python37/python37.dll"
LoadModule wsgi_module "c:/python/python37/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/python/python37"

得到了之后,粘贴到httpd.conf的最下面,再加上下面的

#你Django工程文件地址
WSGIPythonPath D:\workshop\project\webservice\pure
#你wsgi文件地址(wsgi.py是Django自动生成的,无需配置)
WSGIScriptAlias / D:\workshop\project\webservice\pure\pure\wsgi.py
#设置一下权限使得可以读取wsgi文件


Require all granted

然后再在listen后面写你要监听的地址和端口 直接写80就是访问localhost,servername我这里是复制listen,比如

Listen 80
ServerName localhost:80

这下运行你的服务(打开httpd.exe or用monitor运行or命令行运行我不知道具体是啥命令)如果你足够幸运的话(?)你就基本配置完辣!

这里就要提到我碰到的壁了,我最开始没有运行上面的mod_wsgi-express那个命令,直接根据我的根目录粘了别人获得的结果上去改了改,结果运行完apache直接跟我说无法加载django,我的根目录确实是很纯净毛都没安装的那种,于是我转头乖乖的load了我的虚拟环境,按照上面的步骤重新把mod_wsgi安装了一遍,然后运行了module-config那个命令,结果我的结果只有两行

LoadModule wsgi_module "d:/workshop/project/microm/pure/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "d:/workshop/project/microm/pure"

怎么跟别人不一样啊,那我也没辙,先放到httpd.conf里面,然后再运行,失败,打开log说

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x000031b8 (most recent call first):
[Mon Aug 19 10:24:24.303598 2019] [mpm_winnt:crit] [pid 27112:tid 636] AH00419: master_main: create child process failed. Exiting.

瞅着这意思是python都运行不了了呗

后来我加上 LoadFile那一行也没用,我也试图去加了

WSGIDaemonProcess django processes=2 threads=12 python-home=D:/workshop/project/microm/pure python-path=D:/workshop/project/webservice/pure

这种东西,也是没得卵用,Google了半天,感觉这个问题的回答应该是症结所在了——创建虚拟环境的时候没有用到shared-repository,虽然我不是很懂我一个纯净的仓库有什么好share的,而且我也不想在搞一个虚拟环境了,主要是想搜一下python shared repository也没有相关的解释,就很难受,(这个答案怕不是Linux限定)干脆就直接在根目录安了Django,改好目录地址,然后就好了。好烦,我的根目录不纯洁了(?)

这之后我想尝试一下局域网内访问这个网站,就按这个教程搞了一下(我没关防火墙),结果我中间断过一次网,没反应过来还是用旧的IP地址,apache疯狂给我fail,log也不出原因,气得我刷了两小时视频(?),后来把listen和servername都搞成

ipconfig

给的地址,然后网络配置也手动设置好,就好了,感觉自己是个二货。

我用公寓的网电脑启动服务,然后手机可以访问,很开心!就是很烦感觉这一大堆的配置太反人类了。。而且跟别人的教程做出来不一样是真的气人。

参考教程

你可能感兴趣的:(小白练功中)