我对 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.foo
,local.foo.localhost
或者 ,localhost/local.foo
我会得到“无法访问站点”的信息。我还尝试了local.foo:80
、local.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.test
或100.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...
- 由于我似乎无法使用
ServerName
或ServerAlias
,我认为我别无选择,只能通过端口来处理它们。 - 我将端口号包含到
Listen
,然后为该端口号打开一个 VirtualHost 块。 - 这
DocumentRoot
是我的项目的路径,无论它在哪里。 - 因为我想将我的项目存储在 /var/www/html 之外,所以我需要包含一个
<Directory>
与 DocumentRoot 相同路径的指令。 - 如果我的 ChromeOS 文件夹与 Linux 共享,我可以将路径设置为指向类似的内容
/mnt/chromeos/MyFiles/projects/foo/public_html
。 - 但是我想指向主文件夹中的符号链接,因此,如果我将
Options +SymLinksIfOwnerMatch
and添加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 文件夹中运行!算了。不过那是另一篇文章的内容了。