Apache 不提供网络共享的某些内容

Apache 不提供网络共享的某些内容

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 提供的解决方案,问题才得以解决。非常感谢他的帮助。

同一问题的其他观点: https://serverfault.com/questions/1090235/unable-to-serve-images-from-wordpress-site-response-is-malformed

或这个: https://github.com/Azure/AKS/issues/2614

相关内容