解压后,去文件目录内的conf文件夹内的httpd.conf修改

Define SRVROOT "C:\Apache24"  #Apache24文件的路径,其余不用改。

解压后,去文件目录内的conf文件夹内的httpd.conf修改

Define SRVROOT "C:\Apache24"  #Apache24文件的路径,其余不用改。
...
Listen 192.168.31.227:8000 #此处为你要发布的网站ip地址,此处我用我电脑的ip和端口,你也可以用127.0.0.1:8000用于本地测试;80端口自己设置
...
ServerName 192.168.31.227:8000

在bin文件夹下执行
httpd.exe -k install -n “apache2.4” #apache2.4是所创建服务器名称,可更改。

我的电脑右键—>管理---->服务和应用程序---->服务-----> apache2.4右键----->启动
如果启动报错,去bin文件夹下执行命令

>>> httpd.exe		根据报错寻找解决办法,我当时apache路径写错,直接报出所在行目

如果报错如下

D:\Apache24\bin>httpd.exe
(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试。  : AH00072: make_sock: could not bind to address 192.168.1.127:8081
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs

可能是Listen 端口占用问题

查看端口命令
D:\>netstat -aon|findstr 80		查看80端口占用

启动成功后访问配置的ip地址
会出现访问成功的页面
在这里插入图片描述

二 、安装python
1、安装mod_wsgi
下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi 进入网址后,下载对应版本,ap24cv24指apache版本,比如我的是apache24, cp36指python3.6,win_adm64指操作系统为64位,这里一定要下载正确版本,不然后面无法正确部署。、

安装:

pip3 install "mod_wsgi-4.5.24+ap24vc14-cp36-cp36m-win_amd64.whl"

执行命令

mod_wsgi-express module-config		

出现三行日志(复制下来记住,可能向下边这样)

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

2 、安装python3

三 、安装mysql
四 、安装redis
五 、安装需要环境

django 、channels、channels_redis、mysqlclient,pywin32、djangorestframework
基本直接pip install 就可以
mysqlclient可能比较难装

主要就是这些库、windows还需要其他的库,需要时再下载

六、配置apache
需要配置uwsgi代理

做一个配置文件引入,可能本来就有,需要解掉注释
Include conf/extra/httpd-vhosts.conf

刚才复制的三行代码
LoadFile "c:/users/nickwu/appdata/local/programs/python/python37/python37.dll"
LoadModule wsgi_module "c:/users/nickwu/appdata/local/programs/python/python37/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/users/nickwu/appdata/local/programs/python/python37"

项目的路径,不是python的
WSGIPythonPath D:\Object\object\mysite

httpd-vhosts.conf 文件的配置

Listen 8000																		监听的端口
<VirtualHost *:8000>														配置虚拟机
	ServerName localhost

	WSGIScriptAlias / D:/Object/object/mysite/mysite/wsgi.py					django wsgi的位置
	
	<Directory D:\Object\object\mysite\mysite>										项目位置
		<Files wsgi.py>																							应该是wsgi的文件权限
			Require all granted
		</Files>
	</Directory>

	Alias /static D:\Object\object\mysite\static												静态文件位置
	<Directory D:\Object\object\mysite\static>  												静态文件的权限
		AllowOverride None  
		Options all
		Require all granted  
	</Directory>

	Alias /media D:\Object\object\mysite\media												media配置
	<Directory D:\Object\object\mysite\media>  
		AllowOverride None  
		Options None  
		Require all granted  
	</Directory>
	
	ProxyPass /ws ws://localhost:8001/ws													      websocket代理
	ProxyPassReverse /ws ws://localhost:8001/ws	
	ProxyRequests Off 
	ProxyMaxForwards 100 
	ProxyPreserveHost On
	
	ErrorLog "D:\Object\object\mysite\logs\error.log"										日志位置,这将和apache日志分开打印
	
	CustomLog "D:\Object\object\mysite\logs\access.log" common
</VirtualHost>


为了使用websocket 需要
将 LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so 前面的#去掉。

七 、daphne配置
https://pypi.org/project/daphne/1.2.0/
其实只是一条命令

daphne -b 0.0.0.0 -p 8001 --access-log logs/webso.log --access-log logs/websocket1.log -s asgi --proxy-headers mysite.asgi:application

个人感觉这样运行很不把握,在centos上会使用进程管理工具代替运行。但是windows上不知道用什么代替。

八 、 为了实现开机自启(这部分纯属diy 谁会做请指教)
我把这条命令放到一个bat文件中,但是运行时发现会出现一个cmd窗口,而且关闭就会导致进程中断。于是百度到了一个隐藏cmd的方法,就是用vbs脚本。(python应该也可以,但是感觉麻烦)

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "D:\Object\object\mysite\xxxxx.bat",0

D:\Object\object\mysite\xxxxx.bat 			这是bat的位置


九 、说一说问题
1 、uwsgi是依附于apache运行,感觉属于apache进程的下属,不是很稳妥(应该是可以做到分离,但是没有百度到)
2 、daphne依附于cmd运行,感觉更差劲
但是没有百度到好的办法。

十 、说一说channels的问题
博客:https://www.jianshu.com/p/dda97a5b1074

感觉django的这个websocket非常麻烦。为了他做了好多事。运行时发现一个问题,mysql的连接总是断掉。
报错:MySQL server has gone away

django的数据库配置中有一个配置  CONN_MAX_AGE 
如果为0: 每一次使用数据库的连接都会删除掉原来的连接重新建立
不为0 :	 在距上一次使用连接的时间在这个时间之内不会重新建立

但是channels不会受这个配置控制,没有这种建立数据库连接的配置方法。于是可能访问到时效的连接。博客内有解决办法。