如何让 ChromeOS/Linux 与 localhost、VirtualHosts 和本地存储顺利配合?

如何让 ChromeOS/Linux 与 localhost、VirtualHosts 和本地存储顺利配合?

我对 Linux 还很陌生,使用 localhost 只开发过自托管的,基于浏览器的 IDE到目前为止,在实时网站上。使用 Chromebook(v84、常规频道、Debian 10 Buster),我最终希望将正在进行的项目存储在 ChromeOS 端的各种文件夹中,并在 Chrome 中提供它们。这似乎应该很简单。以下是一些问题和其他信息。

  • 导航到 根本localhost无法解决任何问题
  • 导航到为penguin.linux.test我提供的 Apache2 Debian 默认页面或任何索引。*位于 /var/www/html(这不是我导航到本地主机时期望找到的吗?)
  • PHPMyAdmin 已已安装到 /var/www/html/phpmyadmin 并且我可以在 导航到它penguin.linux.test/phpmyadmin,但不能在localhost/phpmyadmin
  • penguin.linux.test/foo如果我创建 /var/www/html/foo/index.php,则无需进一步设置即可在 中使用,但在localhost/foo
  • 如果我在 /var/www/html 之外创建一个文件夹(记住这是我的最终目标),然后在 /var/www/html/foo 处创建一个指向该文件夹的符号链接,则不会提供任何服务penguin.linux.test/foo。诚然,这是意料之中的,但值得一试。
  • 如果我使用Chrome 的 Web 服务器,指向任何本地文件夹(Linux 端或 ChromeOS 端)我可以在 找到它,localhost:8887但在 找不到penguin.linux.test:8887。但是,它仅提供纯文本形式的 PHP 文件,因此用途有限。
  • 如果我这样做docker run --rm -p 8080:80 -d hlsiira/atheos,它就会同时在两个地方提供服务,localhost:8080而且penguin.linux.test:8080很好

我想很明显,过去几天我掉进了 Google 的兔子洞。哈哈。这就是我发这篇故事的原因。如果其他人也掉进这个洞里,他们也许也会在这里得到一些帮助。

我必须使用 penguin.linux.test 作为我的本地主机,这似乎不太合适……Docker 和 Chrome 的 Web 服务器正在使用它。除了在进入正题之前必须输入一个尴尬的地址之外,将我正在开发的网站存储在 /var/www/html 中似乎也很尴尬。即使现在不考虑我的 ChromeOS 存储要求,任何个人的、正在进行的项目至少应该存储在 Linux 主文件夹中,对吧?至少为了方便访问。如果事实证明它必须是 Linux 文件夹而不是 ChromeOS,那么如果它是主文件夹,我就可以应付。我想我已经决定使用 VirtualHosts 作为答案,但它对我来说不起作用。

总结

假设我想将我的网站存储在~/foo/public_html,我已经创建了/etc/apache2/sites-available/foo.conf...

<VirtualHost *:80>
  ServerName local.foo
  DocumentRoot "~/foo/public_html"
</VirtualHost>

并运行sudo a2ensite foo.conf,然后我在 /etc/hosts 中添加了一行并运行sudo systemctl restart apache2...

127.0.1.1       penguin
127.0.0.1       localhost
127.0.0.1       local.foo      /* line I added */
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

如果我转到local.foolocal.foo.localhost或者 ,localhost/local.foo我会得到“无法访问站点”的信息。我还尝试了local.foo:80local.foo:8080、的各种组合127.0.0.1以及localhost:8080的各种组合......(在 /etc/apache2/sites-available/foo.conf 中)

/* Using Listen (it just causes apache to crash) */
Listen 80
Listen 8080
Listen 127.0.0.1
Listen 127.0.0.1:80

/* changing the opening block */
<VirtualHost local.foo:80>
<VirtualHost localhost:80>
<VirtualHost 127.0.0.1:80>
<VirtualHost 127.0.0.1:8080>

/* various directives (not all at the same time obvs ) */
  ServerName local.foo
  ServerName localhost
  DocumentRoot "~/foo/public_html"
  ServerAlias local.foo
  ServerAlias localhost
  <Directory "~/foo/public_html">
    Options FollowSymLinks
    Options Indexes FollowSymLinks
    AllowOverride none
    AllowOverride All
    Require all denied
    Require all granted
  </Directory>       
</VirtualHost>

我跑步后也重复了这一切sudo a2dissite 000-default.conf

现在我已经没有才华了。下一步该怎么办?

答案1

