我想nginx
在我的 Synology NAS 上使用前端服务器来进行反向代理。目标是为托管 NAS 的不同网络服务器使用的非标准端口号提供一个外观。nginx
应该在端口 80 上监听,否则这一切都没有任何意义。
然而,DSM 开箱即用的Apache
服务器已经在侦听端口 80。它的所作所为真的很愚蠢:它只是重定向到端口 5000,这是 NAS Web 管理器 (DSM) 的入口点。
我想做的是禁用此功能,使端口 80 可用于我的nginx
服务器。我怎样才能做到这一点 ?
由于谷歌也为最近的 Synology DSM 重定向到这里,我回答 DSM6(基于http://tonylawrence.com/posts/unix/synology/freeing-port-80/)
从 DSM6 开始,nginx 被用作 HTTP 服务器和重定向的地方。以下命令将保留 ngingx,将其运行在端口 8880 而不是 80。
sudo -s
cd /usr/syno/share/nginx
server.mustache
, DSM.mustache
,WWWService.mustache
cp server.mustache server.mustache.bak
cp DSM.mustache DSM.mustache.bak
cp WWWService.mustache WWWService.mustache.bak
sed -i "s/80/8880/g" server.mustache
sed -i "s/80/8880/g" DSM.mustache
sed -i "s/80/8880/g" WWWService.mustache
443
移至8881
:
sed -i "s/443/8881/g" server.mustache
sed -i "s/443/8881/g" DSM.mustache
sed -i "s/443/8881/g" WWWService.mustache
http://YOURSYNOLOGYHOSTNAME:80
到http://localhost:8181
- 8181 是DSM 教程上的 pi-hole建议的端口)。tl;博士 编辑
/usr/syno/etc/synoservice.d/httpd-user.cfg
看起来像:{ "init_job_map":{"upstart":["httpd-user"]}, "user_controllable":"no", "mtu_sensitive":"yes", "auto_start":"no" }
然后编辑
stop on runlevel
要[0123456]
在/etc/init/httpd-user.conf
:Syno-Server> cat /etc/init/httpd-user.conf description "start httpd-user daemon" author "Development Infrastructure Team" console log reload signal SIGUSR1 start on syno.share.ready and syno.network.ready stop on runlevel [0123456] ...
...然后重新启动。
背景资料
Backslash36 给出的答案不是最简单的解决方案,也可能更难以维护。在这里,我给出了一个不涉及启动的webstation
解决方案,这是大多数其他解决方案所需要的。请注意,有关更新的文档,请参见此处,其中提供了有关 Synology 系统的大量信息。
需要注意的是,upstart
现在使用新的 DSM (> 5.x),所以以前的文档有很多是不正确的。httpd
Synology 机器上默认运行两个作业:
httpd-sys
:服务于管理页面,默认位于5000
/ 5001
。httpd-user
:这有点令人困惑,即使程序未启用 ,它也总是运行。webstation
如果webstation
:
/usr/syno/synoman/phpsrc/web
DocumentRoot
/usr/syno/synoman/phpsrc/web/index.cgi -> /usr/syno/synoman/webman/index.cgi
http://address.of.my.dsm
index.cgi
cgi
5000
admin_port
从命令行,您可以检查[secure_]admin_port
设置的内容:
Syno-Server> get_key_value /etc/synoinfo.conf admin_port
5184
Syno-Server> get_key_value /etc/synoinfo.conf secure_admin_port
5185
我在哪里设置了我的不同。
好的,现在到解决方案。最好的解决方案是简单地阻止httpd-user
守护程序启动。无论如何,这大概是您想要的(例如,在 docker 中启动另一个服务器,如“nginx”)。为此,请编辑相关的 upstart 配置文件:
Syno-Server> cat /usr/syno/etc/synoservice.d/httpd-user.cfg
{
"init_job_map":{"upstart":["httpd-user"]},
"user_controllable":"no",
"mtu_sensitive":"yes",
"auto_start":"no"
}
所以"auto_start"
条目是"no"
(如上所示)。它可能会"yes"
在您的机器上并且默认情况下。然后编辑stop on runlevel
要[0123456]
在/etc/init/httpd-user.conf
:
Syno-Server> cat /etc/init/httpd-user.conf
description "start httpd-user daemon"
author "Development Infrastructure Team"
console log
reload signal SIGUSR1
start on syno.share.ready and syno.network.ready
stop on runlevel [0123456]
...
最后一步是确保httpd-user
服务确实启动,然后自动停止。这是因为实际上有许多服务依赖于它的启动。重新启动您的计算机,您现在将看到端口 80 上没有任何东西在侦听(或转发)。
完毕 !这很棘手,但现在我可以正常工作了。这是我的做法。
以下内容需要使用 ssh 连接到 NAS,如果您想对您的产品保持保修,则可能不建议这样做(即使它是完全安全的恕我直言)
TL;DR:在以下文件中,将所有出现的端口替换
80
为非标准端口(例如,8080
)。这将释放端口80
并使其可供您想要的任何人使用。
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf-user
/etc/httpd/conf/httpd.conf-sys
/etc.defaults/httpd/conf/httpd.conf-user
/etc.defaults/httpd/conf/httpd.conf-sys
请注意,修改这些文件的一个子集可能就足够了(我可以观察到第一个实际上是从其他几个文件中计算出来的)。我想修改文件/etc.defaults/
就足够了,但如果没有,最坏的情况是修改所有这些文件,你会没事的。
完成后,不要忘记重新启动 NAS!
对于那些对我如何发现感兴趣的人
我对 Linux 文件系统不太熟悉,对Apache
配置更不熟悉。但我知道处理启动过程的脚本位于/etc/init
. 执行重定向的Apache
服务器肯定会从那里启动。
这是我不得不弄脏手的地方。我对我认为相关的目录中的文件执行了一些操作cat <filename> | grep 80
,希望找到一个配置行,将端口号设置为80
.
这种直觉得到了回报:/etc/init/httpd-user.conf
包含了这条线echo "DocumentRoot \"/usr/syno/synoman/phpsrc/web\"" >> "${HttpdConf}" #port 80 to 5000
。答对了 !
查看文件顶部,我发现HttpdConf
变量指的是/etc/httpd/conf/httpd.conf
. 这是进行实际配置的地方。
Apache
从那里开始相对简单,即使对于那些对配置一无所知的 John Snow 也是如此。诀窍是注意到它httpd.conf
是在启动时从某个模板实例化的(因此更改此文件是不够的)。执行 a find / -name "*httpd.conf*"
, 结合 somegrep 80
给了我要修改的文件列表。
当你回头看时,这一切看起来当然很明显。不过我希望 Synology 能给我们更多的灵活性,这样我们就不必像那样进行肮脏的黑客攻击了……