Apache 没有在 Ubuntu 上为我提供已安装的网络共享中的某些内容。
根据我尝试打开的文件的内容,它无法正确提供:
这不起作用:
is a link to another nifty site
<H2>This is a Medium Header</H2>
Chrome 发出以下错误消息:“错误信息_无效_HTTP_响应“
邮递员:“错误:解析错误:预期 HTTP/“
卷曲:“curl:(1)在不允许的情况下收到 HTTP/0.9“
这有效(只需多一个空白行)
is a link to another nifty site
<H2>This is a Medium Header</H2>
网络共享安装在 /media/data 中(cifs;出于测试目的,权限设置为 777)
有一个从 /var/www/server 到 /media/data 的符号链接,我可以从 VM 内部查看和更改内容。
Apache 对文件内容如此挑剔对我来说毫无意义。我不太清楚如何解释来自 3 个不同客户端的错误消息,但由于它们都失败了,所以看起来问题出在 Apache 身上,尽管错误日志没有显示任何问题。
将文件复制到 /var/www/html(默认目录)并将 vhost 更改为该位置后,无论内容是什么,文件都会得到提供服务。
我不知道这是否重要,但在搜索“错误信息_无效_HTTP_响应“我在网上发现有些人在谈论 chrome 在某些端口上的行为异常:我当前在端口 28080 上运行服务器(为了与当前设置向后兼容,并且因为我计划在端口 80 上设置 nginx);nginx 已经安装好了,但我不认为它会造成干扰。
如果这听起来有点令人困惑,请原谅我,但这可能只是因为我自己完全困惑。
这是一个干净的虚拟机,据我所知,唯一的附加包是 apache、nginx 和 cifs-utils。
在此情况下,是否有其他人遇到过网络共享的奇怪行为?我希望将 htdocs 放在网络共享上,因为这样我可以从 Windows 机器上更轻松地访问,除了网络共享之外,还有其他推荐的方法来访问 htdocs 吗?
编辑:
curl --verbose --output out.txt --http0.9 localhost:28080/test.html
给出以下控制台输出:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 127.0.0.1:28080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 28080 (#0)
> GET /test.html HTTP/1.1
> Host: localhost:28080
> User-Agent: curl/7.68.0
> Accept: */*
>
{ [15 bytes data]
100 294 0 294 0 0 58 0 --:--:-- 0:00:05 --:--:-- 0
* Closing connection 0
而 out.txt 包含以下内容:
18:55:12 GMT
ETag: *removed*
Accept-Ranges: bytes
Content-Length: 67
Content-Type: text/html
is a link to another nifty site
<H2>This is a Medium Header</H2>
^@^@^@^@^@^@�)^@^@^@^@^@^@w�^@^@�r�X]﹟^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@����������������^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
在另一个文件上,末尾的奇怪字符串实际上包含关键字 SMB。我不知道这是巧合还是真的意味着什么:
19:34:11 GMT
ETag: *removed*
Accept-Ranges: bytes
Content-Length: 6
Content-Type: text/plain
sadssa^@^@^@^@]﹟^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@)^@^A^Re ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@�����������������SMB@^@^@^@^@^@^@^@^F^@
^@^D^@^@^@^@^@^@^@�)^@^@^@^@^@^@w�^@^@�r�X]﹟^@^@^@^@^@
我还注意到 r 和 X 部分可能与文件权限有关?
编辑2:
网络共享(fstab):
//www.example.com/Share /media/data cifs username=user,password=pass,domain=WORKGROUP,vers=2.0,file_mode=0777,dir_mode=0777 0 0
已建立符号链接:
sudo ln -s /media/data/ /var/www/server
Apache2.conf:
[...]
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
[...]
答案1
不要使用符号链接/media/data
,/var/www/server
而是使用 bindfs:
# Install bindfs
sudo apt install bindfs
# Stop apache
sudo systemctl stop apache2
# Remove symlink
sudo rm /var/www/server
# Create dir
sudo mkdir /var/www/server
# Bind mount
sudo bindfs -u www-data -g www-data /media/data /var/www/server
# Start apache
sudo systemctl start apache2
如果提供的网页是静态的或者使用数据库作为后端,您还可以-r
向 bindfs 调用添加选项,以使挂载为只读。
添加一个条目以便/etc/fstab
在启动时自动挂载:
/media/data /var/www/server fuse.bindfs user=www-data,force-group=www-data 0 0
大多数 Web 服务器都希望文件归属于文件系统www-data
,并且需要文件系统的某些功能,而 Samba 挂载无法提供这些功能。符号链接无法解决这些问题。该bindfs
解决方案通过添加另一个透明的抽象层为 Web 服务器提供所有这些要求。恕我直言,我认为这种bindfs
方法是更简洁的解决方案。
答案2
在 中/etc/apache2/apache2.conf
添加:
EnableSendfile Off
EnableMMAP off
这救了我的命。
答案3
这也可能与 SendFile 不兼容。请参阅此答案:https://serverfault.com/a/62732
或者与 MMAP 不兼容。请参阅以下答案: https://serverfault.com/a/1047215/191716
答案4
我最近遇到了 AKS、PHP 以及通过 CSI 安装文件共享和通过 Fuse 安装 blob 容器的问题。尝试使用 curl 访问图像时,显示错误“在不允许的情况下收到 HTTP/0.9”。虽然允许 HTTP 0.9 确实允许访问,但它很慢并且不适合页面导航。
不过,幸亏 Jack Wang 提供的解决方案,问题才得以解决。非常感谢他的帮助。