从表面上看,如果想要在 Chrome OS Chrome 浏览器上测试 Linux 本地主机,则需要使用http://penguin.linux.test而不是http://localhost。另一方面,如果已经从 Crostini Linux LXC 安装了 Linux Chrome 浏览器,则需要使用localhost而不是penguin.linux.test来测试 Linux 本地主机。

例如,我有两个正在运行的容器(一个 React.js 前端应用程序和一个 Node.js 后端应用程序)。简而言之,两个容器相互通信 - 前端向后端发送请求,后端向前端发送响应。两个容器分别将端口 3000 和 80 发布到 Linux 本地主机。为了测试我的后端应用程序,我从我的 Crostini Linux LXC 终端通过 curl 发送 POST 请求(注意:我需要使用 来访问端点localhost,而不是penguin.linux.test因为我从 Crostini Linux LXC 进行测试)。另一方面,为了在我的 Chrome OS Chrome 浏览器上测试我的前端应用程序,React 应用程序本身的源代码必须将请求发送到penguin.linux.test而不是localhost,否则浏览器控制台将抛出错误。我必须penguin.linux.test在这里使用 因为我在 Chrome OS Chrome 浏览器上进行测试。另一方面,如果我安装了 Linux Chrome 浏览器并在其上进行测试,我的前端应用程序的源代码将需要将请求发送到localhost而不是penguin.linux.test

答案2

这个答案也是我旅程的延续(对于任何跟在我后面的人来说)

我认为我已经得出结论,ChromeOS 的本地主机和 Linux 的本地主机之间存在某种障碍(目前),如果我想得到我想要的东西,我需要充分了解并克服这种障碍。希望我在这里倾诉的想法能激发如何做到这一点的想法。

在我看来,就 ChromeOS 浏览器而言,Linux 的 localhost 位于penguin.linux.test100.115.92.197。那么这是否意味着 Linux 的 /etc/hosts 实际上并未使用,直到 ChromeOS 浏览器 URL 已经指向这些地址?据我所知,这会导致Linux 的 /etc/hosts 中的ServerName和变得无用。ServerAlias

ChromeOS 浏览器显然有自己的 hosts 文件,该文件指向 Linux 的本地主机,但据我从 Google 了解到的情况,该文件不可编辑。但一定有某种方法可以操纵 ChromeOS 浏览器主机,因为 Docker 似乎可以做到这一点,正如我的 OP 中所述。不过,我没有任何其他线索可以找到答案。

我知道,如果我要在 Linux 容器中安装浏览器(具有讽刺意味的是,即使是 Linux 版本的 Chrome 本身也是一种噩梦!)那么就该浏览器中的 VirtualHosts 和 ServerName 以及 /etc/hosts 和 localhost 而言,一切都会很顺利,我可以在 Linux 环境中的任何位置找到我的文件。但是,当我在 ChromeOS 中有一个非常好用的浏览器时,我不会在 Linux 中安装浏览器。(好吧,也许是 TOR 浏览器;)


工作设置涉及使用 Linux 的本地主机端口和 Chrome 浏览器扩展,目前这已经足以满足我的需求,但我确信真正的答案在于以某种方式操纵 ChromeOS 的主机。

我恢复了原始的 /etc/hosts 文件,那里不需要进行任何更改。

我发现,如果我想让 VirtualHosts 指向我的主目录中的路径,我还需要告诉 /etc/apache2/apache2.conf 以我的名义执行此操作,我们可以从终端执行此操作

/* Obviously, change 'baddie' to your user */

sudo sed -i "s|User root|User baddie|" /etc/apache2/apache2.conf
sudo sed -i "s|Group root|Group baddie|" /etc/apache2/apache2.conf

/* This only seems to be needed if you want to point your */
/* VirtualHosts to paths in your home folder */

对于我的 VirtualHosts...

  • 由于我似乎无法使用ServerNameServerAlias,我认为我别无选择,只能通过端口来处理它们。
  • 我将端口号包含到Listen,然后为该端口号打开一个 VirtualHost 块。
  • DocumentRoot是我的项目的路径,无论它在哪里。
  • 因为我想将我的项目存储在 /var/www/html 之外,所以我需要包含一个<Directory>与 DocumentRoot 相同路径的指令。
  • 如果我的 ChromeOS 文件夹与 Linux 共享,我可以将路径设置为指向类似的内容/mnt/chromeos/MyFiles/projects/foo/public_html
  • 但是我想指向主文件夹中的符号链接,因此,如果我将Options +SymLinksIfOwnerMatchand添加Require all granted到 Directory 指令中,那么它也会起作用。
  • 我需要对 DocumentRoot 和 Directory 路径使用绝对路径,而不是使用像这样的快捷方式~

