我想在我的Synology NAS上使用nginx
前端服务器来进行反向代理。目标是为托管NAS的各种Web服务器使用的非标准端口号提供外观。 nginx
应该在端口80上侦听,否则这一切都没有任何意义。
然而,DSM开箱即用的Apache
服务器已经在端口80上侦听。它的作用真的很愚蠢:它只是重定向到端口5000,这是NAS Web管理器(DSM)的入口点。
我想要做的是禁用此功能,使端口80可用于我的nginx
服务器。我怎样才能做到这一点 ?
tl; dr编辑
/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
,这是大多数其他解决方案所需要的。请注意,有关更新的文档,请参阅here,它提供了有关synology系统的大量信息。
值得注意的是,新的DSM(> 5.x)现在使用upstart
,因此以前的大部分文档都不正确。在synology机器上默认运行两个httpd
作业:
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
。这是实际配置发生的地方。从那里开始它是相对简单的,即使那些John Snow在那里对Apache
配置一无所知。诀窍是要注意httpd.conf
在启动时从某个模板实例化(因此更改此文件是不够的)。执行find / -name "*httpd.conf*"
,结合一些grep 80
给了我要修改的文件列表。
当你回头看时,这一切看起来很明显。不过我希望Synology给我们更大的灵活性,所以我们不必像那样执行肮脏的黑客......
由于谷歌也重定向到最近的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是pi-hole on DSM tutorial建议的端口)。