从任何目录运行一个Web服务器

我正在编写一个小型网站,但我不想弄清楚如何安装和配置完整的LAMP堆栈来从我的~/home目录测试网站。那将是完全破坏性和不必要的。 我只想有一个目录,例如~/home/Documents/Website,并从该文件夹运行一个小型Web服务器作为网站的“主页”文件夹。 我知道Jekyll可以做类似的事情,但它似乎只适用于它构建和配置的基于Ruby/Jekyll的网站。 难道没有一些我可以轻松安装然后简单运行的小型Web服务器程序吗? 例如,如果我只需要从命令行运行像simple-server serve ~/home/Documents/Website这样的东西,然后导航到例如localhost:4000或其他来测试网站,那就太完美了。 如果在Ubuntu中已经可以实现这一点,而我只是不知道如何操作,请告诉我。

你有哪些类型的文件: phppython 或纯 html - Dan
@dan08 目前只是简单的 htmlcss。将来可能会想要添加 NodeJS,但那时我会有一个不同的设置。 - etsnyman
所以您可以直接在浏览器中打开它们,无需服务器。 - Dan
您能澄清您的问题吗?从/var/www/html提供文档要比从您的主目录更容易得多。无论如何,您都需要安装Apache以及可能需要的mysql、php或其他内容。要使用/va/www/html,只需复制文件即可。配置Apache以从您的主目录提供文件需要更多工作,因为您必须启用主目录或编辑Apache配置文件。在这两个位置上,您仍然必须使www-data可以访问这些目录/文件。我不明白您认为有什么困难。 - Panther
1@dan08 使用file://地址而不是http://地址存在严重的限制。一些链接和小的Javascript代码片段根本无法正常工作。 - etsnyman
@bodhi.zazen 举例来说,Jekyll可以在没有Apache、mysql或php的情况下提供一个完整的网页。肯定有类似的软件包,不需要Jekyll构建网站吧? - etsnyman
如果你想使用 http:// 而不是 file:// ,就需要一个网络服务器。Apache 是最常见的,还有其他的,如nginx,你可以选择任何一个。我对Jekyll不太熟悉,但如果你有经验,请使用它。 - Panther
1关于Apache和Jekyll的所有信息,以及为什么它们都不适用于我,都在我的原始问题中。请在添加评论或回答之前仔细阅读。 - etsnyman
感谢 @muru 阅读了我的原始问题,Ubuntu 已经内置了一个简单的 Web 服务器,以 Python 的 http.server 形式存在。 - etsnyman
我不知道是谁给我的问题点了踩,但如果是上面的评论者之一,那么这个人没有正确阅读我的问题。@muru 没有任何问题地阅读并用简单、易懂的解决方案回答了我的问题。 - etsnyman
5个回答

我知道的最简单的方法是:
cd /path/to/web-data
python3 -m http.server
命令的输出将告诉您它正在监听哪个端口(默认为8000,我想是这样)。 运行python3 -m http.server --help以查看可用选项。 更多信息请参考:
  1. 关于http.server的Python文档
  2. 简单的HTTP服务器(这也提到了python2的语法)

太棒了!谢谢你,@muru!不知道为什么,我的8000端口被占用了(我弄不明白为什么),但是我刚刚运行了python3 -m http.server 4000,然后在Firefox中导航到localhost:4000,哇!我的网站已经准备好测试了!谢谢! - etsnyman
怎样将它转换为一个shell脚本? - unixcreeper

如果您已经安装了PHP,您可以使用PHP内置服务器来运行HTML/CSS和/或PHP文件。
cd /path/to/your/app
php -S localhost:8000

你将得到以下输出:

Listening on localhost:8000
Document root is /path/to/your/app

你想要的是叫做“静态网页服务器”的东西。有很多方法可以实现这个目标。 它在静态网页服务器中有列出。 一个简单的方法:将下面的脚本保存为static_server.js
   var http = require("http"),
     url = require("url"),
     path = require("path"),
     fs = require("fs")
     port = process.argv[2] || 8888;

 http.createServer(function(request, response) {

   var uri = url.parse(request.url).pathname
     , filename = path.join(process.cwd(), uri);

   path.exists(filename, function(exists) {
     if(!exists) {
       response.writeHead(404, {"Content-Type": "text/plain"});
       response.write("404 Not Found\n");
       response.end();
       return;
     }

     if (fs.statSync(filename).isDirectory()) filename += '/index.html';

     fs.readFile(filename, "binary", function(err, file) {
       if(err) {        
         response.writeHead(500, {"Content-Type": "text/plain"});
         response.write(err + "\n");
         response.end();
         return;
       }

       response.writeHead(200);
       response.write(file, "binary");
       response.end();
     });
   });
 }).listen(parseInt(port, 10));

 console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");
将你的index.html放在同一个目录下,然后运行。
 node static_server.js

+1 对于静态服务器列表。我必须说,那段代码的缩进看起来非常奇怪。 - muru
https://stackoverflow.com/a/30902022/7172363 - Алексей Неудачин

使用busybox。例如,使用Debian操作系统。
apt install busybox
mkdir ~/www
busybox httpd -p 80 -h ~/www

安装local-web-server,它会安装ws命令,您可以运行该命令将任何目录作为静态网站进行服务。 此片段演示了静态托管以及几种日志输出格式 - devstats

Static static log output