我最终在 /etc/apache2/sites-available/foo.conf 中得到的是......

Listen 12001

/* Obviously, change 'baddie' to your user
/* Use absolute paths */

/* This points to a Symlink in my home folder which in turn */
/* points to /mnt/chromeos/MyFiles/projects/foo/public_html /*
<VirtualHost *:12001>
  DocumentRoot "/home/baddie/Projects/foo"
  <Directory "/home/baddie/Projects/foo">
    Options +SymLinksIfOwnerMatch
    Require all granted
  </Directory>
</VirtualHost>

重新启动服务器后,我便可以成功访问该项目penguin.linux.test:12001。但我有很多项目,因此我必须为每个项目创建一个 .conf 文件,然后为sudo a2ensite每个项目创建一个,然后重新启动服务器。

难题的最后一部分是能够输入人性化的 URL,而无需记住相关端口。由于我无法更改 ChromeOS 的 hosts 文件,并且 Linux 的 /etc/hosts 中的 ServerName 和 ServerAlias 毫无用处,因此我使用了一个名为主机名重写器. 通过这个我可以得到一个想要的 URL 就像foo.local并将其重写为penguin.linux.test:12001

不过,这是整个操作中最麻烦的部分。如果我不在http://地址栏中包含,那么浏览器只会在 Google 上搜索foo.local。如果包含了,那么浏览器首先会将页面解析为“无法访问该网站”,然后大约一秒钟后,浏览器最终被重定向。重定向后,URL 会显示penguin.linux.test:12001预期的内容,但不再看起来人性化。啊,至少我不用记住端口号就到达了那里……最终


微软XAMPP 通过一次又一次的尝试和错误尝试,我最终放弃了独立的 Apache 安装,现在微软XAMPP为了使上述解决方法在 XAMPP 上发挥作用,需要做一些区别。

我们不需要为每个项目创建单独的 .conf 文件然后运行,sudo a2ensite project_name.conf而是需要先编辑 /opt/lampp/etc/httpd.conf 并告诉它使用 /opt/lampp/etc/extra/httpd-vhosts.conf。我们可以从终端执行此操作

sudo sed -i "s|#Include etc/extra/httpd-vhosts.conf|Include etc/extra/httpd-vhosts.conf|" /opt/lampp/etc/httpd.conf

我们还使用 /opt/lampp/etc/httpd.conf 来告诉 Apache 以我的身份运行,我们可以从终端执行此操作

/* Obviously, change 'baddie' to your user */

sudo sed -i "s|User daemon|User baddie|" /opt/lampp/etc/httpd.conf
sudo sed -i "s|Group daemon|Group baddie|" /opt/lampp/etc/httpd.conf

/* This only seems to be needed if you want to point your */
/* VirtualHosts to paths in your home folder */

/opt/lamp/etc/extra/httpd-vhosts.conf 包含大量示例数据,可以全部删除并替换为上面各个 .conf 文件中的相同信息。所以我们得到...

/* There doesn't seem to be a way to listen to a range */
/* of ports so each one you want to listen to has to be */
*/ individually stated */
Listen 12001
Listen 12002
Listen 12003

/* Obviously, change 'baddie' to your user */
/* Use absolute paths */

/* This points to a Symlink in my home folder which in turn */
/* points to /mnt/chromeos/MyFiles/projects/foo/public_html /*
<VirtualHost *:12001>
  DocumentRoot "/home/baddie/Projects/foo"
  <Directory "/home/baddie/Projects/foo">
    Options +SymLinksIfOwnerMatch
    Require all granted
  </Directory>
</VirtualHost>

/* This points to a Symlink in my home folder which in turn */
/* points to /mnt/chromeos/MyFiles/projects/bar/public_html /*
<VirtualHost *:12002>
  DocumentRoot "/home/baddie/Projects/bar"
  <Directory "/home/baddie/Projects/bar">
    Options +SymLinksIfOwnerMatch
    Require all granted
  </Directory>
</VirtualHost>

/* This points to a Symlink in my home folder which in turn */
/* points to /mnt/chromeos/MyFiles/projects/baz/public_html /*
<VirtualHost *:120003>
  DocumentRoot "/home/baddie/Projects/baz"
  <Directory "/home/baddie/Projects/baz">
    Options +SymLinksIfOwnerMatch
    Require all granted
  </Directory>
</VirtualHost>

正如我所说,现在这个设置对我来说已经很满意了……或者说,除非我重新将项目存储在 Linux 系统而不是 ChromeOS 系统中,因为 Git 无法在 ChromeOS 文件夹中运行!算了。不过那是另一篇文章的内容了。

相关内容