最近有个小项目需要在内网起一个http服务,给内网的其他机器分发内容。临时用一下的,而且内网搞nginx,或者caddy之类的都比较麻烦,caddy好像自动要去申请证书,怎么都搞不好。我只需要单纯的起个http服务让内网其他机器来wget就好了。查了一下python自带的SimpleHTTPServer就挺方便的一句话就能起服务。试了一下确实比较好用,但是有个比较明显的缺点就是单线程的,当内网有多个机器需要获取内容的时候,只能一个个排队来下载,这样效率比较低。查了一下网络上也有别人有搞过多线程,汇集了一下资源。放代码:
import socket
import SocketServer
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
class ForkingHTTPServer(SocketServer.ForkingTCPServer):
allow_reuse_address = 1
def server_bind(self):
"""Override server_bind to store the server name."""
SocketServer.TCPServer.server_bind(self)
host, port = self.socket.getsockname()[:2]
self.server_name = socket.getfqdn(host)
self.server_port = port
def test(HandlerClass=SimpleHTTPRequestHandler,
ServerClass=ForkingHTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
把上面的代码命名成MultithreadHTTPServer.py
如果不需要全局跑,假设上面这个文件放在/root下就运行
python -m /root/MultithreadHTTPServer 9000
这样就会在ip:9000起一个http服务直接访问http://ip:9000 就好了。
如果想要和原生的SimpleHTTPServer一样不用带目录就能跑的话。需要把MultithreadHTTPServer.py放到pip的安装目录下,可以先用以下命令查找pip安装目录
python -c "import SimpleHTTPServer;help(SimpleHTTPServer)"
会显示:
NAME
SimpleHTTPServer - Simple HTTP Server.
FILE
/usr/lib64/python2.7/SimpleHTTPServer.py
这个FILE就是目录了,我这边是/usr/lib64/python2.7/
所以把MultithreadHTTPServer.py丢进去,之后运行就不需要带上目录了,如下:
python -m MultithreadHTTPServer 9000
最后试了一下多个ip可以同时来拖文件了,不错。